当前位置: 代码迷 >> java >> 使用Scanner时使用InputStream进行读取
  详细解决方案

使用Scanner时使用InputStream进行读取

热度:66   发布时间:2023-07-26 14:13:48.0

我想以两种不同的方式从客户端的输入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());
}

正如 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);
}

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

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

  相关解决方案