在java上读取.dat文件获取null

时间:2013-11-27 12:18:14

标签: java readfile

我从java开始,现在我正在做一些关于读/写文件的练习。

我用这种格式写字符串:

String wordList: word1 word2 word3; word4 word5 word6; code

然后我使用以下代码将其写入文件:

public void writeSelling(String wordList) throws IOException {

        fileOutPutStream = new FileOutputStream (file);
        write= new ObjectOutputStream (fileOutPutStream);
        write.writeObject(wordList);
        write.close();
        contador++;
    }

但是我无法正确地阅读它。现在,我在阅读文件内容时得到的是null,所以我认为我在这个方法上做错了。

这是我用来读取文件的方法:

public ArrayList<Object> readSelling() throws Exception, FileNotFoundException, IOException {

    ArrayList<Object> objectList = new ArrayList<Object>();
    fileInPutStream = new FileInputStream (file);
    read= new ObjectInputStream (fileInPutStream);
    for (int i=0; i<contador; i++){
        objectList.add(read.readObject());
    }
    read.close();
    return objectList;
}

我在主文件上以这种方式调用此方法:

public static void listSelling(){
    ArrayList objects;
    try{
        objects = sellingObject.readSelling();
        for (Iterator it = sellingObject.iterator(); it.hasNext();) {
            String s = (String)it.next();
            System.out.println(s.toString());
        }
    }catch(FileNotFoundException fnfe){
        System.out.println(fnfe.getMessage());
    }catch(IOException ioe){
        System.out.println(ioe.getMessage());
    }catch(Exception e){
        System.out.println(e.getMessage());
    }
}

我没有足够的知识与迭代器一起工作,所以也许我没有正确使用它。

更新 - “file.dat

的定义

此文件在其他类中以这种方式定义:

private final String file;

public WriteReadObject(String file){
    this.file= file;
}

然后在主文件中以这种方式调用:

static WriteReadObject selling= new WriteReadObject("file.dat");

更新2 -

我看到当我写入文件时,我正在写一个空值,这就是它失败的地方。

我有这个:

String one = word1 word2 word3

String two = word4 word5 word6

在调用write方法写入文件之前,我将这两个字符串添加到另一个字符串中以获得只有一个字符串。为此,我创建了这个方法:

public String add(String c, String m){
    sellinglist[contador] = c + m;
    contador++;
    String list= sellinglist[contador];
    return list;
}

其中c是字符串1,而m是字符串2

2 个答案:

答案 0 :(得分:1)

问题是你正在编写单个对象并尝试读取一个对象数组。每次编写对象时都会重写当前文件。更改输出流的打开以将数据附加到文件(但在编写第一个对象时不要忘记清除它):

fileOutPutStream = new FileOutputStream (file, contador != 0);

答案 1 :(得分:1)

alexey28 说的是正确的 - 你正在重写文件,最后只有最后一次插入。无论如何,仅仅更改FileOutputStream参数以使其工作并不是那么简单 - 您不能只追加到ObjectOuputStream - 如果您愿意,请参阅here。它会破坏流将导致StreamCorruptedException。

最好的解决方案是在开始时打开ObjectOutputStream一次,写下你想要的所有对象,然后关闭流。

<小时/> 更新

这一切都取决于你如何接收要写入的数据(如果你正在编写字符串,那么在二进制模式下执行它可能会更舒服但是文本 - here是教程,它解释了如何那样做。)

如果你想要代码如何简单地编写字符串列表,那么你可以试试这个:

/* writing */
public void writeSelling(List<String> wordLists) throws IOException {
    fileOutPutStream = new FileOutputStream (file);
    write= new ObjectOutputStream (fileOutPutStream);
    for (String s : wordLists) {
        write.writeObject(s);
    }
    write.close();
    contador++;
}

现在,您可以在调用writeSelling()的位置更改代码。

/* calling method */
List<String> wordLists = new ArrayList<String>();
{ // it's probably loop
    String wordList = // somehow receive list like word1 word2 word3; word4 word5 word6; code
    wordLists.add(wordList);
}
writeSelling(wordLists);

其余的保持不变。不要多次调用writeSelling()方法,只需一次。