2014-03-13 40 views
1

我試圖將UTF-8文本文件轉換爲Windows-1250。 我正在使用Java 6 API。Java將UTF-8文本文件轉換爲Cp1250

我已經使用下面的代碼,但結果絕對不是Cp1250。

import java.io.*; 

public class testing { 
    public static void main (String[] args) throws IOException { 

     InputStream input = null; 
     OutputStreamWriter output = null; 

     File destinationFile = new File("C:\\test\\Cp1250.txt"); 

     try {  
      input = new FileInputStream("C:\\test\\utf-8.txt"); 
      output = new OutputStreamWriter(new FileOutputStream(destinationFile), "Windows-1250"); 

      while (input.read() != -1) { 
       output.write(input.read()); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      input.close(); 
      output.close(); 
     }  
    } 
} 
+0

請更清楚地解釋了什麼錯誤。什麼是輸出,你做了什麼來嘗試和解決你的問題? – bknopper

+0

**不要**捕獲「異常」...這也捕獲所有未經檢查的異常。抓住更具體的。 – fge

回答

4

你需要一個InputStreamReader,哪知道從FileInputStream中的數據必須以UTF-8字符集來解釋。

這裏是一個例子。爲了簡潔,我省略了資源的關閉。

FileInputStream input = new FileInputStream(file); 
    InputStreamReader reader = new InputStreamReader(input, "utf-8"); 
    FileOutputStream output = new FileOutputStream(destinationFile); 
    OutputStreamWriter writer = new OutputStreamWriter(output, "Windows-1250"); 

    int read = reader.read(); 
    while (read != -1) 
    { 
     writer.write(read); 
     read = reader.read(); 
    } 

而另一件事:在你的while循環有兩種調用input.read,但你叫output.write()只有一次。這意味着你只寫了你讀過的一半字節。

+0

我有這個代碼的空輸出文件:( – user3416100

+1

正如我所說,我省略了資源的關閉,你仍然需要這樣做。該文件可能是空的,因爲FileOutputStream沒有被刷新。 –

+0

你關閉了嗎所有資源?包括讀者和寫者?我只測試它,並且destinationFile實際上只在關閉輸出流時保持爲空,而不是寫者。 –

1

下面是使用Java 7時,你怎麼做:

final Path src = Paths.get("C:\\test\\utf-8.txt"); 
final Path dst = Paths.get("C:\\test\\Cp1250.txt"); 

try (
    BufferedReader reader = Files.newBufferedReader(src, StandardCharsets.UTF_8); 
    BufferedWriter writer = Files.newBufferedWriter(dst, 
     Charset.forName("windows-1252")); 
) { 
    String line; 
    while ((line = reader.readLine()) != null) { 
     writer.write(line); 
     writer.newLine(); 
    } 
    writer.flush(); 
}