В Java, как я могу использовать inputStream из процесса с гуавой Google CharStreams.toString? - PullRequest
4 голосов
/ 11 августа 2011

Я выполняю процесс и хочу прочитать его вывод в строку.Вместо того, чтобы иметь дело с try / catch / finally, я надеюсь использовать Guava CharStreams.toString(InputSupplier<R> supplier).К сожалению, поток, возвращаемый процессом getInputStream(), имеет тип InputStream, а не InputSupplier.Как я могу использовать это для создания InputSupplier для использования с t oString()?

В идеале я мог бы сделать что-то вроде этого:

CharStreams.toString(CharStreams.newReaderSupplier(process.getInputStream()))

Но вы не можете создать InputSupplier изInputStream и у меня возникли проблемы с поиском, как это сделать.

Ответы [ 5 ]

3 голосов
/ 11 августа 2011

Я еще не нашел способ сделать это с гуавой.Я уверен, что у разработчика есть веская причина для этого.Самое близкое, что я получил, пока держу его минимальным:

 CharStreams.toString(CharStreams.newReaderSupplier(new InputSupplier<InputStream>() {
        @Override
        public InputStream getInput() throws IOException {
            return inputStream;
        }
    }, Charsets.UTF_16));

Я использовал newReaderSupplier из CharStreams, так что вам не нужно оборачивать его InputStreamReader.

1 голос
/ 06 октября 2011

Правильно сделать - и то, что Guava пытается подтолкнуть вас к выполнению, - это изменить код, который дает вам InputStream, чтобы вместо него дать InputSupplier.

Причина этого в том, что таким образом Guava получает поток, читает строку и закрывает ее, и вы не можете случайно использовать ее после того, как Guava закрыл ее, потому что у вас никогда не было ссылки на InputStream в первом место. Это устраняет много потенциальных ошибок.

Другая перегрузка, CharStreams.toString (Readable), не закрывает Readable. Если вы хотите иметь свою собственную специальную логику для закрытия входного потока, это способ, которым Guava позволяет вам сделать это.

Эквивалент гуавы для IOUtils.toString (InputStream) говорит, что это лучше, чем я мог.

1 голос
/ 11 августа 2011

Что по этому поводу:

CharStreams.toString(new InputStreamReader(process.getInpusttream()))

Используется CharStreams.toString(Readable).

1 голос
/ 11 августа 2011

Пока это лучшее, что я мог сделать:

String commandOutput = CharStreams.toString(new InputSupplier<InputStreamReader>() {
    public InputStreamReader getInput() throws IOException {
        return new InputStreamReader(process.getInputStream());
    }
});
0 голосов
/ 31 мая 2013

Это должно сделать это:

InputStream is = process.getInputStream();
String content = CharStreams.toString(new InputStreamReader(is, Charsets.UTF_8));
is.close();

А вот реальный пример полного использования:

HttpURLConnection connection = null;
URL url;
InputStream is = null;
try {
  url = new URL("https://graph.facebook.com/oauth/access_token?client_id=" + appId + "&client_secret=" + appSecret + "&grant_type=client_credentials");
  connection = (HttpURLConnection) url.openConnection();
  connection.setRequestProperty("accept-encoding", "gzip");

  is = connection.getInputStream();
  String content = CharStreams.toString(new InputStreamReader(is, Charsets.UTF_8));
  String[] tokens = content.split("=");
  System.out.println(tokens[1]);
} catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
} finally {
  if (is != null) try {
    is.close();
  } catch (IOException e) {}
  connection.disconnect();
}

Я знаю, что это действительно не под вопросом, но для сравнения, он как вы делаете это с IOUtils - что IMO немного чище:

HttpURLConnection connection = null;
URL url;
InputStream is = null;

try {
  url = new URL("https://graph.facebook.com/oauth/access_token?client_id=" + appId + "&client_secret=" + appSecret + "&grant_type=client_credentials");
  connection = (HttpURLConnection) url.openConnection();
  connection.setRequestProperty("accept-encoding", "gzip");

  is = connection.getInputStream();

  String value = IOUtils.toString(is);
  if (!Strings.isNullOrEmpty(value)) {
    String[] splits = value.split("=");
    System.out.println(splits[1]);
  }
} catch (IOException e) {

} finally {
  IOUtils.closeQuietly(is);
  connection.disconnect();
}
...