使用FileWriter(Java)以UTF-8编写文件?

我有下面的代码,但是,我希望它作为一个UTF-8文件来处理外来字符。 有没有办法做到这一点,有一些需要有一个参数?

我真的很感激你的帮助。 谢谢。

try { BufferedReader reader = new BufferedReader(new FileReader("C:/Users/Jess/My Documents/actresses.list")); writer = new BufferedWriter(new FileWriter("C:/Users/Jess/My Documents/actressesFormatted.csv")); while( (line = reader.readLine()) != null) { //If the line starts with a tab then we just want to add a movie //using the current actor's name. if(line.length() == 0) continue; else if(line.charAt(0) == '\t') { readMovieLine2(0, line, surname.toString(), forename.toString()); } //Else we've reached a new actor else { readActorName(line); } } } catch (IOException e) { e.printStackTrace(); } 

安全的编码构造函数

让Java正确地通知你编码错误是棘手的。 对于InputStreamReaderOutputStreamWriter每一个,您必须使用四个替代构造函数中最为冗长最less使用的构造OutputStreamWriter来接收适当的编码故障exception。

对于文件I / O,请务必始终将OutputStreamWriterInputStreamReader的第二个参数用作花式编码器参数:

  Charset.forName("UTF-8").newEncoder() 

还有其他更奇特的可能性,但是三个更简单的可能性都不适用于exception处理。 这些做:

  OutputStreamWriter char_output = new OutputStreamWriter( new FileOutputStream("some_output.utf8"), Charset.forName("UTF-8").newEncoder() ); InputStreamReader char_input = new InputStreamReader( new FileInputStream("some_input.utf8"), Charset.forName("UTF-8").newDecoder() ); 

至于跑步

  $ java -Dfile.encoding=utf8 SomeTrulyRemarkablyLongcLassNameGoeShere 

问题是,这将不会使用完整的编码器参数forms的字符stream,所以你会再次错过编码问题。

更长的例子

这里有一个更长的例子,这个pipe理一个进程而不是一个文件,在这里我们将两个不同的input字节stream和一个输出字节stream全部转换为UTF-8字符stream, 并进行完全的exception处理

  // this runs a perl script with UTF-8 STD{IN,OUT,ERR} streams Process slave_process = Runtime.getRuntime().exec("perl -CS script args"); // fetch his stdin byte stream... OutputStream __bytes_into_his_stdin = slave_process.getOutputStream(); // and make a character stream with exceptions on encoding errors OutputStreamWriter chars_into_his_stdin = new OutputStreamWriter( __bytes_into_his_stdin, /* DO NOT OMIT! */ Charset.forName("UTF-8").newEncoder() ); // fetch his stdout byte stream... InputStream __bytes_from_his_stdout = slave_process.getInputStream(); // and make a character stream with exceptions on encoding errors InputStreamReader chars_from_his_stdout = new InputStreamReader( __bytes_from_his_stdout, /* DO NOT OMIT! */ Charset.forName("UTF-8").newDecoder() ); // fetch his stderr byte stream... InputStream __bytes_from_his_stderr = slave_process.getErrorStream(); // and make a character stream with exceptions on encoding errors InputStreamReader chars_from_his_stderr = new InputStreamReader( __bytes_from_his_stderr, /* DO NOT OMIT! */ Charset.forName("UTF-8").newDecoder() ); 

现在你有三个字符stream,都会引发编码错误,分别称为chars_into_his_stdinchars_from_his_stdoutchars_from_his_stderr

这只是稍微复杂一些,你需要为你的问题,我的解决scheme,在这个答案的前半部分。 关键是这是检测编码错误的唯一方法。

只是不要让我开始关于PrintStream的饮食exception。

您需要使用OutputStreamWriter类作为BufferedWriter的writer参数。 它确实接受编码。 审查它的javadocs 。

有点像这样:

 BufferedWriter out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream("jedis.txt"), "UTF-8" )); 

或者,您可以使用系统属性file.encoding将当前系统编码设置为UTF-8。

 java -Dfile.encoding=UTF-8 com.jediacademy.Runner arg1 arg2 ... 

你也可以在运行时使用System.setProperty(...)将其设置为系统属性,如果你只需要这个特定的文件,但是在这种情况下,我想我更喜欢OutputStreamWriter

通过设置系统属性,您可以使用FileWriter并期望它将使用UTF-8作为文件的默认编码。 在这种情况下,您读取和写入的所有文件。

编辑

  • 从API 19开始,您可以使用StandardCharsets.UTF_8replacestring“UTF-8”

  • 如tchrist在下面的注释中所build议的那样 ,如果您打算检测文件中的编码错误,您将被迫使用OutputStreamWriter方法并使用接收字符集编码器的构造函数。

    有点像

     CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder(); encoder.onMalformedInput(CodingErrorAction.REPORT); encoder.onUnmappableCharacter(CodingErrorAction.REPORT); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("jedis.txt"),encoder)); 

    您可以selectIGNORE | REPLACE | REPORT行动 IGNORE | REPLACE | REPORT

另外,这个问题已经在这里回答了 。

FileWriterFileReader ,这是无用的,因为它们不允许你指定编码。 相反,使用

new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)

new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);

中文文本,我试图使用字符集UTF-16,幸运的是它的工作。

希望这可以帮助!

 PrintWriter out = new PrintWriter( file, "UTF-16" ); 

由于Java 7有一个简单的方法来处理BufferedWriter和BufferedReaders的字符编码。 您可以直接使用Files类创buildBufferedWriter,而不是创buildWriter的各种实例。 您可以简单地创build一个BufferedWriter,它考虑字符编码,通过调用:

 Files.newBufferedWriter(file.toPath(), StandardCharsets.UTF_8); 

你可以在JavaDoc中find更多关于它的信息:

  • 文件类
  • 文件#newBufferedWriter

我的想法是

如果你想要写类似的UTF-8 。你应该创build一个字节数组。然后,你可以做如下: byte[] by=("<?xml version=\"1.0\" encoding=\"utf-8\"?>"+"Your string".getBytes();

然后,您可以将每个字节写入您创build的文件中。 例:

 OutputStream f=new FileOutputStream(xmlfile); byte[] by=("<?xml version=\"1.0\" encoding=\"utf-8\"?>"+"Your string".getBytes(); for (int i=0;i<by.length;i++){ byte b=by[i]; f.write(b); } f.close();