问题描述
我想以两种不同的方式从客户端的输入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());
}
1楼
正如 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);
}
2楼
好的,我不再需要Scanner
和 InputStream
了。
我可以通过DataOutputStream
(使用writeUTF(String)
和write(byte[], int, int)
)发送文本和文件。
这确实非常有效,并且大大简化了我的代码。
不要说这太可疑了!
如果您拥有Socket
,有时您需要以两种或三种不同的方式使用InputStream
。
而且我不想使用两个套接字。