Java流式IO

1. 流式IO结构

  下图只给出了较为常用的IO流的类图结构

  Java的IO流主要分为两大类:字节流和字符流,字节流以InputStream和OutputStream为基础类,字符流以Reader和Writer为基础类。

2. 字节流

  字节流以InputStream和OutputStream为基础类,常用的子类流有:

  FileInputStream和FileOutputStream用于从文件读写二进制数据;

  FilterInputStream和FilterOutputStream即过滤流,过滤流可以嵌套基本二进制输入输出流或者其他过滤流,增强处理输入输出流的处理能力。其中BufferedInputStream和BufferedOutputStream流提供了读写缓冲的功能,DataInputStream和DataOutputStream提供了对字节流读写的更多支持(如:读写二进制整数等);

     ObjectInputStream和ObjectOutputStream用于读写对象,对象所属的类需要实现Serializable接口,现在更常用的方式应该是使用JSON格式来传递对象;

  读写二进制文件通常使用如下嵌套流的方式:

  new DataInputStream(new BufferedInputStream(new FileInputStream(new File(filename))));

  new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(filename))));

3.字符流

  字符流以Reader和Writer为基础类,常用的子类有:

  FileReader和FileWriter类用于从文件读写文本数据;

  BufferedReader和BufferWriter用于读写文本数据,提供了读写缓冲的功能,通常用于包装其他的字符输入输出流;

  BufferedReader类中常用的方法是readLine读入一行数据,然后使用String类的相关API处理,更常用的方式是使用java.util.Scanner类来对读字符流提供更多支持;

      PrintWriter类对写字符流提供了更多支持;

  读写文本文件通常使用如下嵌套流的方式:

  new BufferedReader(new FileReader(new File(...));

  new PrintWriter(new BufferedWriter(new FileWriter(new File(...))));

4. 字节流和字符流的转换

   字节流转换成字符流使用InputStreamReader:

  new BufferedReader(new InputStreamReader(inputStream));

   字符流转换成字节流使用OutputStreamWriter:

  new BufferedWriter(new OutputStreamWriter(outputStream));

5. ZIP文件输入输出流

  Java中提供了对zip压缩文件读写支持,相关类在java.util.zip包中。

  ZipInputStream类和ZipOutputStream分别继承成自java.io.FilterInputStream类和java.io.FilterOutputStream类,用于读写zip压缩文件。

  ZipEntry类用于表示zip文件中的一个条目,读写zip文件,首先创建ZipInputStream或者ZipOutputStream,然后使用getNextEntry方法获取zip文件中的每个被压缩的文件,依次处理,每个处理完成一个条目之后,调用closeEntry方法关闭当前条目,处理完整个zip文件后,调用close方法关闭整个zip文件。

  下面给出一个依次打印zip文件中所有文件内容的例子:

ZipInputStream zin = new ZipInputStream(new FileInputStream("test.zip"));
ZipEntry zipEntry;
Scanner scanner;

while( (zipEntry = zin.getNextEntry() ) != null )
{
    scanner = new Scanner(zin);
    System.out.println(zipEntry.getName());   //输出文件名称
    //输出文件内容
    while(scanner.hasNextLine())
    {
        System.out.println(scanner.nextLine());
    }
    zin.closeEntry();
}

zin.close();

参考资料 《Java核心技术》

原文地址:https://www.cnblogs.com/jqctop1/p/4734625.html