使用 Scanner 时使用 InputStream 读取
Reading with InputStream while using Scanner
我想以两种不同的方式阅读客户的 inputstream
:
1: 在 inputstream
上使用 Scanner
来读取字符串。
2: 使用InputStream
对象本身读取带有缓冲区的文件。
首先,我想阅读一段文本,它给出了文件的名称和大小,在我的例子中是:"file:name:..."、"file:size:..."。
当我获得此信息时,InputStream
应该实际读取该文件。问题是,我尝试使用 InputStream
对象在“scanner.hasNextLine()
”循环中读取文件,但这会导致 InputStream.read()
方法变为 return -1 或 EOS .我已将问题缩小到最小程度,因此您只需回答我这个问题:
为什么读取方法 return -1 在这里:
if (scanner.hasNextLine()) {
System.out.println(inputstream.read());
}
正如 Scanner.hasNextLine()
的 Oracle Documentation 所述,此方法 不会 推进 Scanner
。这意味着您可以一直用 Scanner
查看文件的第一行,同时推进 InputStream
。这意味着即使 Scanner
有下一行,但 InputStream
可能没有。您似乎正在使用 InputStream
.
离开文件末尾
如果不将 Scanner
与输入流一起推进,则无法知道 Scanner
正在查看文件中的相同位置。无论如何,用 Scanner
和 InputStream
同时读取一个文件充其量是可疑的。
考虑重构您的代码以仅使用其中之一。
如果您想将文件的全部内容读取到一个 String
中,请考虑:
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
和 How do I create a Java string from the contents of a file?
中的其他方法
好吧,我不再需要Scanner
和InputStream
了。我可以同时使用 DataOutputStream
(使用 writeUTF(String)
和 write(byte[], int, int)
)发送文本和文件。这确实非常有效并且大大简化了我的代码。
别说这有问题!如果您有 Socket
,有时您需要以两种或三种不同的方式使用 InputStream
。而且我不想使用两个套接字。
我想以两种不同的方式阅读客户的 inputstream
:
1: 在 inputstream
上使用 Scanner
来读取字符串。
2: 使用InputStream
对象本身读取带有缓冲区的文件。
首先,我想阅读一段文本,它给出了文件的名称和大小,在我的例子中是:"file:name:..."、"file:size:..."。
当我获得此信息时,InputStream
应该实际读取该文件。问题是,我尝试使用 InputStream
对象在“scanner.hasNextLine()
”循环中读取文件,但这会导致 InputStream.read()
方法变为 return -1 或 EOS .我已将问题缩小到最小程度,因此您只需回答我这个问题:
为什么读取方法 return -1 在这里:
if (scanner.hasNextLine()) {
System.out.println(inputstream.read());
}
正如 Scanner.hasNextLine()
的 Oracle Documentation 所述,此方法 不会 推进 Scanner
。这意味着您可以一直用 Scanner
查看文件的第一行,同时推进 InputStream
。这意味着即使 Scanner
有下一行,但 InputStream
可能没有。您似乎正在使用 InputStream
.
如果不将 Scanner
与输入流一起推进,则无法知道 Scanner
正在查看文件中的相同位置。无论如何,用 Scanner
和 InputStream
同时读取一个文件充其量是可疑的。
考虑重构您的代码以仅使用其中之一。
如果您想将文件的全部内容读取到一个 String
中,请考虑:
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
和 How do I create a Java string from the contents of a file?
中的其他方法好吧,我不再需要Scanner
和InputStream
了。我可以同时使用 DataOutputStream
(使用 writeUTF(String)
和 write(byte[], int, int)
)发送文本和文件。这确实非常有效并且大大简化了我的代码。
别说这有问题!如果您有 Socket
,有时您需要以两种或三种不同的方式使用 InputStream
。而且我不想使用两个套接字。