2016-07-13 6 views
-1

Ich habe eine Beispielmethode, die eine Datei mit InputStream und OutputStream in eine andere kopiert. In diesem Fall ist die Quelldatei in 'UTF-8' codiert. Auch wenn ich die Codierung beim Schreiben auf die Festplatte nicht festlege, hat die Zieldatei die richtige Kodierung. Aber wenn ich eine java.lang.String in eine Datei schreiben muss, muss ich die Codierung angeben. Warum das ?Wann muss ich die Codierung beim Schreiben der Datei auf die Festplatte angeben?

public static void copyFile() { 

    String sourceFilePath = "C://my_encoded.txt"; 

    InputStream inStream = null; 
    OutputStream outStream = null; 

    try{ 
     String targetFilePath = "C://my_target.txt"; 
     File sourcefile =new File(sourceFilePath); 
     outStream = new FileOutputStream(targetFilePath); 
     inStream = new FileInputStream(sourcefile); 
     byte[] buffer = new byte[1024]; 

     int length; 
     //copy the file content in bytes 
     while ((length = inStream.read(buffer)) > 0){ 
      outStream.write(buffer, 0, length); 
     } 
     inStream.close(); 
     outStream.close(); 
     System.out.println("File "+targetFilePath+" is copied successful!"); 
    }catch(IOException e){ 
      e.printStackTrace(); 
    } 
} 

Meine Vermutung ist, dass, da die Quelldatei mir richtige Codierung hat und da wir ein Byte zu einem Zeitpunkt, zu lesen und schreiben, es funktioniert gut. Und java.lang.String ist standardmäßig 'UTF-16' und wenn wir es in die Datei schreiben, liest es ein Byte nach dem anderen anstelle von 2 Bytes und damit auch Müllwerten. Ist das richtig oder bin ich völlig falsch in meinem Verständnis?

+0

Sie haben den Teil angezeigt, der funktioniert, und Sie haben mehrere Fragen zu einem anderen Teil gestellt, der nicht funktioniert und nicht angezeigt wird. Schwer zu wissen, wovon du redest. – EJP

Antwort

1

Sie kopieren das Dateibyte pro Byte, sodass Sie sich nicht um die Zeichencodierung kümmern müssen.

Als Faustregel:

Verwenden Sie die verschiedenen InputStream und OutputStream Implementierungen für byteweise Verarbeitung (wie Datei kopieren). Es gibt einige bequeme Methoden, um Text direkt wie PrintStream.println() zu behandeln. Seien Sie vorsichtig, da die meisten die standardmäßige plattformspezifische Codierung verwenden. Verwenden Sie die verschiedenen Reader und Writer Implementierungen zum Lesen und Schreiben von Text.

Wenn Sie zwischen Byte-weise und Textverarbeitung konvertieren müssen, verwenden Sie InputStreamReader und OutputStreamWriter mit expliziter Dateicodierung.

Verlassen Sie sich nicht auf die Standardcodierung. Die Standardzeichencodierung ist plattformspezifisch (z. B. Windows-ANSI, auch Cp1252 für Windows, normalerweise UTF-8 für Linux).

Beispiel: Wenn Sie eine UTF-8-Textdatei lesen:

BufferedReader reader = 
    new BufferedReader(new InputStreamReader(new FileInputStream(inFile), "UTF-8")); 

Vermeiden Sie ein FileReader weil ein FileReader verwendet immer die Standard-Kodierung.

Ein Sonderfall: Wenn Sie einen zufälligen Zugriff auf eine Datei benötigen, sollten Sie RandomAccessFile verwenden. Damit können Sie Datenblöcke an beliebigen Positionen lesen und schreiben. Sie können rohe Byteblöcke lesen und schreiben, oder Sie können Komfortmethoden verwenden, um Text zu lesen und zu schreiben. Aber Sie sollten die Dokumentation sorgfältig lesen. Z.B. Die Methoden readUTF() und writeUTF() verwenden eine modifizierte UTF-8-Codierung.

InputStream, OutputStream, Reader, Writer und RandomAccessFile bilden die Grund IO-Funktionalität, genug für die meisten Anwendungsfälle. Für erweiterte E/A (z. B. Speicherabbilddateien, ...) sehen Sie sich das Paket java.nio an.

1

Lesen Sie einfach Ihren Code! (Für die Kopie mindestens ;-))

Wenn Sie die zwei Dateien kopieren, kopieren Sie es byte von byte. Es gibt also keine Konvertierung in String.

Wenn Sie eine String in eine Datei schreiben, müssen Sie sie (indirekt manchmal) in ein Array von byte (byte[]) konvertieren. Dort müssen Sie Ihre Kodierung angeben.

Wenn Sie eine Datei lesen, um eine String zu erhalten, müssen Sie ihre Codierung kennen, um es richtig zu machen. Java überspringt keine byte, aber Sie müssen eine Konvertierung noch einmal vornehmen: von byte[] zu String.

Verwandte Themen