使用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正确地通知你编码错误是棘手的。 对于InputStreamReader
和OutputStreamWriter
每一个,您必须使用四个替代构造函数中最为冗长和最less使用的构造OutputStreamWriter
来接收适当的编码故障exception。
对于文件I / O,请务必始终将OutputStreamWriter
和InputStreamReader
的第二个参数用作花式编码器参数:
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_stdin
, chars_from_his_stdout
和chars_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_8
replacestring“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));
您可以select
IGNORE | REPLACE | REPORT
行动IGNORE | REPLACE | REPORT
另外,这个问题已经在这里回答了 。
沟FileWriter
和FileReader
,这是无用的,因为它们不允许你指定编码。 相反,使用
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();