【问题标题】:Reading with InputStream while using Scanner使用 Scanner 时使用 InputStream 读取
【发布时间】:2015-10-31 08:41:26
【问题描述】:

我想以两种不同的方式从客户的inputstream 中读取信息:

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

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

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

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

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

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

【问题讨论】:

  • 请包含更多代码。 “为什么 ... -1”的简单答案是到达文件末尾,这没有任何帮助。
  • 你为什么要通读Scanner InputStream
  • 我使用ScannerInputStream 因为Scanner 我想读取传入的命令,而InputStream 我想读取可以不同的文件 来自文本文件。

标签: java java.util.scanner inputstream


【解决方案1】:

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

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

【讨论】:

    【解决方案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?的其他方法

    【讨论】:

      猜你喜欢
      • 2014-08-21
      • 2012-12-25
      • 2016-04-29
      • 2017-01-18
      • 2011-08-01
      • 1970-01-01
      • 2014-05-21
      • 2021-01-04
      相关资源
      最近更新 更多