我正在尝试阅读InputStream
。我在下面写了代码
byte[] bytes = new byte[1024 * 32];
while (bufferedInStream.read(bytes) != -1) {
bufferedOutStream.write(bytes);
}
我不明白我在迭代中应该读取多少字节?该流包含保存在磁盘上的文件。
我读过here但我真的不理解这篇文章。
答案 0 :(得分:5)
假设你有一股水从管道进入浴缸。然后你用一个水桶从浴缸里取水,然后带着去你的花园给草坪浇水。洗澡是缓冲。当您穿过草坪时,缓冲区正在填满,所以当您返回时,有一个桶可供您重新使用。
如果浴缸很小,那么当你带着水桶走路时它会溢出,所以你会失水。如果你有一个大浴缸,那么它不太可能溢出。所以更大的缓冲区更方便。但当然,更大的浴室需要更多的钱,占用更多的空间。
程序中的缓冲区会占用内存空间。并且您不希望仅仅因为方便而占用缓冲区的所有可用内存。
通常在读取函数中,您可以指定要读取的字节数。所以,即使你有一个小缓冲区,你也可以这样做(伪代码):
const int bufsize = 50;
buf[bufsize];
unsigned read;
while ((read = is.read(buf, bufsize)) != NULL) {
// do something with data - up to read bytes
}
在上面的代码中,bufzise是MAXIMUM数据,用于读入缓冲区。
如果您的读取功能不允许您指定要读取的最大字节数,则需要提供足够大的缓冲区以接收尽可能大的读取量。
因此,最佳缓冲区大小是特定于应用程序的。只有应用程序开发人员才能知道数据的特征。例如,水流入浴槽的速度有多快。您可以负担多大的浴室尺寸(嵌入式应用程序),您可以多快地从浴缸中穿过花园并再次返回。
答案 1 :(得分:4)
取决于可用内存,文件大小和其他内容。你最好做一些测量。
PS:你的代码错了。 bufferedInStream.read(bytes)
可能无法填充所有缓冲区?但只是其一部分。此方法返回实际的字节数。
byte[] bytes = new byte[1024 * 32];
int size;
while ((size = bufferedInStream.read(bytes)) != -1) {
bufferedOutStream.write(bytes, 0, size);
}
答案 2 :(得分:1)
这是我的建议(假设我们只处理输入流,而不是如何写输出流):
List l1 = new ArrayList();
l1.add("A");
List l2 = new ArrayList();
l2.add("B");
Map<String, List<Object>> mp = new HashMap();
mp.put("1", l1);
mp.put("2", l2);
System.out.println(mp);
FileInputStream fileInputStream = new FileInputStream("filePath");
byte[] bytes = new byte[1024];
int size;
while ((size = fileInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, size);
}
byte[] bytes = new byte[1];
BufferedInputStream bufferedInputStream =
new BufferedInputStream(fileInputStream("filePath"))
int size;
while ((size = bufferedInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, size);
}
byte[] bytes = new byte[1];
BufferedInputStream bufferedInputStream =
new BufferedInputStream(fileInputStream("filePath"), 16048)
int size;
while ((size = bufferedInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, size);
}
答案 3 :(得分:0)
你基本上有一个你指定长度的字节容器(1024 * 32)
然后,inputStream将尽可能多地填充,可能是整个迭代中的完整容器迭代,直到它到达文件末尾时它只填充剩余的字节,并在下一次迭代时返回-1(它是一个不能读什么)
所以你基本上是以1024 * 32字节大小的块从输入到输出进行复制和粘贴
希望它能帮助您理解代码
顺便说一句,最后一次迭代,如果输入流小于1024 * 32,输出将不仅接收文件的最后部分,而且还接收前一次迭代内容的重复,而不是填充它的字节最后一次迭代。
答案 4 :(得分:0)
我们的想法是不使用缓冲的输入流一次读取整个文件内容。您使用缓冲的输入流来读取bytes []数组大小的字节数。您使用读取的字节,然后继续从文件中读取更多字节。因此,您无需知道文件大小即可阅读。
这篇文章会更有帮助,因为它解释了为什么你应该用缓冲的输入流包装fileinputstream
Why is using BufferedInputStream to read a file byte by byte faster than using FileInputStream?