Я пытаюсь создать файл с помощью 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);}
}
}




Не используйте ObjectOutputStream там; то есть для двоичных объектов Java.
Избегайте сериализуемых; это практически устарело. Также Serializable также хранит данные класса.
try (FileOutputStream fout=new FileOutputStream("f.txt")) {
fout.write(s1.name.getBytes(StandardCharsets.UTF_8));
} // Closes fout.
«Ошибка» может быть вызвана тем, что последний класс String, который будет содержать Unicode, обычно в виде массива символов UTF-16, также может содержать массив байтов ANSI.
Также вы жестко кодируете строку (new Student(211,"ravi");), что означает, что редактор, сохраняющий исходный код java, и компилятор javac должны использовать одну и ту же кодировку для создания файла .class. Когда нет, строка будет повреждена.
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);
}
Для вашего первого блока кода, вероятно, было бы лучше использовать OutputStreamWriter, созданный с правильным набором символов и использующий write(String), чем вручную преобразовывать строку в байты и записывать их.
@Joop Eggen, спасибо за ответ. Я узнал больше в одном вопросе :)
@MarkRotteveel У студента также был идентификатор int, который не был частью вопроса, а был частью сериализации. Поэтому я сохранил FileOutputStream. Возможно, мне следовало упомянуть DataOutputStream.
Вы пишете двоичный файл, а не текстовый файл.
ObjectOutputStreamдля формата двоичной сериализации объектов Java.