![](/img/trans.png)
[英]Is it possible to send an object to a file in a format that is human readable?
[英]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();
}
}
}
看看下面是否能解决你的目的
覆盖对象类的 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.