[英]Reading with InputStream while using Scanner
我想以两种不同的方式从客户端的输入inputstream
中读取:
1:在输入inputstream
上使用Scanner
读取字符串。
2:使用InputStream
对象本身读取带有缓冲区的文件。
首先,我想阅读一个文本,该文本为我提供了File的名称和大小,在我的情况下为:“ file:name:...”,“ file:size:...”。
当我获得此信息时, InputStream
应该实际读取该文件。 问题是,我尝试使用InputStream
对象读取“ scanner.hasNextLine()
”循环中的文件,但这会导致InputStream.read()
方法返回-1或EOS。 我已将问题缩小到最小,因此您只需要回答以下问题即可:
为什么读取方法在这里返回-1:
if (scanner.hasNextLine()) {
System.out.println(inputstream.read());
}
正如Oracle Scanner.hasNextLine()
文档所述,此方法不会使Scanner
前进。 这意味着您可以在前进InputStream
同时,用Scanner
永久查看文件的第一行。 这意味着即使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);
}
好的,我不再需要Scanner
和 InputStream
了。 我可以通过DataOutputStream
(使用writeUTF(String)
和write(byte[], int, int)
)发送文本和文件。 这确实非常有效,并且大大简化了我的代码。
不要说这太可疑了! 如果您拥有Socket
,有时您需要以两种或三种不同的方式使用InputStream
。 而且我不想使用两个套接字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.