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

网络套接字和文件读取中的BufferedInputStream用例?

赫连泰宁
2023-03-14

关于BufferedInputStream的使用,我有几个问题:

首先,我听说BufferedInputStream可以显著提高性能,如果您从硬盘上逐字节读取数据的话。

>

ByteArrayOutputStream result = new ByteArrayOutputStream();

    try(FileInputStream fis = new FileInputStream(filePath)) {

        // Create some arbitrary buffer
        byte[] buffer = new byte[4098];

        int length;

        while ((length = fis.read(buffer)) != -1) {
            result.write(buffer, 0, length);
        }
    }

    return result.toByteArray();

在这里使用BufferedInputStream会被证明非常有用吗?

同样,BufferedInputStream在逐字节读取时是否仅在套接字中起作用,即逐字节读取是否仅对预加载缓冲区有用?

共有2个答案

杜苏燕
2023-03-14

非缓冲流从操作系统缓存一次读取数据k字节(k表示页面大小;操作系统只能读取操作系统页面大小的倍数,并且可以从磁盘读取磁盘块大小的倍数)(是否从磁盘读取取决于它是否已在操作系统缓存中)。另一方面,缓冲流读取缓冲区容量的块。因此,您可以节省宝贵的磁盘IO读取。缓冲区容量应该是页面大小的倍数,而页面大小应该是磁盘块大小的倍数。

尉迟禄
2023-03-14

如果我使用4098字节的数据块读取整个文件,那么使用FileInputStream还是BufferedInputStream会有显著的区别吗?

在本例中,BufferedInputStream可能没有什么不同。首先,您已经调用了FileInputStream。使用4098字节的缓冲区读取,该缓冲区将以4098字节的块获取数据。这就是从磁盘文件中合理获取数据所需的所有“缓冲分块”。

同样,BufferedInputStream在逐字节读取时是否仅在套接字中起作用,即逐字节读取是否仅对预加载缓冲区有用?

如果一次提取一个字节(从套接字或文件中),则使用BufferedInputStream包装流可能会有所不同。即使操作系统已经在内核中缓冲您的读取,每次读取一个字节也会导致切换到内核模式,以便为每次调用从内核的缓冲区中获取一个字节。这是低效的,也是使用BufferedInputStream的一个很好的理由。

 类似资料:
  • 我使用创建了一个服务器。之后,我使用创建了客户机,并连接到该服务器。 之后,我对InputStream做了“一些事情”,而OutputStream是从套接字对象中获取的。但是,我不太理解inputStream和outputStream。下面是我的简单代码: 结果将是:“Hello World”和“Hello StackOverflow”。 以下是服务器端代码: 我的问题是: > 当我使用时,我可以

  • 计算机网络基础 ip地址 为了使网络上的计算机能够彼此识别对方,每台计算机都需要一个IP地址以标识自己。 IPv4:32位,IPv6:64位 OSI七层参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 地址解析 地址解析是指将计算机的协议地址解析为物理地址,即MAC(Medium Access Control)地址,又称为媒体访问控制地址。通常,在网络上由地址解析协议(ARP)

  • socket_read和socket_recv之间有什么区别?我正在尝试使用PHP套接字,但使用socket_read时收到了以下警告: 请帮帮我!

  • 我在一个教程中看到,BufferedInputStream类本身中的int read(字节b[],int off,int len)使用read()方法读取数据。 所以我的问题是,正常模式和不使用BufferedInputStream和使用buffer有什么区别?缓冲区应该以块的形式读取字节以降低成本,但这里它是逐字节读取。

  • 问题内容: 这就是我到目前为止 我的代码存在问题,返回null。 当我打印对象的内容时,我得到的是标题部分 后面跟着一个空行以及许多带有不同字符的行,例如。 再次我的问题是函数返回null。 提前致谢。 问题答案: 为什么不想使用简单的HTTP URL从主机获取图像?我的意思是: 如果要使用普通套接字,则必须解析http响应并手动从http答复中提取数据:读/跳过标头,读取二进制数据并将其传递给(

  • 问题内容: 我已经使用创建了服务器。之后,我使用创建了Client ,并连接到该服务器。 之后,我对InputStream和OutputStream进行了“一些处理”,它们是从Socket Object中获取的。但是,我不太了解inputStream和outputStream。这是我的简单代码: 结果将是:“ Hello World”和“ Hello StackOverFlow”。 这是服务器端代