Java基础 -- IO流
Java基础 -- IO流
Java中流可以理解为数据的序列:输入流用于从origin侧读取数据;输出流用于向destination侧写入数据。换而言之,流是用于读或写操作的数据流。
IO流
在Java中执行流操作包括两种方式:字节流和字符流。
对于IO流所涵盖的内容,此处借用菜鸟教程中的图片:

本文分别采用字节流和字符流实现对文件的写入和读取操作。值得一提的是:文件输入流是针对当前程序而言的,用于从文件读取数据;同理,文件输出流用于向文件写入数据。
字节流
什么是Java中的字节流
Java中的字节流用于执行8位字节的输入和输出操作,以stream结尾。Java字节流逐字节处理数据,是用于处理二进制文件等原始数据。
字节流操作常用类是FileInputStream和FileOutputStream,FileInputStream用于从源文件读取数据,FileOutputStream用于向目标文件写入数据。
文件输出字节流
当前程序通过文件输出字节流,向文件写入字节
/**
* 向文件写入数据:输出数据到文件,文件是输出方
* 文件输出字节流
*/
private static void writeStreamToFile() throws IOException {
final FileOutputStream outputStream = new FileOutputStream(file);
byte[] bytes = {12, 23, 34, 56};
for (int i=0; i<bytes.length; i++) {
outputStream.write(bytes[i]);
}
outputStream.close();
}
文件输入字节流
当前程序通过文件输入字节流,从文件中读取字节
/**
* 从文件读取数据:从文件读取数据,文件是输入方
* 输入字节流
*/
private static void readStreamFromFile() throws IOException {
final FileInputStream inputStream = new FileInputStream(file);
final int size = inputStream.available();
for (int i=0; i<size; i++) {
System.out.println(inputStream.read());
}
inputStream.close();
}
字符流
什么是Java中的字符流
Java中使用Unicode存储字符,Java中字符流用于逐字符读/写数据,执行16位Unicode的输入和输出,字符流以Reader和Writer结尾。
Java中常见的字符流类是FileReader和FileWriter,FileReader内部使用FileInputStream(属性)实现,FileWriter内部使用FileOutputStrem(属性)实现。
文件输出字符流
/**
* 使用OutputStreamWriter向文件写入,解决保存字节时存在的显示乱码
* 输出字符流
*/
private static void writeCharacterToFile() throws IOException {
// 构建FileOutputStream对象,文件不存在会自动创建
final FileOutputStream outputStream = new FileOutputStream(file);
final OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
// 写入到缓存区
writer.append("中文输入");
writer.append("\r\n");
writer.append("English");
// 刷新缓存区
writer.flush();
// 关闭输出流,同时会将缓存区中的数据写入文件
writer.close();
outputStream.close();
}
文件输出字符流是对文件输出字节流的包裹,同时指定文件输出字符流采·用的编码格式:UTF-8
文件输入字符流
/**
* 使用InputStreamReader从文件读取,解决乱码
* 输入字符流
*/
private static void readCharacterFromFile() throws IOException {
// 构建FileInputStream对象
final FileInputStream inputStream = new FileInputStream(file);
final InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
// 读取文件内容
final StringBuilder builder = new StringBuilder();
while(reader.ready()) {
// 将char追加到StringBuilder对象中
builder.append((char) reader.read());
}
// 输出内容
System.out.println(builder.toString());
// 关闭流
reader.close();
inputStream.close();
}
文件输入字符流是对文件输入字节流的包裹,同时指定与上述文件输出字符流一致的编码格式:UTF-8
FileWriter与FileReader
FileWriter
FileWriter继承OutputStreamWriter,默认使用编码方式UTF-8:
/**
* 覆盖写入文件
* @param file
* @throws IOException
*/
private static void writeToFile(String file) throws IOException {
final FileWriter writer = new FileWriter(file);
for (int i=1; i<=10; i++) {
writer.append("This is the message from guest " + i + "\n");
writer.append("本消息来自于客人 " + i + "\n");
}
writer.flush();
writer.close();
}
/**
* 追加写入文件
* @param file
* @throws IOException
*/
private static void appendToFile(String file) throws IOException {
final FileWriter writer = new FileWriter(file, true);
for (int i=1; i<=10; i++) {
writer.append("This is the message from guest " + i + "\n");
writer.append("本消息来自于客人 " + i + "\n");
}
writer.flush();
writer.close();
}
FileReader
FileReader继承InputStreamReader,默认使用编码方式UTF-8
/**
* 从文件读取数据
* @param file
* @throws IOException
*/
private static void readFromFile(String file) throws IOException {
final FileReader reader = new FileReader(file);
final StringBuilder builder = new StringBuilder();
while (reader.ready()) {
builder.append((char) reader.read());
}
System.out.println(builder.toString());
reader.close();
}
JDK5之前控制台输入
多字符读取
JDK5之前程序获取console端数据输入,通过BufferedReader类实现,通过循环实现多次调用单个字符读写方法bufferedReader.reader()实现程序对于console端多字符的获取。
private static void consoleReadCharacters() throws IOException {
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("输入字符,按下'q'键退出");
char c;
do {
// read()用于读取单个字符输入
c = (char) br.read();
System.out.println(c);
} while (c != 'q');
}
字符串读取
JDK5之前程序获取console端数据输入,通过BufferedReader类实现
private static void consoleReadString() throws IOException {
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter lines of text");
System.out.println("Enter 'end' to quit");
String input;
do {
input = br.readLine();
System.out.println(input);
} while (!input.equals("end"));
}
字符流与字节流的区别
定义不同
字节流执行8位字节输入和输出的机制,基本单元为字节;
字符流执行16位Unicode输入和输出的机制,基本单元为Unicode码元。
字节流以Stream结尾;字符流以Writer和Reader结尾。
处理方式不同
字节流用于处理二进制数据,按字节处理,采用ASCII编码;实际上可以处理任意类型的数据,但是不支持直接写入或读取Unicode码元。
字符流采用Unicode编码,实际按照虚拟机的encode处理,需要进行字符集的转化;通常用于处理文本数据,支持写入和读取Unicode码元。
是否使用缓冲区
字节流默认不使用缓冲区,字符流使用缓冲区。

浙公网安备 33010602011771号