FileOutputStream в FileInputStream - PullRequest
       0

FileOutputStream в FileInputStream

5 голосов
/ 30 сентября 2011

Какой самый простой способ преобразовать FileOutputStream в FileInputStream (кусок кода был бы хорош)?

Ответы [ 4 ]

15 голосов
/ 30 сентября 2011

Это может помочь вам:

http://ostermiller.org/convert_java_outputstream_inputstream.html

В этой статье упоминается 3 варианта:

  • записать полный вывод в байтовый массив, затем прочитать его снова
  • использовать трубы
  • использовать кольцевой буфер байтов (часть библиотеки, размещенной на этой странице)


Просто для справки, делая все наоборот (вход в выход):

Простое решение с использованием Apache Commons IO:

IOUtils.copyLarge(InputStream, OutputStream)

или если вы просто хотите скопировать файл:

FileUtils.copyFile(inFile,outFile);

Если вы не хотите использовать Apache Commons IO, вот что делает метод copyLarge:

public static long copyLarge(InputStream input, OutputStream output) throws IOException 
{
  byte[] buffer = new byte[4096];
  long count = 0L;
  int n = 0;
  while (-1 != (n = input.read(buffer))) {
   output.write(buffer, 0, n);
   count += n;
  }
  return count;
}
4 голосов
/ 30 сентября 2011

Я получаю FileOutputStream. Я хочу прочитать это.

Вы, конечно, не можете читать с OutputStream. Я думаю, что вы имеете в виду, что вы хотите прочитать из файла, в который FileOutputStream записывается. Я не думаю, что вы можете сделать это либо. FileOutputStream, похоже, не сохраняет ссылку на файл, в который выполняется запись.

Что вам нужно сделать, это выяснить, какой File или путь (a String) был передан в FileOutputStream, и использовать те же File или String для создания нового FileInputStream.

3 голосов
/ 30 сентября 2011

Если вы имеете в виду, что хотите иметь возможность читать содержимое после записи (без сброса на диск), используйте ByteArrayOutputStream и ByteArrayInputStream. Как только вы закончите запись в ByteArrayOutputStream, вы можете получить базовые байтовые данные и использовать ByteArrayInputStream, чтобы прочитать их обратно.

ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// do any output onto outStream you need
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
// you can read back the output with inStream now

Если вам нужен буфер (проблема типа производитель / потребитель), посмотрите на Буферы, поставляемые с пакетом java nio.

0 голосов
/ 30 сентября 2011

Если вы можете использовать приведенный пример @Thomas, в противном случае вы можете сделать:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class FileInputOutputExample {
  public static void main(String[] args) throws Exception {

    InputStream is = new FileInputStream("in.txt");
    OutputStream os = new FileOutputStream("out.txt");
    int c;
    while ((c = is.read()) != -1) {
      System.out.print((char) c);
      os.write(c);
    }
    is.close();
    os.close();

  }
}

пример с java2s.com

EDIT:

Поскольку @Thomas удалил свой ответ, я просто добавлю для справки подход Commons IO для этого:

IOUtils.copy(InputStream is, OutputStream os)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...