java - 读取 InputStream 字节并写入 ByteArrayOutputStream
问题描述
我有代码块从 InputStream 读取提到的字节数并使用 ByteArrayOutputStream 返回一个字节 []。当我将该 byte[] 数组写入文件时,文件系统上的结果文件似乎已损坏。谁能帮我找出下面代码块中的问题。
public byte[] readWrite(long bytes, InputStream in) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int maxReadBufferSize = 8 * 1024; //8KB
long numReads = bytes/maxReadBufferSize;
long numRemainingRead = bytes % maxReadBufferSize;
for(int i=0; i<numReads; i++) {
byte bufr[] = new byte[maxReadBufferSize];
int val = in.read(bufr, 0, bufr.length);
if(val != -1) {
bos.write(bufr);
}
}
if(numRemainingRead > 0) {
byte bufr[] = new byte[(int)numRemainingRead];
int val = in.read(bufr, 0, bufr.length);
if(val != -1) {
bos.write(bufr);
}
}
return bos.toByteArray();
}
解决方案
我对问题陈述的理解
从ByteArrayOutputStream中的给定InputStream中读取字节数。
最后,返回一个字节数组。
主要意见
做了大量工作以确保以 8KB 的块读取字节。
此外,最后剩余的奇数块被单独读取。还做了很多工作来确保我们从正确的偏移量中读取。
我的看法
除非我们正在读取一个非常大的文件(>10MB),否则我看不到读取 8KB 块的正当理由。
让 Java 库完成维护偏移量并确保我们不会读取超出限制的所有艰苦工作。例如:我们不必给出偏移量,只需一遍又一遍地执行inputStream.read(b),将读取下一个大小为 b.length 的字节数组。同样,我们可以简单地写入outputStream。
代码
public byte[] readWrite(long bytes, InputStream in) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[(int)bytes];
is.read(buffer);
bos.write(buffer);
return bos.toByteArray();
}
参考
推荐阅读
- ruby-on-rails - Sidekiq 工作陷入“忙碌”
- javascript - Firebase 网页抓取项目
- c# - 从 asp.net 中的代码中删除属性
- javascript - 对象可视化
- typescript - 我需要在 Typescript 中创建一个类的数组
- html - 角度过滤器和绑定 (ngModelChange)
- jenkins - Jenkins MultiBranch Pipeline - 检测到分支时自动应用触发器
- windows - 如何获取非windows系统的进程?
- php - 将复选框表单输入添加到后端 Wordpress 用户信息
- clojurescript - Reitit 在浏览器中直接导航到时无法识别路线