[英]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.