繁体   English   中英

如何将对象编写为人类可读的文本文件

[英]How to write Object as human readable text file

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

如何重写程序以保存到人类可读的文本文件中?

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();
        }

    }
}

您可以使用JAXBXStream将其序列化为 XML。 XML 作为二进制数据更易于人类阅读,因此 XML 可能适合您。 假设您还想反序列化您的数据,这是一个不错的选择。

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

覆盖对象类的 toString() 方法以返回对象的状态,然后使用文件编写器将其输出写入文本文件

如果你想有 xml 类型的表示,去 JAXB 方法

更新:-

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

class Book
{
    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();
        }
    }
}

两个简单的选择:

在您的代码中:

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 方法,以便获得良好的读取方法对所有人)。

我通常做的是从基豆类扩展:

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(s) 发布您的属性,这是一个很好的做法,所以更好):

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

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

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

使用 JSON 方法您不需要覆盖 toString 方法,因为它会打印您的所有字段,但它在性能方面更重,因此对于调试使用第一种方法。

希望这可以帮助,

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

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

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

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

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

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

您可以使用 JAXB 或 JavaBeans 将类实例序列化/反序列化为 XML。 在这两种情况下,您都需要准备您的课程 - 使用注释或 setter/getter。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM