使用 Scanner 时使用 InputStream 读取

Reading with InputStream while using Scanner

我想以两种不同的方式阅读客户的 inputstream

1: 在 inputstream 上使用 Scanner 来读取字符串。

2: 使用InputStream 对象本身读取带有缓冲区的文件。

首先,我想阅读一段文本,它给出了文件的名称和大小,在我的例子中是:"file:name:..."、"file:size:..."。

当我获得此信息时,InputStream 应该实际读取该文件。问题是,我尝试使用 InputStream 对象在“scanner.hasNextLine()”循环中读取文件,但这会导致 InputStream.read() 方法变为 return -1 或 EOS .我已将问题缩小到最小程度,因此您只需回答我这个问题:

为什么读取方法 return -1 在这里:

if (scanner.hasNextLine()) {        
    System.out.println(inputstream.read());
}

正如 Scanner.hasNextLine()Oracle Documentation 所述,此方法 不会 推进 Scanner。这意味着您可以一直用 Scanner 查看文件的第一行,同时推进 InputStream。这意味着即使 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);
}

How do I create a Java string from the contents of a file?

中的其他方法

好吧,我不再需要ScannerInputStream了。我可以同时使用 DataOutputStream(使用 writeUTF(String)write(byte[], int, int))发送文本和文件。这确实非常有效并且大大简化了我的代码。

别说这有问题!如果您有 Socket,有时您需要以两种或三种不同的方式使用 InputStream。而且我不想使用两个套接字。