目录
文件字节输入流:每次读取多个字节
用到之前介绍过的常用方法:
实例演示
需求:用每次读取多个字节的方法读出File文件的内容
java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class FileInputStreamTest2 {
public static void main(String[] args) throws Exception {
//1.创建一个字节输入流对象代表字节输入流管道与源文件接通。
InputStream is = new FileInputStream("HelloWorld\\src\\file.txt");
//2.开始读取文件中的字节数据:每次读取多个字节。
//public int read(byte b[]) throws IoException
//每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回-1
byte[] buffer = new byte[3];
int len = is.read(buffer);
String rs = new String(buffer);
System.out.println(rs);
System.out.println("当前读取的字节数量:" + len);
//目标文件有5个字节,需要再读取一次
//注意:读取多少,倒出多少
int len2 = is.read(buffer);
String rs2 = new String(buffer,0,len2);
System.out.println(rs2);
System.out.println("当前读取的字节数量:" + len2);
int len3 = is.read(buffer);
System.out.println(len3); //-1
is.close(); //关闭流
}
}
运行结果:
使用循环改造一下
java
package user.IOTestOne;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class FileInputStreamTest2 {
public static void main(String[] args) throws Exception {
//1.创建一个字节输入流对象代表字节输入流管道与源文件接通。
InputStream is = new FileInputStream("HelloWorld\\src\\file.txt");
//使用循环
byte[] buffer = new byte[3];
int len; //记住每次读取了多少个字节
while((len = is.read(buffer)) != -1){
//注意:读取多少,倒出多少
String rs = new String(buffer,0,len);
System.out.println(rs);
}
//性能得到了明显的提升
//但是这种方案也不能避免读取汉字输出乱码的问题
is.close(); //关闭流
}
}
运行结果:
注意事项
- 使用FilelnputStream每次读取多个字节,读取性能得到了提升,但读取汉字输出还是会乱码。
使用字节流读取中文,如何保证输出不乱码,怎么解决?
- 定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。
文件字节输入流:一次读取完全部字节
方式一
自己定义一个字节数组与被读取的文件大小一样大,然后使用该字节数组,一次读完文件的全部字节。
方法名称 | 说明 |
---|---|
public int read(byte[] buffer) | 每次用一个字节数组去读取,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1. |
注意:文件存于硬盘中,硬盘的大小是极大的,文件的大小也可能会很大;但是我们定义的数组实际上存储于内存中,内存是很小的,无法给数组定义很大的长度;因此,这个方法只适合读取不那么大的文件。
选取案例还是那个File文件
java
package user.IOTestOne;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class FileInputStreamTest3 {
public static void main(String[] args) throws Exception{
//1.创建一个字节输入流管道与源文件接通
InputStream is = new FileInputStream("HelloWorld/src/file.txt");
//2.准备一个字节数组,大小与文件的大小正好一样大。
File f = new File("HelloWorld/src/file.txt");
long size = f.length();
byte[] buffer = new byte[(int) size];
int len = is.read(buffer);
System.out.println(new String(buffer));
System.out.println("文件大小:" + size + "字节");
System.out.println(len);
is.close();
}
}
运行结果:
方式二
- Java官方为lnputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回。
方法名称 | 说明 |
---|---|
public byte[] readAllBytes()throws IOException | 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回 |
java
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class FileInputStreamTest3 {
public static void main(String[] args) throws Exception{
//1.创建一个字节输入流管道与源文件接通
InputStream is = new FileInputStream("HelloWorld/src/file.txt");
byte[] buffer = is.readAllBytes(); //JDK8 之后新增的方法
System.out.println(new String(buffer));
is.close();
}
}
运行结果:
注意事项
直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?
- 如果文件过大,创建的字节数组也会过大,可能引起内存溢出。
其实,读写文本内容本适合用字符流。
字节流适合做数据的转移,如:文件复制等。
下篇就开始介绍字符流。
END
学习自:黑马程序员------Java课程