Java I/O流分为输入流输出流两大部分,任何自InputStream(字节输入流)和Reader(字符输入流)派生而来的类都含有read()基本方法,用来读取单个字节或一组字节数组。任何自OutputStream(字节输出流)和Writer(字符输出流)派生而来的类都含有writer()基本方法,用来写单个字节或一组字节数组。
字节输入输出流
字节输入流系列:
- PipedInputStream (从“管道”中获取一个字节输入流,用在多线程程序中)
- ByteArrayInputStream (从字节数组中获取一个字节输入流)
- FileInputStream (从文件中获取一个字节输入流)
- StringBufferInputStream (从String中获取一个字节输入流)
- SequenceInputStream (将多种字节输入流合并成一个字节输入流)
FilterInputStream装饰输入流系列:
- DataInputStream (将字节输入流装饰成可以直接输入基本类型的流)
- BufferedInputStream (将字节输入流装饰成缓冲流,防止每次读取都进行实际写操作)
- LineNumberInputStream (跟踪输入流的行号,已被弃用)
- PushbackInputStream (将字节输入流装饰成回推流,可以将最后一个读取的字节回退)
字节输出流系列:
- PipedOutputStream (将字节输出流的内容写入“管道”中,用在多线程程序中)
- ByteArrayOutputStream (将字节输出流的内容写入字节数组中)
- FileOutputStream (将字节输出流的内容写入文件中)
FilterOutputStream装饰输出流系列:
- DataOutputStream (将字节输出流装饰成可以直接写入基本类型的流)
- BufferedInputStream (将字节输出流装饰成缓冲流,防止每次发送数据时都进行实际写操作)
- PrintStream (用于产生格式化输出)
字符输入输出流
与字节输入输出流相比较,字符输入输出流是以字符为单位,而一个字符也就是一个Char单位,占两个字节即一个Unicode码元。
字符输入流系列:
- PipedReader (从“管道”中获取一个字符输出流,用在多线程程序中)
- CharArrayReader (从字符数组中获取字符输出流)
- FileReader (从文件中获取一个字符输出流)
- StringReader (从String中获取一个字符输出流)
- PushbackReader (为字符输入流添加回推功能,可以将最后一个读取的字符回退)
- BufferedReader (为字符输入流添加缓冲功能)
- LineNumberReader (跟踪字符输入流的行号)
转化输入流:
- InputStreamReader (将一个字节输入流转化为字符输入流)
字符输入流系列:
- PipedWriter (将字符输出流中的内容写入“管道”中,用在多线程程序中)
- CharArrayWriter (将字符输出流中的内容写入字符数组中)
- FileWriter (将字符输出流中的内容写入文件中)
- StringWriter (将字符输出流中的内容写入到String中)
- BufferedWriter(为字符输出流添加缓冲功能)
- PrintWriter (用于产生格式化输出)
转化输出流:
- OutputStreamWriter (将一个字节输出流转化为字符输出流)
注意事项:
- 字符输入输出流中的FilterXXX装饰器并没有什么意义,写出来只是充当占位符,方便用户理解。
- 可能有的小伙伴注意到在字符输入输出流中针对文件的流继承自字节字符转化流,我们查看其构造器代码就可以知道,这里其实还是使用了字节的文件流然后通过转化为字符流从而实现的字符文件流。
public FileWriter(String fileName) throws IOException { super(new FileOutputStream(fileName)); }
字节字符数组流和字节字符缓冲流的区别在哪里?
这两者都用到了相应的数组作为数据的存储区,但数组流只是将数据存入数组或者从数组中读取,而缓冲流将数据暂存在数组中,等到数组被存满或者被刷新缓冲时再将数组中的数据一次行写入。
因为缓冲流将数组作为数据或者数据的一部分的暂存区,所以在输入缓冲流中提供了readLine()方法,用于输出一整行字符串的内容。