繁体   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