我想在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();
}
}
}
答案 0 :(得分:6)
答案 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。在这两种情况下,您都需要准备课程 - 使用注释或设置者/获取者。