package cn.zhang.io;

 import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; /**
* 文件读取到字节数组,再从字节数组读取到文件
* 四个步骤
* 1、创建源
* 2、选择流
* 3、操作
* 4、释放资源
* @author zhang
*
*/
public class IOTest10 {
public static void main(String[] args) {
//指定文件源,获得该文件的字节数组
byte[] datas = fileToByteArray("very_nice_satellite_images_of_iran-wallpaper-2880x1620.jpg");//图片转为字节数组
byteArrayToFile(datas,"picture.jpg");//字节数组转为图片
} /**
* 1、文件读取到字节数组,以程序为中心
* 1)、文件到程序:
* 源:main方法中
* 流:InputStream、FileInputStream
* 操作:输入
* 释放资源:需要释放
* 程序到字节数组:
* 源:内部维护,自动创建一个字节数组
* 流:ByteArrayOutputStream,不能使用多态,使用ByteArrayOutputStream流中的toByteArray方法,返回字节数组
* 操作:输出
* 释放资源:不需要释放
* 2)、结果是获得一个字节数组
* @param filePath
* @return
*/
public static byte[] fileToByteArray(String filePath) {
//创建源与目的地
File src = new File(filePath);//获得文件的源头,从哪开始传入(源)
byte[] dest = null;//最后在内存中形成的字节数组(目的地)
//选择流
InputStream is = null;//此流是文件到程序的输入流
ByteArrayOutputStream baos= null;//此流是程序到新文件的输出流
//操作(输入操作)
try {
is = new FileInputStream(src);//文件输入流
baos = new ByteArrayOutputStream();//字节输出流,不需要指定文件,内存中存在
byte[] flush = new byte[1024*10];//设置缓冲,这样便于传输,大大提高传输效率
int len = -1;//设置每次传输的个数,若没有缓冲的数据大,则返回剩下的数据,没有数据返回-1
while((len = is.read(flush)) != -1) {
baos.write(flush,0,len);//每次读取len长度数据后,将其写出
}
baos.flush();//刷新管道数据
dest = baos.toByteArray();//最终获得的字节数组
return dest;//返回baos在内存中所形成的字节数组
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//释放资源,文件需要关闭,字节数组流无需关闭
if(null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
return null;
} /**
* 字节数组写出到新的文件
*1、字节数组读入程序中
* 源:传入的字节数组
* 流:ByteInputStream
* 操作:读入
* 释放资源:不需要
*2、程序写出到新的文件中
* 源:传入的新文件目的地
* 流:OutputStream FileOutputStream
* 操作:写出
* 释放资源:需要
* @param src
* @param filePath
*/
public static void byteArrayToFile(byte[] src,String filePath) {
//创建源
File dest = new File(filePath);//目的地,新文件
//src字节数组已经存在
//选择流
InputStream is = null;//ByteArrayInputStream的父类
OutputStream os = null;
//操作
try {
is = new ByteArrayInputStream(src);//字节数组与程序之间的管道
os = new FileOutputStream(dest);//程序与新文件之间的管道
//一样的字节数组缓冲操作
byte[] flush = new byte[1024*10];
int len = -1;
while((len = is.read(flush)) != -1) {
os.write(flush,0,len);
}
os.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(null != os) {//关闭文件流
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

IO流处理文件读取到字节数组,再从字节数组读取到文件,Java实现的更多相关文章

  1. Java基础知识强化之IO流笔记27:FileInputStream读取数据一次一个字节数组byte[ ]

    1. FileInputStream读取数据一次一个字节数组byte[ ]  使用FileInputStream一次读取一个字节数组: int read(byte[]  b) 返回值:返回值其实是实际 ...

  2. Java IO流操作(III)——File类&案例一:输出制定目录下所有java文件名(包含子目录)&案例二:删除指定的目录(包含子目录)

    1. File常用的构造 File file = new File("字符串路径"); File f = new File("D:\\a\\b.txt"); F ...

  3. Android—Socket中关闭IO流后导致Socket关闭不能再收发数据的解决办法

    以Socket发送数据为例: 发送数据时候要声明:DataOutputStream os = new DataOutputStream(socket.getOutputStream()); 最近开发遇 ...

  4. File类的特点?如何创建File类对象?Java中如何操作文件内容,什么是Io流Io流如何读取和写入文件?字节缓冲流使用原则?

    重难点提示 学习目标 1.能够了解File类的特点(存在的意义,构造方法,常见方法) 2.能够了解什么是IO流以及分类(IO流的概述以及分类) 3.能够掌握字节输出流的使用(继承体系结构介绍以及常见的 ...

  5. Java基础IO流 ,文件读取,由易至难

    最基础的读取文件 import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;imp ...

  6. Java中IO流文件读取、写入和复制

    //构造文件File类 File f=new File(fileName); //判断是否为目录 f.isDirectory(); //获取目录下的文件名 String[] fileName=f.li ...

  7. [19/04/01-星期一] IO技术_字节流分类总结(含字节数组(Array)流、字节数据(Data)流、字节对象(Object)流)

    一.字节流分类概括 -->1.ByteArrayInputStream /ByteArrayOutputStream(数组字节输入输出)        InputStream/OutputStr ...

  8. 文件和IO流

    摘要:本文主要介绍了Java的文件处理以及常用的IO流操作. 文件操作 概念 File是数据源(保存数据的地方)的一种,可以表示一个文件,也可以表示一个文件目录. File类只能对文件和文件夹进行创建 ...

  9. Java 基础(四)| IO 流之使用文件流的正确姿势

    为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是 IO 流? 想象一个场景 ...

随机推荐

  1. scanf与正则表达式的搭配及应用

    scanf与正则表达式的搭配及应用 正则其实我也学的不咋地,只会一点皮毛,正则最大的作用就是当输入流是一个字符串,我们能在输入的时候就滤掉无用信息,省去后期提取数值的步骤. 正则的语法我怕误人子弟,嘿 ...

  2. POJ 1458:Common Subsequence

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 41957   Accepted: 16 ...

  3. jQuery通过name获取值

    使用jQuery获取name="day"的input对象: 方法1 var dayObj=$('input[name="day"]'); for(int i=0 ...

  4. 女神说不能每张照片P的一样,所以朋友圈开三天可见,用Python一步解决

    大家好,我是小三十三,一个刚恰完午饭,正在用刷网页浪费生命的蒟蒻... 一堆堆无聊八卦信息的网页内容慢慢使我的双眼模糊,一个哈欠打出了三斤老泪,就在此时我看到了一张图片: ! 是谁!是谁把我女朋友的照 ...

  5. js加密(十三)zzxt.hee.gov.cn md5

    1. url: http://zzxt.hee.gov.cn/ 2. target: 登录加密 3. 简单分析: 这个应该很容易就能找到加密的js,直接拿出来就好. 4. js: /* * md5 * ...

  6. 实体映射-------AutoMapper

    现在有2个实体(A.B),2个实体中的部分字段是相同的,现在把A实体获取的值赋值给B实体,利用AutoMapper实体映射可以轻松解决 参考 实体中不同名称之间的映射可以这样写 Mapper.Init ...

  7. 干货分享:学术Essay写作流程及写作技巧详解

    Academic essay是指留学生作业中的一种,其范围非常广泛,可以是任何一种话题.而学术essay主要是指其中比较正式的.客观的话题,有明确的研究目的与研究对象.例如“Research on t ...

  8. Python安装bs4

    - 需要将pip源设置为国内源,阿里源.豆瓣源.网易源等 - windows (1)打开文件资源管理器(文件夹地址栏中) (2)地址栏上面输入 %appdata% (3)在这里面新建一个文件夹 pip ...

  9. 前端01 HTML5

    01工具使用 Sublime插件安装和使用 2Sublime插件安装和使用.pcf 3Sublime插件安装与卸载.pcf 4Sublime安装markdown插件.pcf 使用typora生成pdf ...

  10. Glusterfs volume 的三种挂载方式

    在上一篇中我们介绍了Glusterfs在CentOS7上的安装,并且提到Glusterfs client端有三种:Native client,NFS,Samba, 今天我们就来一起学习下这三种方式. ...