当前位置: 首页 > 知识库问答 >
问题:

如何决定从inputstream读取多少字节?

常永长
2023-03-14

我试图从一个InputStream读取。我写了下面的代码

byte[] bytes = new byte[1024 * 32];
                while (bufferedInStream.read(bytes) != -1) {
                    bufferedOutStream.write(bytes);
                }

我不明白的是我应该在一次迭代中读取多少字节?流包含保存在磁盘上的文件。

我在这里读过,但我并不真正理解这篇文章。

共有3个答案

巫新知
2023-03-14

下面是我的建议(假设我们只处理输入流,而不是如何写入输出流):

  1. 如果您的用例对高读性能没有任何要求,请继续使用FileInputStream。例如:
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);
}
byte[] bytes = new byte[1024];
BufferedInputStream bufferedInputStream = 
                       new BufferedInputStream(fileInputStream("filePath"), 16048)
int size;
while ((size = bufferedInputStream.read(bytes)) != -1) {
    outputStream.write(bytes, 0, size);
}
易俊友
2023-03-14

这取决于可用内存、文件大小和其他内容。你最好测量一下。

附言:你的代码错了<代码>缓冲流。读取(字节)可能无法填充所有缓冲区,但只能填充部分缓冲区。此方法返回实际字节数作为结果。

byte[] bytes = new byte[1024 * 32];
int size;
while ((size = bufferedInStream.read(bytes)) != -1) {
    bufferedOutStream.write(bytes, 0, size);
}
慕容雅珺
2023-03-14

假设你有一股水流从水管流入浴缸。然后你用一个水桶从浴缸里取水,然后把水带到你的花园里浇灌草坪。浴缸是缓冲液。当你走在草坪上时,缓冲区已经满了,所以当你回来的时候,有一桶水要你再拿。

如果浴缸很小,那么当你拿着水桶走路时,它可能会溢出,因此你会失水。如果你有一个巨大的浴缸,那么它不太可能溢出。因此,更大的缓冲区更方便。但当然,一个更大的浴缸要花更多的钱,占用更多的空间。

程序中的缓冲区会占用内存空间。而且,您不希望仅仅因为方便就占用缓冲区的所有可用内存。

一般来说,在你的读取函数中,你可以指定要读取多少字节。所以即使你有一个小缓冲区,你也可以这样做(伪代码):

const int bufsize = 50;
buf[bufsize];
unsigned read;
while ((read = is.read(buf, bufsize)) != NULL) {
   // do something with data - up to read bytes
}

在上面的代码中,bufzise是要读入缓冲区的最大数据量。

如果read函数不允许指定要读取的最大字节数,则需要提供足够大的缓冲区,以接收最大可能的读取量。

因此,最佳缓冲区大小是特定于应用程序的。只有应用程序开发人员才会知道数据的特性。水流入浴缸的速度有多快。你能买得起什么尺寸的浴缸(嵌入式应用程序),你能多快地从浴缸里提着桶穿过花园再回来。

 类似资料:
  • 问题内容: 我正在尝试编写一个读取HTTP请求和响应并对其进行解析的类。由于标题是普通文本,因此似乎最容易使用 BufferedReader 和 readLine 方法读取它们。这显然不会对数据主体起作用,因为它可能是二进制的,所以我想在读取头之后切换到读取原始字节。 现在,我正在做这样的事情: 问题是 BufferedReader 正在提前读取并吞噬流中的所有二进制数据,然后才有机会使用Bins

  • 问题内容: 我已经创建了可执行的jar文件(使用Eclipse),在jar中包含一组图像(.png)文件。所以我添加了一个源文件夹,其中所有图像都位于项目的文件夹中。代码必须访问这些文件才能使用创建BufferedImage 较早前,为了获得我使用的路径 在执行jar时,它抛出错误 URI不是分层的 所以现在我正在使用 但是如何使ImageIO从Inputstream读取?我试过如下 抛出错误 I

  • 问题内容: 在一个项目上,我通过一个类似于控制台的小窗口运行Java应用程序。由于这里有一个很棒的社区,我设法通过从流程输出数据来解决问题,但是由于没有输入流,我运行的命令行应用程序将不断出错。 基于该线程中最后一个有用的答复,我想我将以类似的方式实现该实现,但是在javadocs中以及整个google和互联网中寻找某个类,该类确实没有发现任何解释方法。 因此,我需要一些链接,示例,教程,示例代码

  • 我发现其他人也有同样的问题,他们的问题通过在InputStreamReader构造函数中指定UTF-8来解决: 以UTF-8形式读取InputStream 这对我不起作用,我也不知道为什么。无论我尝试什么,我总是得到转义的unicode值(斜杠-U+十六进制),而不是实际的语言字符。我在这里做错了什么?提前道谢! 请注意:这不是字体问题。我之所以知道这一点,是因为如果我对同一个文件使用Resour

  • 问题内容: 我已经在一个类的单个方法中初始化了InputStream,并将其传递给下一个方法进行处理。InputStream本质上封装了CSV文件以进行处理。 另一个方法调用传入同一个InputStream的2个不同方法,一个用于检索标头,另一个用于处理内容。该结构如下所示: 我在这里做错什么了吗?有什么方法可以在不同的方法调用之间重用InputStream。 我正在提出可以模仿以下问题的完整程序

  • 问题内容: 我必须使用SFTP从ZIP存档(只有一个文件,我知道它的名称)中获取文件内容。我唯一拥有的是ZIP的。大多数示例说明如何使用以下语句获取内容: 但是正如我所说,我的本地计算机上没有ZIP文件,也不想下载它。是够看了? UPD: 这是我的方法: 问题答案: 好吧,我已经做到了: 它可以帮助我阅读ZIP的内容而无需写入另一个文件。