gpt4 book ai didi

java - input.read 和 input.read(array, offset, length) 的区别

转载 作者:行者123 更新时间:2023-11-30 06:20:19 24 4
gpt4 key购买 nike

我正在尝试了解输入流的工作原理。以下代码块是从文本文件读取数据的多种方法之一:-

File file = new File("./src/test.txt");
InputStream input = new BufferedInputStream (new FileInputStream(file));
int data = 0;

while (data != -1) (-1 means we reached the end of the file)
{
data = input.read(); //if a character was read, it'll be turned to a bite and we get the integer representation of it so a is 97 b is 98
System.out.println(data + (char)data); //this will print the numbers followed by space then the character
}

input.close();

现在使用 input.read(byte, offset, length) 我有这段代码。我从here得到的

File file = new File("./src/test.txt");
InputStream input = new BufferedInputStream (new FileInputStream(file));
int totalBytesRead = 0, bytesRemaining, bytesRead;
byte[] result = new byte[ ( int ) file.length()];

while ( totalBytesRead < result.length )
{
bytesRemaining = result.length - totalBytesRead;
bytesRead = input.read ( result, totalBytesRead, bytesRemaining );
if ( bytesRead > 0 )
totalBytesRead = totalBytesRead + bytesRead;

//printing integer version of bytes read
for (int i = 0; i < bytesRead; i++)
System.out.print(result[i] + " ");

System.out.println();

//printing character version of bytes read
for (int i = 0; i < bytesRead; i++)
System.out.print((char)result[i]);
}

input.close();

我假设基于名称 BYTESREAD,此读取方法返回读取的字节数。在文档中,它说该函数将尝试读取尽可能多的内容。所以可能有它不会的原因。

我的第一个问题是:这些原因是什么?

我可以用一行代码替换整个 while 循环:input.read(result, 0, result.length)

我相信这篇文章的创作者考虑过这一点。这与输出无关,因为在这两种情况下我得到相同的输出。所以必须有一个原因。最后一个。这是什么?

最佳答案

documentation of read(byte[],int,int说它:

  • 读取最多 len 个字节的数据。
  • 尝试读取多达len个字节
  • 可以读取较小的数字

由于我们正在处理硬盘中的文件,因此可以合理地预期尝试 将读取整个文件,但是input.read(result, 0 , result.length) 不能保证读取整个文件(文档中的任何地方都没有说)。当未记录的行为发生变化时,依赖未记录的行为是错误的来源。

例如,文件流在其他 JVM 中的实现方式可能不同,某些操作系统可能会限制您一次可以读取的字节数,文件可能位于网络中,或者您以后可能会使用该文件带有流的另一个实现的一段代码,它的行为不是那样的。

或者,如果您正在读取数组中的整个文件,也许您可​​以使用 DataInputStream.readFully

关于 read() 的循环,它每次读取一个字节。如果您正在读取大量数据,这会降低性能,因为每次调用 read() 都会执行多项测试(流是否结束?等),并且可能会向操作系统询问一个字节。由于您已经知道需要 file.length() 字节,因此没有理由不使用其他更高效的形式。

关于java - input.read 和 input.read(array, offset, length) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21955069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com