如何用Java编写UTF-8文件?

mar*_*ith 171 java file-io utf-8

我有一些当前的代码,问题是它创建了一个1252代码页文件,我想强制它创建一个UTF-8文件

任何人都可以帮我这个代码,因为我说它目前工作...但我需要强制保存在utf ..我能传递一个参数或什么?

这就是我所拥有的,任何帮助都非常感激

var out = new java.io.FileWriter( new java.io.File( path )),
        text = new java.lang.String( src || "" );
    out.write( text, 0, text.length() );
    out.flush();
    out.close();
Run Code Online (Sandbox Code Playgroud)

ska*_*man 196

而不是使用FileWriter,创建一个FileOutputStream.然后,您可以将其包装在一个中OutputStreamWriter,这允许您在构造函数中传递编码.然后,您可以将数据写入try-with-resources语句中:

try (OutputStreamWriter writer =
             new OutputStreamWriter(new FileOutputStream(PROPERTIES_FILE), StandardCharsets.UTF_8))
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • ...并且诅咒Sun并没有将构造函数放到FileWriter中,后者占用了Charset. (114认同)
  • @Jon Skeet:假设FileWriter是FileOutputStream的包装器,它采用默认的编码和缓冲区大小,那么这不会失败吗? (4认同)
  • 这似乎是一个奇怪的疏忽.他们仍然没有解决它. (3认同)

Mar*_*erg 194

试试这个

Writer out = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream("outfilename"), "UTF-8"));
try {
    out.write(aString);
} finally {
    out.close();
}
Run Code Online (Sandbox Code Playgroud)

  • Writer是Abstract类,BufferedWriter正在实现并且write()+ close()都是声明的. (19认同)
  • 这会创建一个没有BOM的实际UTF-8,而不仅仅是UTF-8.有没有办法强迫它? (3认同)

A_M*_*A_M 24

尝试使用FileUtils.writeApache Commons.

你应该可以这样做:

File f = new File("output.txt"); 
FileUtils.writeStringToFile(f, document.outerHtml(), "UTF-8");
Run Code Online (Sandbox Code Playgroud)

如果文件不存在,这将创建该文件.

  • 这也产生了一个文件UTF-8没有BOM ...我不知道它是否相关. (3认同)
  • @Smarty只有在你已经在使用Apache Commons的情况下.否则,仅仅因为你不想再写几个字符而包含另一个jar似乎是一种可怕的浪费. (3认同)

Emp*_*lou 21

这里给出的所有答案都不会起作用,因为java的UTF-8写作被窃听了.

http://tripoverit.blogspot.com/2007/04/javas-utf-8-and-unicode-writing-is.html

  • 写作时唯一的问题是缺少BOM.没什么大不了.另一方面,使用BOM读取文件需要手动剥离. (4认同)
  • UTF-8不需要BOM,因此从技术上讲,写入的文件仍然是有效的UTF-8编码文本文件.这个错误是读取带有BOM的UTF-8. (2认同)

Nig*_*mas 20

从Java 7开始,您可以Files.newBufferedWriter更简洁地执行相同操作:

Path logFile = Paths.get("/tmp/example.txt");
try (BufferedWriter writer = Files.newBufferedWriter(logFile, StandardCharsets.UTF_8)) {
    writer.write("Hello World!");
    // ...
}
Run Code Online (Sandbox Code Playgroud)


box*_*ats 9

var out = new java.io.PrintWriter(new java.io.File(path), "UTF-8");
text = new java.lang.String( src || "" );
out.print(text);
out.flush();
out.close();
Run Code Online (Sandbox Code Playgroud)


McD*_*ell 7

Java 7的文件实用型处理文件非常有用:

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.*;

public class WriteReadUtf8 {
  public static void main(String[] args) throws IOException {
    List<String> lines = Arrays.asList("These", "are", "lines");

    Path textFile = Paths.get("foo.txt");
    Files.write(textFile, lines, StandardCharsets.UTF_8);

    List<String> read = Files.readAllLines(textFile, StandardCharsets.UTF_8);

    System.out.println(lines.equals(read));
  }
}
Run Code Online (Sandbox Code Playgroud)

Java的版本8,您可以省略字符集参数-方法的默认为UTF-8.