我有这段代码,只是为了尝试将其写入文件。但是当我编译它时,它不显示任何错误,但我的文件中的文本是不可读的,一些Unicode代码等...我使用eclipse IDE。这可能是什么原因?
public static void main(String[] args) {
String s = "Hello world!";
int i = 143141141;
try
{
//create new file with an ObjectOutputStream
FileOutputStream out = new FileOutputStream("test.txt");
ObjectOutputStream oout = new ObjectOutputStream(out);
//write something in a file
oout.writeObject(s);
oout.writeObject(i);
//close the stream
oout.close();
//create an ObjectInputStream for the file we created before
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("test.txt"));
//read and print what we wrote before
System.out.println("" + (String) ois.readObject());
System.out.println("" + ois.readObject());
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
答案 0 :(得分:2)
使用ObjectOutputStream
,您可以使用Serialization
将对象写入文件。序列化使用编码系统,您在程序中正确使用ObjectInputStream
来解码这些对象。但是,您无法读取序列化过程创建的文件中的信息。
答案 1 :(得分:2)
由于你正在使用ObjectOutputStream和ObjectInputStream,它将用Object代码写入,这是不可读的,当你从文件中读取时,它将作为一个Object出现,所以再次作为一个对象,
使用BufferedReader或Writer将String写入文件,可以读取
FileReader f=new FileReader(new File("test.txt"));
BufferedReader f1=new BufferedReader(f)
答案 2 :(得分:0)
您应该使用PrintWriter
来编写文本文件,ObjectOutputStream
写入二进制数据。
答案 3 :(得分:0)
Java ObjectOutputStream以二进制非人类可读格式写入对象,只能使用ObjectInputStream进行读取。
答案 4 :(得分:0)
您的代码对我来说很好。如果我通过在编辑器(例如notepad或eclipse)中打开文件的内容来查看文件的内容时,我正确理解它,您会看到存储为二进制内容的字符。当您使用ObjectInputStream和ObjectOutputStream时,行为是正确的。
答案 5 :(得分:0)
您不是在写String
和Integer
个对象的值,而是以二进制格式编写对象表示。这称为object-serialization
。这是一些如何编码来表示与object
相关的所有信息,而不仅仅是value
,只有在我们编码它们时才会显示。因此,正常text editor
无法按预期显示信息。
如果只想保存字符串表示,请使用PrintWriter
等类。
答案 6 :(得分:0)
我尝试了你的代码。它对我来说非常合适。请参见附图。
尝试清理工作区。如果它不起作用,请尝试创建一个新的Java项目并复制在此处发布的相同代码并尝试。它应该工作。
答案 7 :(得分:0)
通过ObjectOutputStream
编写输出字符串是愚蠢的,它会序列化代码中的String
和Integer
对象并保存Object状态以及值宾语。这就是您在打开文件时看到编码文本的原因。以下摘录总结了序列化对象时存储的值:
对象的默认序列化机制写入对象的类,类签名以及所有非瞬态和非静态字段的值。对其他对象的引用(瞬态或静态字段除外)也会导致写入这些对象。使用引用共享机制对单个对象的多个引用进行编码,以便可以将对象图形恢复为与写入原始图像时相同的形状。(ObjectOutputStream
)
writeObject方法负责为其特定类编写对象的状态,以便相应的readObject方法可以恢复它。
原始数据(不包括可序列化字段和可外部化数据)将写入块数据记录中的ObjectOutputStream。块数据记录由标题和数据组成。块数据头由标记和标题后面的字节数组成。(ObjectOutputStream javadoc
)
答案 8 :(得分:-1)
您的代码可能存在的问题是您没有刷新输出数据。因此它可能无法写入输出文件。
请尝试以下代码。
public static void main(String[] args) {
String s = "Hello world!";
int i = 143141141;
try
{
//create new file with an ObjectOutputStream
FileOutputStream out = new FileOutputStream("test.txt");
ObjectOutputStream oout = new ObjectOutputStream(out);
//write something in a file
oout.writeObject(s);
oout.flush();
oout.writeObject(i);
oout.flush();
//close the stream
out.close();
oout.close();
//create an ObjectInputStream for the file we created before
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));
//read and print what we wrote before
System.out.println("" + (String) ois.readObject());
System.out.println("" + ois.readObject());
ois.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
如果你想将你的书面对象读入文件,那么你就不能,因为它们是作为序列化对象编写的。对于文件的文本操作,您可以考虑使用BufferedReader或PrintWriter。请参阅以下代码。
public class WriteToFileExample {
public static void main(String[] args) {
try {
String content = "This is the content to write into file";
File file = new File("c:\\desktop\\filename.txt");
// if file doesnt exists, then create it
if (!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close();
System.out.println("Done");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在此之后,您可以打开文本文件,并以人类可读的形式查看书面内容,最好在将对象写入文件时不要使用“txt”格式。这是误导。
希望这有帮助。