首先Java中IO流是用于文件的输入与输出的,输入是指将数据从本地磁盘文件中输入到JVM运行内存中,而输出则是将数据从JVM运行内存中输出到本地磁盘文件。
IO流分字节流与字符流:
1.字节流有FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream。
字节流可以通过在文件当中逐一读取数据所对应的ASCII码的二进制数(一个二进制数占一个字节)。
字节流读取中文与英文的区别:
1.读取中文时,每三个二进制数才可以确定一个中文与符号,而字节流每次仅仅读取一个字节,不能读取到完整的中文二进制数,所以所读出的数据在字符集中是找不到的,就产生了中文乱码问题。
2.英文中每一个字母与符号都是对应唯一的一个二进制数,所以在字节流读取过程中都是准确无误的。
示例代码:
package com.ioProject.Test01;
import java.io.*;
public class ioTest05 {
public static void main(String[] args) throws IOException {
File file = new File("untitled\\c.txt");
boolean newFile = file.createNewFile();
FileInputStream fis = new FileInputStream(file);
int ch;
while ((ch = fis.read()) != -1) {
System.out.print((char) ch);
}
fis.close();
}
}
//c.txt文件中的数据为Test
//最终输出的结果为Test
//后我将c.txt文件中数据换为测试
//最终输出结果为æµè¯
对于字节流会产生中文乱码问题,我们可以通过字符流来进行优化:
字符流有FileReader、BufferedReader、InputStreamReader、FileWriter、BufferedWriter、OutputStreamWriter。
字符流可以一次性读取多个二进制数,中文二进制数的补码以1开头,而英文二进制数的补码以0开头,在读取过程中若识别到以0开头的二进制数则只读取一个字节,若识别到以1开头的二进制数则一次读取多个(若使用的字符编码方案是GBK则读取2个,若使用的字符编码方案是utf-8则读取3个)。所以在进行输入与输出操作时,需注意保持字符编码方案一致,否则也会出现中文乱码问题。
下面对应的是字符流的构造函数,可以直接传入一个字符串路径或者File对象,同时可以传入一个字符编码格式(若不传入则默认为utf-8)。
示例代码:
package com.ioProject.Test01;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
public class ioTest06 {
public static void main(String[] args) throws IOException {
File file = new File("untitled\\c.txt");
boolean newFile = file.createNewFile();
FileReader fr = new FileReader(file, Charset.defaultCharset());
}
}