2011-09-30 9 views
5

Jaki jest najprostszy sposób przekonwertowania pliku FileOutputStream na FileInputStream (kawałek kodu byłby świetny)?FileOutputStream do FileInputStream

+4

Czy rozumiesz o co tu chodzi? Co masz na myśli "przekonwertować"? Są to zasadniczo przeciwne rzeczy; jeden jest do czytania, a drugi do pisania. Czy próbujesz odczytać plik, do którego piszesz w swoim 'FileOutputStream'? –

+1

Co dokładnie chcesz zrobić? FileOutputStream zapisuje do pliku, a FileInputStream odczytuje z pliku. Nie rozumiem, w jaki sposób ten pierwszy mógł zostać przekształcony w drugie. –

+0

Otrzymuję FileOutputStream. To, czego chcę, to przeczytać. – Pen

Odpowiedz

14

To może pomóc:

http://ostermiller.org/convert_java_outputstream_inputstream.html

Ten artykuł wymienia 3 możliwości:

  • napisać kompletne wyjście do tablicy bajtów następnie ponownie
  • zastosowania rur
  • ją przeczytać użyj okrągłego bufora bajtowego (część biblioteki hostowanej na tej stronie)


tylko w celach informacyjnych, robi to na odwrót (wejścia do wyjścia):

Prostym rozwiązaniem z Apache Commons IO będzie:

IOUtils.copyLarge(InputStream, OutputStream) 

lub jeśli po prostu chcesz skopiować plik:

FileUtils.copyFile(inFile,outFile); 

Jeśli nie chcesz używać Apache Commons IO, oto co t metoda copyLarge robi:

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; 
} 
+1

Link jest uszkodzony, ale nadal możesz znaleźć oryginalną odpowiedź tutaj: https://web.archive.org/web /20110929161214/http://ostermiller.org/convert_java_outputstream_inputstream.html – GregT

1

Jeśli można użyć przykładu @Thomas podane, w przeciwnym razie można zrobić:

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(); 

    } 
} 

przykład z java2s.com

EDIT:

As @Thomas skasował jego odpowiedź, dodam tylko dla odniesienia Commons IO podejście do obchodzenia się z tym:

IOUtils.copy(InputStream is, OutputStream os) 
+0

Nie widzę, jak to "konwertuje" FileOutputStream' na "FileInputStream". " –

+0

W rzeczywistości mój przykład był odwrotny (wejście do wyjścia), więc usunąłem go. Jeśli nadal jest to istotne, mogę cofnąć usunięcie w celu odniesienia. – Thomas

+0

@ Mark: To prawda, po prostu założyłem, że chce przeczytać jedną z pozostałych – Kris

2

Jeśli chcesz mieć możliwość odczytania zawartości po zapisaniu (bez opróżniania dysku), użyj ByteArrayOutputStream i ByteArrayInputStream. Gdy skończysz pisać do ByteArrayOutputStream, możesz pobrać bazowe dane bajtów i użyć ByteArrayInputStream, aby je odczytać.

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 

Jeśli chcesz bufor (problem producenta/konsumenta), zajrzyj do buforów dostarczonych z pakietem nio java.

4

Otrzymuję FileOutputStream. To, czego chcę, to przeczytać.

Z pewnością nie można odczytać z poziomu OutputStream. Myślę, że masz na myśli, że chcesz przeczytać z pliku zapisanego przez FileOutputStream. Nie sądzę, że możesz to zrobić. Wydaje się, że FileOutputStream nie zachowuje odniesienia do pliku, do którego zapisano.

Co trzeba zrobić, to dowiedzieć się, co File lub ścieżka (a String) został przekazany do FileOutputStream i użyć tej samej File lub String, aby utworzyć nowy FileInputStream.

+3

Myślę, że mógłby użyć FileOutputStream.getFD(), aby uzyskać FileDescriptor; niż zbudować wokół niego FileInputStream. Nie jestem pewien, czy możesz jednocześnie czytać i pisać z tego samego pliku FileDescriptor. –

+0

@ S.L.Barth: Dobra sprawa, faktycznie to sprawdziłem, ale brakowało mi faktu, że 'FileInputStream' ma konstruktor, który przyjmuje' FileDescriptor'. –

Powiązane problemy