Как я могу изменить формат экспортируемого объекта Java в файл? - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь экспортировать Java-объект в текстовый файл, но выходные данные в этом файле плохо отформатированы и содержат ненужные данные. Если кто-то может сказать мне, что я делаю не так. Вот простой пример кода:

import java.io.Serializable;

public class Test implements Serializable{

    private static final long serialVersionUID = 1L;
    private String shortName;
    private String fullName;


    public Test(String shortName, String fullName) {
        this.shortName=shortName;
        this.fullName=fullName;
    }

    public String getShortName() {
        return shortName;
    }
    public void setShortName(String shortName) {
        this.shortName = shortName;
    }
    public String getFullName() {
        return fullName;
    }
    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    @Override
    public String toString() {
        return "Name:" + shortName +   "\nFullName: " + fullName;
    }

}

И это часть метода:

FileOutputStream outputStream = new FileOutputStream(fullPath);
        ObjectOutputStream o = new ObjectOutputStream(outputStream);
        Test test = new Test("Short name of test","Full name of test");
        o.writeObject(test);
        o.close();
        outputStream.close();

И это то, что я получаю в файле:

’ sr &com.testing.project.Evaluation.model.Test        L fullNamet Ljava/lang/String;L     shortNameq ~ xpt Full name of testt Short name of test

Буду признателен за любую помощь.

Ответы [ 3 ]

2 голосов
/ 03 октября 2019

Вы используете сериализацию Java, которая записывает объект в свой двоичный формат, а не в текст. Если вам нужен текстовый формат, я бы посоветовал вам использовать JSON с такой библиотекой, как jackson-databind .

И вот рабочий пример для вашего удобства (который записывает оба текстафайл и считывает обратно из текстового файла в объект):

Main.class

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {

    public static void main(String[] args) throws JsonGenerationException, JsonMappingException, FileNotFoundException, IOException {
        ObjectMapper om = new ObjectMapper();
        Test test = new Test("Short name of test","Full name of test");
        om.writeValue(new FileOutputStream("test.json"), test);

        Test readValue = om.readValue(new FileInputStream("test.json"), Test.class);
        System.out.println(readValue.getShortName());
        System.out.println(readValue.getFullName());
    }
}

Test.class

import java.io.Serializable;

public class Test implements Serializable{

    private static final long serialVersionUID = 1L;
    private String shortName;
    private String fullName;

    public Test() {

    }

    public Test(String shortName, String fullName) {
        this.shortName=shortName;
        this.fullName=fullName;
    }

    public String getShortName() {
        return shortName;
    }
    public void setShortName(String shortName) {
        this.shortName = shortName;
    }
    public String getFullName() {
        return fullName;
    }
    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    @Override
    public String toString() {
        return "Name:" + shortName +   "\nFullName: " + fullName;
    }
}

Обратите внимание, что я добавилконструктор по умолчанию для Test.class, чтобы Джексон мог его создать при десериализации из json.

1 голос
/ 03 октября 2019

Функция writeObject записывает граф объектов Test в файловый поток. Используется для сохранения в JAVA. Если вы хотите сохранить полевые данные в файл, я предлагаю использовать выделенный метод в вашем классе, используя FileWriter.

0 голосов
/ 03 октября 2019

ObjectOutputStream не будет писать в читаемом формате. Вы, вероятно, хотите использовать FileWriter:

    try (BufferedWriter writer = new BufferedWriter(new FileWriter("test.txt"))) {
        Test t = new Test("Short name of test", "Full name of test");
        writer.write(t.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }
...