Как я могу прочитать символ из InputStream и вернуть его поставщику <Integer>(Java) - PullRequest
0 голосов
/ 24 февраля 2020

Итак, у меня есть метод, который мне нужно реализовать. Он получает InputStream и возвращает поставщика следующим образом:

public Supplier<Integer> buildPipe(InputStream input)

Теперь я хочу прочитать символ из InputStream (возможно, с помощью метода read ()) и вернуть его, но я понятия не имею, как хранить его как int, чтобы я мог вернуть его Поставщику.

Я надеюсь, что кто-то может мне помочь.

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

На самом деле невозможно go напрямую с InputStream на codepoint без прохождения через мост декодирования. Для этого вам нужно знать, что Charset, или предполагать это. InputStreamReader это тот мост.

например:

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

Теперь вы можете иметь своего Поставщика из Reader, а не из входного потока.

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

Обратите внимание, что InputStreamReader с состоянием и, следовательно, ваш Supplier не будет ссылочно-прозрачным, как можно было бы ожидать.

0 голосов
/ 24 февраля 2020

InputStream - это ориентированный на байты поток, если вам нужен символ, а не байт, вы должны использовать InputStreamReader. Может быть, что-то вроде этого будет работать для вас:

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