java - fileInputStream.available() 可以代替什么?
问题描述
在学习Java IO的时候,发现fileInputStream
有个availabl()
方法,可以等于读取本地文件时的文件大小。那么如果可以直接知道文件的大小,那么在需要读取整个文件的情况下,有必要用BufferedInputStream
它来装饰一下吗?像这样:
FileInputStream fileInputStream=new FileInputStream("F:\\test.txt");
byte[] data=new byte[fileInputStream.available()];
if (fileInputStream.read(data)!=-1) {
System.out.println(new String(data));
}
或者
BufferedReader bufferedReader=new BufferedReader(new
FileReader("F:\\test.txt"));
StringBuilder stringBuilder=new StringBuilder();
for (String line;(line=bufferedReader.readLine())!=null;){
stringBuilder.append(line);
}
System.out.println(stringBuilder.toString());
或者
BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream("F:\\test.txt"));
byte[] data=new byte[bufferedInputStream.available()];
if (bufferedInputStream.read(data)!=-1) {
System.out.println(new String(data));
}
这些方法的优缺点是什么?哪一个更好?谢谢。
解决方案
你对 的含义有误available()
。它返回您可以在不阻塞的情况下读取的可能字节数。从文档:
请注意,虽然 InputStream 的某些实现会返回流中的字节总数,但许多不会。使用此方法的返回值来分配旨在保存此流中所有数据的缓冲区是不正确的。
因此,如果要将流转换为字节数组,则应使用相应的库,例如IOUtils:
byte[] out = IOUtils.toByteArray(stream);
推荐阅读
- javascript - 为什么我的帖子中没有显示图像?
- java - 如何将按钮放置在线性布局(根视图)中包含的两个线性布局(嵌套视图)下方
- unity3d - 在组件 B 上执行任何事件之前,是否所有 Unity 事件都在组件 A 上执行
- python - 使用 AES 加密时的字节问题
- file-upload - 在vue js,元素ui上传组件中上传之前调整大小/压缩图像
- python-3.x - Python 3 - 当满足要求时,While 循环不会跳出循环
- laravel - Laravel 7外键约束格式不正确
- javascript - 如何验证表单中的电话号码:JavaScript
- javascript - 在第一行有行跨度的情况下,在表的第一行设置 css 样式 - 多表
- laravel - 404在laravel 6中找不到