FileInputStream错误

时间:2013-06-03 11:42:48

标签: java file fileoutputstream

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

9 个答案:

答案 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)

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

如果只想保存字符串表示,请使用PrintWriter等类。

答案 6 :(得分:0)

我尝试了你的代码。它对我来说非常合适。请参见附图。 enter image description here

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

答案 7 :(得分:0)

通过ObjectOutputStream编写输出字符串是愚蠢的,它会序列化代码中的StringInteger对象并保存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”格式。这是误导。

希望这有帮助。