使用Scanner时使用InputStream进行读取

时间:2015-08-07 19:52:12

标签: java java.util.scanner inputstream

我想以两种不同的方式阅读客户[<CLIMutable>]

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

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

首先,我想阅读一个文本,它给出了文件的名称和大小,在我的例子中:&#34;文件:名称:...&#34;,&#34;文件:大小:...&#34 ;.

当我收到此信息时,InputStream应该实际读取该文件。问题是,我尝试使用InputStream对象读取&#34; scanner.hasNextLine()&#34; -loop中的文件,但这会导致InputStream方法返回-1或EOS。我已将问题调到最小,所以你只需回答我这个问题:

为什么read-method在这里返回-1:

InputStream.read()

2 个答案:

答案 0 :(得分:2)

作为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?

中的其他方法

答案 1 :(得分:0)

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

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