我想以两种不同的方式阅读客户[<CLIMutable>]
:
1:在inputstream
上使用Scanner
来阅读字符串。
2:使用inputstream
对象本身读取带缓冲区的文件。
首先,我想阅读一个文本,它给出了文件的名称和大小,在我的例子中:&#34;文件:名称:...&#34;,&#34;文件:大小:...&#34 ;.
当我收到此信息时,InputStream
应该实际读取该文件。问题是,我尝试使用InputStream
对象读取&#34; scanner.hasNextLine()
&#34; -loop中的文件,但这会导致InputStream
方法返回-1或EOS。我已将问题调到最小,所以你只需回答我这个问题:
为什么read-method在这里返回-1:
InputStream.read()
答案 0 :(得分:2)
作为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?
中的其他方法答案 1 :(得分:0)
好的,我不再需要Scanner
和 InputStream
了。我可以使用DataOutputStream
(writeUTF(String)
和write(byte[], int, int)
)同时发送文本和文件。这确实非常有效并且简化了我的代码。
不要说这很浪漫!如果您有Socket
,有时您需要以两种或三种不同的方式使用InputStream
。而且我不想使用两个套接字。