2014-03-26 8 views
8

Ich werde Eingangsstrom von Drittanbieter-Bibliothek zu meiner Anwendung erhalten. Ich muss diesen Eingabestrom in eine Datei schreiben.Effiziente Möglichkeit, InputStream in eine Datei in Java 6 zu schreiben 6

Nach dem Code-Snippet ich versuchte:

private void writeDataToFile(Stub stub) { 
    OutputStream os = null; 
    InputStream inputStream = null; 

    try { 

     inputStream = stub.getStream(); 
     os = new FileOutputStream("test.txt"); 
     int read = 0; 
     byte[] bytes = new byte[1024]; 

     while ((read = inputStream.read(bytes)) != -1) { 
      os.write(bytes, 0, read); 
     } 

    } catch (Exception e) { 

     log("Error while fetching data", e); 

    } finally { 
     if(inputStream != null) { 
      try { 
       inputStream.close(); 
      } catch (IOException e) { 
       log("Error while closing input stream", e); 
      } 
     } 
     if(os != null) { 
      try { 
       os.close(); 
      } catch (IOException e) { 
       log("Error while closing output stream", e); 
      } 
     } 
    } 
} 

Gibt es einen besseren Ansatz, dies zu tun?

Antwort

25

Da Sie mit Java 6 stecken, tun sich selbst einen Gefallen und nutzen Guava und seine Closer:

final Closer closer = Closer.create(); 
final InputStream in; 
final OutputStream out; 
final byte[] buf = new byte[32768]; // 32k 
int bytesRead; 

try { 
    in = closer.register(createInputStreamHere()); 
    out = closer.register(new FileOutputStream(...)); 
    while ((bytesRead = in.read(buf)) != -1) 
     out.write(buf, 0, bytesRead); 
    out.flush(); 
} finally { 
    closer.close(); 
} 

Hatten Sie verwendet Java 7, wäre die Lösung so einfach gewesen sein, wie:

final Path destination = Paths.get("pathToYourFile"); 
try (
    final InputStream in = createInputStreamHere(); 
) { 
    Files.copy(in, destination); 
} 

Und yourInputStream wäre automatisch für Sie als "Bonus" geschlossen worden; Files hätte destination von sich aus behandelt.

+0

Dateien und Pfade ist das Konzept von Java 7. Aber meine Anwendung läuft mit Java 6. Gibt es eine Lösung wie oben in Java 6 verfügbar ist. – Awesome

+0

Aw shucks. OK, dann können Sie eine externe Bibliothek verwenden? Ich dachte über Guava hier – fge

+0

InputStream out? – Puce

1

Es kann Reiniger mit einem Output erhalten:

OutputStream outputStream = new FileOutputStream("output.txt"); 
Writer writer = new OutputStreamWriter(outputStream); 

writer.write("data"); 

writer.close(); 

Statt eine Reihe von Schreiben, können Sie einen Scanner auf Ihrem input verwenden

Scanner sc = new Scanner(inputStream); 
while (sc.HasNext()) 
    //read using scanner methods 
+1

Während eine '.txt' Datei vom OP erwähnt wurde, hat diese Lösung zwei Hauptprobleme: 1.' Scanner 'wird das Trennzeichen verschrotten; 2. Keine Kodierung, die in dem "Writer" spezifiziert ist. Sie werden also Zeilenumbrüche löschen (da dies das Standardtrennzeichen von 'Scanner' ist) und Sie riskieren nicht, die korrekte Codierung zu verwenden, da Sie Bytes und keine Zeichen erhalten. Mehr Details zu diesem letzteren Problem [hier] (http://fgaliegue.blogspot.com/2014/03/strings-characters-bytes-and-character.html). – fge

2

Wenn Sie nicht auf Java sind 7 und kann ‚t fge-Lösung verwenden, können Sie Ihre Output in einem BufferedOutputStream

BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream("xx.txt")); 

Solche wickeln wollen Der gepufferte Ausgabestrom schreibt Bytes in Blöcke in die Datei, was effizienter ist als das Schreiben von Byte pro Byte.