【问题标题】:How can I read a character from an InputStream and return it in a Supplier<Integer> (Java)如何从 InputStream 中读取字符并将其返回到 Supplier<Integer> (Java)
【发布时间】:2020-06-08 01:19:22
【问题描述】:

所以我有一个方法需要实现。它获取一个 InputStream 并返回一个供应商,如下所示:

public Supplier&lt;Integer&gt; buildPipe(InputStream input)

现在我想从 InputStream 中读取一个字符(可能使用 read() 方法)并返回它,但我不知道如何将它存储为 int 以便我可以使用供应商返回它。

希望有人能帮帮我。

【问题讨论】:

  • 所以基本上你要问的是如何将字符串解析为整数?
  • 虽然可以这样做,但这是个坏主意。您必须将读取的每个字符都包装在 try/catch 中。这不值得。

标签: java methods inputstream supplier


【解决方案1】:

在不通过解码桥的情况下直接从InputStreamcodepoint 是不可能的。为此,您需要知道Charset,或者假设它。 InputStreamReader 就是那座桥。

例如:

InputStream is = new ByteArrayInputStream(new byte[]{1,2});
InputStreamReader reader = new InputStreamReader(is, StandardCharsets.UTF_8);

现在您可以从阅读器而不是输入流中获取供应商。

Supplier<Integer> next(InputStreamReader reader) {
    Supplier<Integer> s = () -> {
        try {
            return reader.read();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    };
    return s;
}

请注意,InputStreamReader 是有状态的,因此您的 Supplier 不会像预期的那样具有引用透明性。

【讨论】:

    【解决方案2】:

    InputStream 是一个面向字节的流,如果你需要一个字符,而不是一个字节,你应该使用 InputStreamReader。也许这样的事情对你有用:

      public Supplier<Integer> buildPipe(InputStream input) {
        return () -> {
          try {
            return Integer.valueOf(input.read());
          } catch (IOException e) {
            e.printStackTrace();
          }
          return Integer.valueOf(-1);
        };
      }
    

    【讨论】:

    • 打印堆栈跟踪是很差的异常处理。您应该将 IOException 包装在 RuntimeException 中并抛出它
    猜你喜欢
    • 2017-12-12
    • 1970-01-01
    • 2014-03-21
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多