簡體   English   中英

使用Scanner時使用InputStream進行讀取

[英]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正在查找文件中的相同位置。 無論如何最多只能同時使用ScannerInputStream讀取一個文件是可疑的。

考慮將代碼重構為僅使用其中一個。

如果要將文件的全部內容讀入單個String ,請考慮以下事項:

static String readFile(String path, Charset encoding) 
  throws IOException 
{
  byte[] encoded = Files.readAllBytes(Paths.get(path));
  return new String(encoded, encoding);
}

如何從文件內容創建Java字符串?

好的,我不再需要Scanner InputStream了。 我可以通過DataOutputStream (使用writeUTF(String)write(byte[], int, int) )發送文本和文件。 這確實非常有效,並且大大簡化了我的代碼。

不要說這太可疑了! 如果您擁有Socket ,有時您需要以兩種或三種不同的方式使用InputStream 而且我不想使用兩個套接字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM