提问人:MustafaEsatTemel 提问时间:9/29/2022 最后编辑:Mark RotteveelMustafaEsatTemel 更新时间:9/29/2022 访问量:425
Java 导出 ANSI 文件而不是 UTF-8
Java exports ANSI file instead of UTF-8
问:
我正在尝试使用 FileOutputStream 创建一个文件,但它总是创建如下图所示的 ANSI 格式。我在 Eclipse 和 IntelliJ 上进行了所有字符编码设置,但仍然是同样的问题。
这是我的代码:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
class Student implements Serializable{
int id;
String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
}
public class sss {
public static void main(String args[]){
try{
//Creating the object
Student s1 =new Student(211,"ravi");
//Creating stream and writing the object
FileOutputStream fout=new FileOutputStream("f.txt");
ObjectOutputStream out=new ObjectOutputStream(fout);
out.writeObject(s1);
out.flush();
//closing the stream
out.close();
System.out.println("success");
}catch(Exception e){System.out.println(e);}
}
}
答:
1赞
Joop Eggen
9/29/2022
#1
不要在那里使用;这适用于二进制 Java 对象。
避免可序列化;它实际上已被弃用。此外,Serializable 还存储类数据。ObjectOutputStream
try (FileOutputStream fout=new FileOutputStream("f.txt")) {
fout.write(s1.name.getBytes(StandardCharsets.UTF_8));
} // Closes fout.
“错误”可能是由于最新的 String 类(通常作为 UTF-16 字符数组)将保存 Unicode,也可以保存 ANSI 字节数组。
此外,您对字符串 () 进行硬编码,这意味着保存 java 源代码的编辑器和 javac 编译器必须使用相同的编码来生成 .class 文件。否则,字符串将被损坏。new Student(211,"ravi");
try {
//Creating the object
Student s1 = new Student(212, "Jérome");
//Creating stream and writing the object
Path path = Paths.get("f.txt");
Files.writeString(path, s1.name); // Default UTF-8
path = path.resolveSibling("f-latin1.txt");
Files.writeString(path, s1.name, StandardCharsets.ISO_8859_1);
System.out.println("success");
} catch (Exception e) {
e.printStackTrace(System.out);
}
评论
0赞
Mark Rotteveel
9/29/2022
对于您的第一个代码块,使用具有正确字符集并使用 的创建可能比手动将字符串转换为字节并写入这些字符块更好。OutputStreamWriter
write(String)
0赞
MustafaEsatTemel
9/29/2022
@Joop Eggen,谢谢你的回答。我在一个问题中学到了更多:)
0赞
Joop Eggen
9/29/2022
@MarkRotteveel Student 也有一个 int id,这不是问题的一部分,而是序列化的一部分。所以我保留了一个 FileOutputStream。也许我应该提到一个 DataOutputStream。
评论
ObjectOutputStream