如何将序列化对象编写为人类可读的Txt文件

时间:2013-05-29 14:53:20

标签: java serialization file-io

我想在TXT文件中以人类可读的形式编写对象,该文件将保存为带有不需要字符的普通序列化对象。

请建议我如何重写相同的程序以保存到人类可读的TXT文件中

import java.io.*;
class book implements Serializable 
{
    String name;
    String author;
    int nop;
    int price;
    int discount;

    void getDiscount()
    {
        int finalprice=price-((price/discount));
        System.out.println("Final price after discount="+finalprice);
    }

    public String toString()
    {
        return name+author+nop+price+discount;
    }
}

class fileio
{
    public static void main(String args[])
    {
        MainClass mainObject=new MainClass();
        mainObject.writeToFile();
        book javabook=new book();
        javabook.name="Java unleashed";
        javabook.author="someone";
        javabook.nop=1032;
        javabook.price=450;
        javabook.discount=10;
        javabook.getDiscount();
    }
        public void writeToFile()
        {
        try
        {
        File file=new File("JavaBook1.txt");
        FileWriter fw=new FileWriter(file.getAbsoluteFile());
        BufferedWriter bw=new BufferedWriter(fw);
        bw.write(book.toString());
        bw.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

    }
}

5 个答案:

答案 0 :(得分:6)

您可以使用JAXBXStream将其序列化为XML。 XML作为二进制数据更像人类可读,因此XML可以为您服务。假设您还希望反序列化数据,这是一个不错的选择。

答案 1 :(得分:5)

看看下面是否解决了你的目的

覆盖Object类的toString()方法以返回对象的状态,然后将其输出写入带有文件writer的文本文件

如果你想要xml类型的表示,请选择JAXB方法

<强>更新: -

请忽略下面程序中的语法/编译错误,因为我没有测试过,但它会给你一个简短的想法

class book implements Serializable 
{
    String name;
    String author;
    int nop;
    int price;
    int discount;

    void getDiscount()
    {
        int finalprice=price-((price/discount));
        System.out.println("Final price after discount="+finalprice);
    }

    public String toString() {
    return name + author +nop + price +discount;
    // above can be any format whatever way you want


    }
}

现在在你的主要班级

 import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

class fileio
{
    public static void main(String args[])
    {
        fileio mainObject=new fileio();

        book javabook=new book();
        javabook.name="Java unleashed";
        javabook.author="someone";
        javabook.nop=1032;
        javabook.price=450;
        javabook.discount=10;
        javabook.getDiscount();
        mainObject.writeToFile(javabook);
    }
        public void writeToFile(book javabook)
        {
        try
        {
        File file=new File("JavaBook1.txt");
        FileWriter fw=new FileWriter(file.getAbsoluteFile());
        BufferedWriter bw=new BufferedWriter(fw);
        bw.write(javabook.toString());
        bw.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

    }
}

答案 2 :(得分:1)

这实际上取决于您需要该文件做什么。如果您不想使用对象的toString()表示,则需要提取每个对象的内容,并提出分隔符,并使用该分隔符分隔您的数据(book( S))。请注意,您需要使用不同的分隔符来分隔每个对象中的数据。您可以标准化写入文件的方式,以便轻松检索单个元素。如果您可以提出分隔符,则可以将book的数据作为String读入,并使用split()将每个属性放入数组槽。如果这只是供人们阅读,你可以做类似的事情,但格式很好,所以人们知道他们实际阅读的内容。对象的toString()可能对此有好处:

作为参考,这里是您的对象的toString()

    public String toString()
    {
         return name + " " + author + " " + price; 
    }

这只是一个例子,但是如果你把它放在你的书类中然后尝试打印书籍对象,你将得到它的name author price作为打印输出。

此外,您应该使用构造函数/方法为对象的实例成员分配值,该值应为private

理想情况下,我认为您应该使用xml进行序列化;见XStream

答案 3 :(得分:1)

两个简单的选项:

在您的代码中:

ReflectionToStringBuilder.toString(javabook, ToStringStyle.MULTI_LINE_STYLE);

将产生:

org.marmots.application.generator.Book@77459877[
  name=Java unleashed
  author=someone
  nop=1032
  price=450
  discount=10
]

非常适合调试。如果您只有简单的字段,那就足够了;如果您引用其中的另一个bean(另一个,另一个...),它将打印其toString()方法,因此您可以使用此代码为所有值/传递对象覆盖toString方法,以具有良好的读取方法对于所有)。

我通常要做的是从基础bean类扩展:

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public abstract class ToStringReadable {
  @Override
  public String toString() {
    return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE);
  }
}

扩展ToStringReadable将使您的所有bean都易于阅读,用于调试目的。

在您的代码中(请注意,您将必须使用getter / setter发布属性,这是一种更好的做法,甚至会更好):

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValue(new File("target/javabook.json"), javabook);

它也会产生人类可读的输出,在这种情况下为JSON:

{"name":"Java unleashed","author":"someone","nop":1032,"price":450}

使用JSON方法,您无需重写toString方法,因为它会打印所有字段,但在性能方面会比较重,因此对于调试,请使用第一种方法。

希望这会有所帮助,

答案 4 :(得分:0)

您可以使用JAXB或JavaBeans将类实例序列化/绝望化为XML。在这两种情况下,您都需要准备课程 - 使用注释或设置者/获取者。