IO流的体系:
字节流 字符流
字节输入流 字节输出流 字符输入流 字符输出流
InputStream OutputStream Reader Writer (抽象类)
FileInputstream FileOutputStream FileReader Filewriter (实现类)
一、FileInputstream文件字节输入流的使用
作用:
以内存为基准,把磁盘文件中的数据按照字节的形式读入到内存中的流。就是按照字节读取文件数据到内存。
构造器:
public FileInputStream(File path) : 创建一个字节输入流管道与源文件对象接通。
public FileInputStream(String pathName) : 创建一个字节输入流管道与文件路径对接。
方法:
1. public int read() :每次读取一个字节返回,读取完毕会返回-1。一次一个字节读。
读取英文和数字没有问题,但是遇到中文会乱码,其会截断中文。
中文UTF-8占3个字节。
举例:
FileInputStream file = new FileInputStream(new File("src/test.txt"));
int ch = 0; //存储读取的字节
while ((ch = file.read()) != -1){
System.out.print((char)ch);
}
2. public int read(byte[] buffer) : 从字节输入流中读取字节到字节数组中去,
返回读取的字节数量,没有字节可读返回-1。
中文还是会乱码
举例:
FileInputStream file = new FileInputStream(new File("src/test.txt"));
byte []buffer = new byte[3]; //3个字节的读,定义一个字节数组
int len;//存储每次读取的字节数
while ((len = file.read(buffer)) != -1){
String rs = new String(buffer,0,len);
System.out.print(rs);
}
二、解决字节输入流读取中文内容输出乱码的问题
一个一个字节读取中文输出,一个一个字节数组读取中文输出均无法避免乱码。
如何实现读取可以避免乱码呢?
- 可以使用字符流。FileReader。
- 使用字节流的话,可以定义一个字节数组与文件的大小刚号一样大,然后全部读取全部字节数据再输出。适用于读取小文件。
File file = new File("src/test.txt");
FileInputStream fileInputStream = new FileInputStream(file);
int length = (int) (file.length());
byte []buffer = new byte[length];//获取文件大小
int len = fileInputStream.read(buffer);
String rs = new String(buffer);
System.out.println(rs);
JDK1.9后,java有自带API,readAllBytes()
File file = new File("src/test.txt");
FileInputStream fileInputStream = new FileInputStream(file);
byte[] bytes = fileInputStream.readAllBytes();
String rs = new String(bytes);
System.out.println(rs);
小结:字节流并不适合读取文本文件内容输出,读写文件内容建议使用字符流。