2016-07-13 2 views
-1

У меня есть образец метода, который копирует один файл в другой с помощью InputStream и OutputStream. В этом случае исходный файл кодируется в 'UTF-8'. Даже если я не укажу кодировку во время записи на диск, целевой файл имеет правильную кодировку. Но, если мне нужно написать файл java.lang.String в файл, мне нужно указать кодировку. Почему это ?Когда мне нужно указать кодировку при записи файла на диск?

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

Я думаю, что, так как исходный файл имеет правильную кодировку тебя и так как мы читать и писать один байт в то время, он отлично работает. И java.lang.String по умолчанию является «UTF-16», и если мы напишем его в файл, он читает по одному байту за раз вместо 2 байтов и, следовательно, значений мусора. Это правильно или я совершенно не прав в своем понимании?

+0

Вы показали часть, которая работает, и вы задали несколько вопросов о другой части, которая не работает и не отображается. Трудно понять, о чем вы говорите. – EJP

ответ

1

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

Как правило:

Используйте различные InputStream и OutputStream реализаций для побайтно обработки (например, копирование файлов). Есть некоторые методы удобства для обработки текста прямо как PrintStream.println(). Будьте осторожны, потому что большинство из них использует стандартную кодировку платформы.

Используйте различные функции для чтения и наложения текста с использованием различных функций Reader и Writer.

Если вам нужно преобразовать между байт-мудрой и текстовой обработкой, используйте InputStreamReader и OutputStreamWriter с явным кодированием файлов.

Не полагайтесь на кодировку по умолчанию. Кодировка символов по умолчанию является специфичной для платформы (например, Windows-ANSI aka Cp1252 для Windows, обычно UTF-8 для Linux).

Пример: Если вам нужно прочитать UTF-8 текстовый файл:

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

Избегайте использования FileReader, поскольку FileReader всегда использует кодировку по умолчанию.

Специальный случай: Если вам нужен случайный доступ к файлу, вы должны использовать RandomAccessFile. С его помощью вы можете читать и писать блоки данных на произвольных позициях. Вы можете читать и писать необработанные байтовые блоки, или вы можете использовать удобные методы для чтения и записи текста. Но вы должны внимательно прочитать документацию. Например. методы readUTF() и writeUTF() используют модифицированную кодировку UTF-8.

InputStream, OutputStream, Reader, Writer и RandomAccessFile образуют основные функциональные возможности ввода-вывода, достаточно для большинства случаев использования. Для расширенного ввода-вывода (например, файлы с отображением памяти, ...) посмотрите на пакет java.nio.

1

Просто прочтите свой код! (Для части копии, по крайней мере ;-))

При копировании двух файлов вы копируете его byte на byte. Таким образом, конвертация в String отсутствует.

Когда вы пишете файл String в файл, его необходимо преобразовать (косвенно иногда) в массив из byte (byte[]). Там вам нужно указать свою кодировку.

Когда вы читаете файл, чтобы получить String, вам необходимо знать его кодировку, чтобы сделать это правильно. Java не «пропускает» byte, но вам нужно сделать еще раз: от byte[] до String.

Смежные вопросы