0

我有这段代码,只是为了尝试将其写入文件。但是当我编译它时,它没有显示任何错误,但我的文件中的文本是不可读的,一些 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();
    }
}
4

9 回答 9

2

使用ObjectOutputStream,您Serialization用于将对象写入文件。序列化使用的是编码系统,并且您ObjectInputStream在程序中正确使用了 an 来解码这些对象。但是您将无法读取序列化过程创建的文件中的信息。

于 2013-06-03T11:48:21.090 回答
2

由于您使用的是 ObjectOutputStream 和 ObjectInputStream ,因此它将写入不可读的 Object 代码,并且当您从文件中读取时,它也会以 Object 的形式出现,因此再次以 Object 的形式出现,

使用 BufferedReader 或 Writer 将 String 写入文件,可以读取

FileReader f=new FileReader(new File("test.txt"));
BufferedReader f1=new BufferedReader(f)

;

于 2013-06-03T11:49:06.157 回答
0

你应该用PrintWriter写文本文件,ObjectOutputStream写二进制数据。

于 2013-06-03T11:47:06.247 回答
0

Java ObjectOuputStream 以二进制非人类可读格式写入对象,该格式只能使用 ObjectInputStream 读取。

于 2013-06-03T11:49:41.877 回答
0

我试过你的代码。它对我来说非常有效。见附图。在此处输入图像描述

尝试清洁您的工作区。如果它不起作用,请尝试创建一个新的 Java 项目并复制此处发布的相同代码并尝试。它应该工作。

于 2013-06-03T12:07:46.780 回答
0

您正在愚蠢地编写输出字符串,ObjectOutputStream它通过序列化代码中的StringInteger对象并将对象状态与对象的值一起保存。这就是您在打开文件时看到编码文本的原因。以下摘录总结了对象被序列化时存储的值:

对象的默认序列化机制写入对象的类、类签名以及所有非瞬态和非静态字段的值。对其他对象的引用(瞬态或静态字段除外)也会导致这些对象被写入。对单个对象的多个引用使用引用共享机制进行编码,以便对象的图形可以恢复到与原始对象相同的形状。( ObjectOutputStream)

writeObject 方法负责为其特定类写入对象的状态,以便相应的 readObject 方法可以恢复它。

原始数据(不包括可序列化字段和可外部化数据)以块数据记录的形式写入 ObjectOutputStream。块数据记录由标题和数据组成。块数据头由一个标记和跟随头的字节数组成。( ObjectOutputStream javadoc)

于 2013-06-03T12:32:53.137 回答
0

您的代码对我来说工作正常。如果我通过在编辑器(比如记事本或 Eclipse)中打开文件内容来查看文件内容时理解正确,您会看到其中存储为二进制内容的字符。当您使用 ObjectInputStream 和 ObjectOutputStream 时,行为是正确的。

于 2013-06-03T11:53:44.917 回答
0

您不是在编写您的StringInteger对象的值,而是以二进制格式编写它们的对象表示。那就是所谓的object-serialization。这是一些如何编码以表示与它相关的所有信息,object不仅它value仅在以与我们编码它们相同的方式解码时显示。因此,正常text editor无法按您的预期显示信息。

如果您只想保存字符串表示形式,请使用PrintWriter.

于 2013-06-03T11:54:20.493 回答
-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”格式是一种很好的做法。这是误导。

希望这可以帮助。

于 2013-06-03T11:45:09.373 回答