我知道将BufferedInpurStream包装在FileInputStream周围会使读取操作更快,但我想知道如何做到这一点。我看了BufferedInpurStream的源代码,得到了一些东西。这是我的理解
InputStream in = new BufferedInpurStream(new FileInputStream(filename));
int byteToRead;
while((byteToRead = in.read()) != -1)
当我做了这件事。read(),在内部,它将首先在缓冲区中一次读取字节块,然后从缓冲区中逐个读取每个字节,而不是从文件中读取(成本更高)。一旦缓冲区为空,它将再次用字节块填充它
而使用FileInputStream。read(),对文件中的每个字节逐个执行读取操作,这非常昂贵
这种理解正确吗?
是的。正如您所描述的,BufferedInputStream大大减少了每次从流中读取一个字节时进行的IO调用的数量(因为大多数read()调用都击中了缓冲区)。
通常,read(字节[]b)(或read(字节[]b,int off,int len))比read()更受欢迎,因为它可能具有一些IO性能优势。
如果使用read(byte[]b),只要使用相同的缓冲区大小,BufferedInputStream就没有任何实际优势。
void read(InputStream inputStream, int bufferSize) throws IOException
{
byte[] buffer = new byte[bufferSize];
int read;
while ((read = inputStream.read(buffer)) != -1)
{
// do some work
}
}
和
void read2(InputStream inputStream, int bufferSize) throws IOException
{
BufferedInputStream bis = new BufferedInputStream(inputStream, bufferSize);
try
{
byte[] buffer = new byte[bufferSize];
int read;
while ((read = bis .read(buffer)) != -1)
{
// do some work
}
}
finally
{
bis.close();
}
}
尝试阅读和阅读2。您会发现,只要使用适当的缓冲区大小,包装到BufferedInputStream并不会提高性能。(实际上,这会造成另一个计算成本…)
那么,你什么时候需要BufferedInputStream?以下是我的建议:
我正在编写一个代码,使用BufferedInputStream从用户处读取输入,但由于BufferedInputStream读取字节,我的程序只读取第一个字节并打印它。除了只读取第一个字节外,还有什么方法可以读取/存储/打印整个输入(将是整数)? 输出: [shadow@localhostcodechef]$java巨大输入测试5452 5
我在一个教程中看到,BufferedInputStream类本身中的int read(字节b[],int off,int len)使用read()方法读取数据。 所以我的问题是,正常模式和不使用BufferedInputStream和使用buffer有什么区别?缓冲区应该以块的形式读取字节以降低成本,但这里它是逐字节读取。
我读了这个问题:为什么使用BufferedInputStream逐个字节读取文件比使用FileInputStream更快?根据作者比更快,因为当方法在中调用时,它总是使用本地API进行系统调用,以便获取单个字节,而做同样的事情,但是它需要操作系统的字节块,并将它们存储在本地字段中,称为buf,该字段在BIS类中声明,然后当读取()被称为BIS时,返回字节从数组。 我查看了BIS的代码,特别是方法,
问题内容: 我试图使用FileInputStream将文件读入数组,而一个〜800KB的文件花了大约3秒钟才能读入内存。然后,我尝试了相同的代码,只是将FileInputStream包装到BufferedInputStream中,这花费了大约76毫秒。为什么即使我仍在逐字节读取文件,使用BufferedInputStream逐字节读取文件的速度还是这么快?这是代码(其余代码完全无关)。请注意,这是
问题内容: 我想优化此代码: 事情是,我不知道如何读取bufferedReader的内容并将其复制到String中,比我上面的速度更快。我需要花费尽可能少的时间。谢谢 问题答案: 在循环中使用字符串连接是 在 经典的性能杀手(因为字符串是不可变的,整个越来越大的字符串被复制为每个连接)。改为这样做:
你好,虽然我读了很多其他答案,但我不明白如何关闭BufferedReader而不发送输入。这是我程序的阻塞部分: 当我从主线程调用“endListing()”时,程序终止--但不会在用户输入任何内容之前终止。我想让程序立即终止--如何启动这个BufferdReader(像BufferedReader一样创建(新的InputStreamReader(System.in))? 我试图在主线程中的这个线