Java экспортирует файл ANSI вместо 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);}    
         }    
    
}

Вы пишете двоичный файл, а не текстовый файл. ObjectOutputStream для формата двоичной сериализации объектов Java.

Mark Rotteveel 29.09.2022 16:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не используйте 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), чем вручную преобразовывать строку в байты и записывать их.

Mark Rotteveel 29.09.2022 16:32

@Joop Eggen, спасибо за ответ. Я узнал больше в одном вопросе :)

MustafaEsatTemel 29.09.2022 16:35

@MarkRotteveel У студента также был идентификатор int, который не был частью вопроса, а был частью сериализации. Поэтому я сохранил FileOutputStream. Возможно, мне следовало упомянуть DataOutputStream.

Joop Eggen 29.09.2022 16:38

Другие вопросы по теме