Java字节流详解:从基础到高级应用

导航
FileInputStream/FileOutputStream
ByteArrayInputStream/ByteArrayOutputStream
BufferedInputStream/BufferedOutputStream
DataInputStream/DataOutputStream
ObjectInputStream/ObjectOutputStream
序列化与反序列化
以字节为单位获取数据的流,称为字节流,它们都继承于InputStream/OutputStream抽象类。
常用的字节流有:
FileInputStream/FileOutputStream,文件字节流(节点流)
ByteArrayInputStream/ByteArrayOutputStream,字节数组流(节点流)
BufferedInputStream/BufferedOutputStream,字节缓存流(处理流)
DataInputStream/DataOutputStream,数据字节流(处理流)
ObjectInputStream/ObjectOutputStream,对象流(处理流)
下面分别介绍一下这五组字节流及用法。
FileInputStream/FileOutputStream
FileInputStream/FileOutputStream是最常用的文件字节流,当数据源为文件对象时,选择这个数据流进行处理。我们可以通过构造器快速了解它的操作数据类型:
public FileInputStream(File file)
public FileOutputStream(File file)
可以看到,这组数据流的操作对象为File类型。
关于数据流的操作,总是分为四个步骤:
1.指定数据源
2.选择合适的数据流
3.进行数据操作
4.关闭流,释放资源
来一个文件的拷贝实例,了解其用法:
public class FileStream {
public static void main(String[] args) {
//1.指定数据源
File in_scr = new File("a.txt"); // 输入数据为文件
File out_scr = new File("a-copy.txt"); // 输出数据也为文件
InputStream is = null;
OutputStream os = null;
try {
//2.选择合适的数据流
is = new FileInputStream(in_scr);
os = new FileOutputStream(out_scr);
//3.进行数据操作
byte[] flush = new byte[1024]; //字节流,数据以字节数组为单位
int len = -1;
while( (len = is.read(flush)) != -1 ) {
// for(int i=0;i // System.out.println(flush[i]); 可以将输入流直接打印出来观察 // } os.write(flush,0,len); } os.flush(); //将缓存内容输出 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { //4.关闭流,释放资源 //先打开的先关闭 try { if(is != null) { is.close(); } } catch (IOException e) { e.printStackTrace(); } try { if(os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } } } } 需要注意的点有: 1.flush为byte[]数组,与形参不同,数组传入的是地址,所以在is.read(flush)方法中操作flush,外面的flush也会变换,read方法就是给flush赋值的一个方法,并且有返回值:读取到的元素个数,未读到时返回-1。 2.输出流中是有缓存的,就是说当输出流的数据量到达一定程度,才会输出。所以在结尾,我们需要手动将未到达缓存量的数据输出,使用输出流的flush()方法。 ByteArrayInputStream/ByteArrayOutputStream ByteArrayInputStream/ByteArrayOutputStream,字节数组流,也是一个常用的节点流。当数据对象字节数组byte[ ]时,使用这种流进行操作。观察一下它们的构造器: public ByteArrayInputStream(byte buf[]) public ByteArrayOutputStream() 可以看到,输入流的操作对象未byte[ ]字节数组;输出流无参数,并不能直接将流中数据输出为文件等,但ByteArrayOutputStream有toString()等方法,来方便对输出流进行操作。 还是来一个文件的拷贝实例,了解其用法: public class ByteArrayStream { public static void main(String[] args) { //1.指定数据源 byte[] in_scr = new byte[] { -28, -67, -96, -26, -120, -111, -28, -69, -106 };//输入数据 ByteArrayInputStream bais = null; ByteArrayOutputStream baos = null; try { //2.选择合适的数据流 bais = new ByteArrayInputStream(in_scr); baos = new ByteArrayOutputStream(); //3.进行数据操作 byte[] flush = new byte[1024]; int len = -1; System.out.print("输入流:"); while ((len = bais.read(flush)) != -1) { for (int i = 0; i < len; i++) { System.out.print(flush[i]+","); //读取输入流 } baos.write(flush, 0, len); } System.out.println(); baos.flush(); //将缓存内容输出,到此,输出流的数据写入已完成 byte[] byteArray = baos