Java输入输出流
java.io 包有两种流。一种是面向字符的流,一种是面向字节的流。
字符流的读写单位是字符,并且只能处理字符类型的数据。
字节流的读写单位是字节(8bit),能处理所有类型的数据(图片、视音频…)。
字符流中的输入主要使用 Reader 类实现,输出主要使用 Writer 类实现。
字节流中输入数据使用 InputStream ,输出使用 OutputStream 。
当然,无论是字符流还是字节流,它们的子类都可以分为两大类:
- 节点流: 从数据源读入数据/往目的地写入数据。
- 处理流: 对数据执行某种处理。
面向字符的流
我们先来探讨这么一个概念:“标准输入输出流”。那么什么是标准输入输出流呢?
我们已经熟悉到不能再熟悉了,它呢,对应的是键盘和屏幕,下面简要概述:
- System 类的静态成员变量
- System.in
- System.out
- System.err
- printf 方法
- Scanner
贼强,下面看主要内容:
面向字符的抽象流类有两个。一个是 Reader,另一个是 Writer 。
先谈 Writer ,即写文本文件。看下面代码:
import java.io.*;
public class FileWriterTest {
public static void main(String[] args) throws IOException{
String fileName = "Hello.txt";
FileWriter writer = new FileWriter(fileName);
writer.write("Hello!\n");
writer.write("This is my first text file.\n");
writer.write("Bye");
writer.close();
}
}
结果如下:
这个 Hello.txt 文件会写在当前工作空间。这里有一个问题:代码中有 \n 换行符,但是打开该文件却发现并没有换行,这是为什么?
这是因为 \n 在不同平台的解释会不一样,所以没有得到我们想要的结果也是很正常的事情。上面这个代码并没有达到跨平台的目的。
为了达到跨平台的目的,我们要学习一个叫做 BufferedWriter 的类。在 BufferedWriter 下进行缓冲,可以提高效率。
BufferedWriter 和 FileWriter 类都用于输出字符流,包含的方法几乎是一样的。但 BufferedWriter 多提供了一个 newLine() 的方法用于换行。(它是跨平台的,可以输出当前系统中正确的换行符)
改进代码如下:
import java.io.*;
public class BufferedWriterTest {