《Java编程思想》读书笔记(八)

Author Avatar
wshunli 12月 05, 2017
  • 在其它设备中阅读本文章

《Java编程思想》读书笔记 —— Java I/O 系统。

第18章 Java I/O 系统

File 类

File 类不仅仅可以代表一个特定文件的名称,还可以代表一个目录下的一组文件的名称。

输入与输出

Java 中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节。
Java I/O 中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据,而字符流主要用于处理文本字符等类型的输入输出。

1.字节输入流 InputStream

输入流 InputStream 负责从各种数据/文件源产生输入,输入源包括:字节数组,字符串,文件,管道,一系列其他类型的流,以及网络连接产生的流等等。

常用字节输入流的主要类型:

(1).ByteArrayInputStream 字节数组输入流:

主要功能:允许内存缓存作为输入流。

ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read() 方法要提供的下一个字节。

注意:关闭 ByteArrayInputStream 无效,该类中的方法在关闭此流之后仍可被调用,而不会产生任何的 IOException。

(2).FileInputStream 文件输入流:

主要功能:从文件系统中的某个文件获得输入字节,用于读取诸如图像数据子类的原始字节流。若要读取字符流,请使用 FileReader。

(3).PipedInputStream 管道输入流:

主要功能:和管道输出流一起构成一个输入输出的管道,是管道的数据输入端。

管道输入流应该连接到管道输出流,管道输入流提供要写入管道输出流的所有数据字节。通常,这些数据有某个线程从PipedInputStream对象中读取,并有其他线程将其写入到相应的 PipedOutputStream 对象中。

注意:不建议 PipedInputStream 和 PipedOutputStream 对象使用单线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可以在缓冲区限定范围内将读操作和写操作分离开,如果先连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。

(4).SequenceInputStream 顺序输入流:

重要功能:将两个或多个输入流对象转换为一个单个输入流对象。

SequenceInputStream 表示其他输入流的逻辑串联关系,它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,以此类推,直到到达包含的最后一个输入流的文件末尾为止。

(5).FilterInputStream 过滤输入流:

主要功能:包含其他一些输入流,将这些被包含的输入流用作其基本数据源,它可以直接传输数据或者提供一些额外的功能。

常用的 FilterInputStream 是DataInputStream 数据输入流,主要用于允许程序以与机器无关的方式从底层输入流中读取 java 基本数据类型。
其常用的方法有 readInt(),readBoolean(),readChar()等等。

2.字节输出流 OutputStream

和字节输入流相对应,字节输出流负责字节类型数据想目标文件或设备的输出。常见的字节输出流如下:

(1).ByteArrayOutputStream 字节数组输出流:

主要功能:在内存中创建一个缓冲区,将接收到的数据放入该内存缓冲区中。

ByteArrayOutputStream 实现了一个输出流,其中的数据被写入一个 byte 数组中。缓冲区会随着数据的不断写入而自动增长,可使用 toByteArray() 和 toString() 方法获取数据。

注意:和 ByteArrayInputStream 类似,关闭 ByteArrayOutputStream 也是无效的,此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。

(2).FileOutputStream 文件输出流:

主要功能:将数据写入到指定文件中。

文件输出流是用于将数据写入 File 或 FIleDescriptor 的输出流,用于写入诸如图像数据之类的原始字节流,若要写入字符流,请使用 FileWriter。

(3).PipedOutputStream 管道输出流:

主要功能:连接管道输入流用来创建通信管道,管道输出流是管道数据输出端。

(4).FilterOutputStream 过滤输出流:

主要功能:用于将已存在的输出流作为其基本数据接收器,可以直接传输数据或提供一些额外的处理。

常用的 FIlterOutputStream 是 DataOutputStream 数据输出流,它允许程序以适当的方式将 java 基本数据类型写入输出流中。
其常用方法有writeInt(intV),writeChar(int v),writeByte(String s)等等。

3.字符流

Java 中得字节流只能针对字节类型数据,即支持处理8位的数据类型,由于 java 中的是 Unicode 码,即两个字节代表一个字符,于是在 JDK1.1 之后提供了字符流 Reader 和 Writer。

字符流相关常用类如下:

(1).Reader:

用于读取字符串流的抽象类,子类必须实现的方法只有reader(char[],int, int)和close()。

(2).InputStreamReader:

是将字节输入流转换为字符输入流的转换器,它使用指定的字符集读取字节并将其解码为字符。即:字节——>字符。

它使用的字符集可以有名称指定或显式给定,也可以使用平台默认的字符集。

(3).Writer:

用于写入字符流的抽象类,子类必须实现的方法只有write(char[],int, int)和close()。

(4).OutputStreamWriter:

是将字符输出流转换为字节输出流的转换器,它使用指定的字符集将要写入流的字符编码成字节。即:字符——>字节。

I/O 流的典型使用方式

1、缓冲输入文件

import java.io.*;

public class BufferedInputFile {
  // Throw exceptions to console:
  public static String
  read(String filename) throws IOException {
    // Reading input by lines:
    BufferedReader in = new BufferedReader(
      new FileReader(filename));
    String s;
    StringBuilder sb = new StringBuilder();
    while((s = in.readLine())!= null)
      sb.append(s + "\n");
    in.close();
    return sb.toString();
  }
  public static void main(String[] args)
  throws IOException {
    System.out.print(read("BufferedInputFile.java"));
  }
} /* (Execute to see output) *///:~

2、基本的文件输出

import java.io.*;

public class BasicFileOutput {
  static String file = "BasicFileOutput.out";
  public static void main(String[] args)
  throws IOException {
    BufferedReader in = new BufferedReader(
      new StringReader(
        BufferedInputFile.read("BasicFileOutput.java")));
    PrintWriter out = new PrintWriter(
      new BufferedWriter(new FileWriter(file)));
    int lineCount = 1;
    String s;
    while((s = in.readLine()) != null )
      out.println(lineCount++ + ": " + s);
    out.close();
    // Show the stored file:
    System.out.println(BufferedInputFile.read(file));
  }
} /* (Execute to see output) *///:~

参考资料
1、Java 编程思想(六)Java I/O - Invoker’s Tower - CSDN博客
http://blog.csdn.net/kingcat666/article/details/78027078
2、java基础学习总结——流 - 孤傲苍狼 - 博客园
http://www.cnblogs.com/xdp-gacl/p/3634409.html
3、《Java编程思想》学习笔记11——Java I/O - CSDN博客
http://blog.csdn.net/chjttony/article/details/6966246
4、Java编程思想 第十八章 Java I/O系统 - CSDN博客
http://blog.csdn.net/liuyesuifen/article/details/52760482
5、java-InputStream与OutputStream类型 - CSDN博客
http://blog.csdn.net/benjaminlee1/article/details/65437411

如果本文对您有所帮助,且您手头还很宽裕,欢迎打赏赞助我,以支付网站服务器和域名费用。 https://paypal.me/wshunli 您的鼓励与支持是我更新的最大动力,我会铭记于心,倾于博客。
本文链接:https://www.wshunli.com/posts/f697447c.html