问题描述
我想以两种不同的方式从客户端的输入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 。
而且我不想使用两个套接字。