【问题标题】:Read .dat file on java gets null在 java 上读取 .dat 文件为空
【发布时间】:2013-11-27 12:18:13
【问题描述】:

我是从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++;
    }

但我不能正确地做到这一点是在阅读时。目前,我在读取文件内容时得到的是空值,所以我认为我在方法上做错了。

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

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 --

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

我有这个:

字符串一 = word1 word2 word3

字符串二 = 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 y 是字符串 2

【问题讨论】:

  • 我认为我们遗漏了一些关键细节,无法在这里为您提供帮助。 file 变量的声明在哪里,是否曾为其赋值?
  • 打开你的文件,检查数据是否已经被你的代码写入文件中。
  • @nineside 我已经用文件定义更新了帖子
  • @masmic_87 交换行 contador++;String list= sellinglist[contador];
  • @masmic_87 改变位置,让它:sellinglist[contador] = c + m; String list= sellinglist[contador]; contador++; return list;

标签: java readfile


【解决方案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() 方法,只调用一次。

【讨论】:

  • 我从 java 开始,这有点超出我的知识范围,所以,如果你能用我的代码来编辑一个例子来说明如何做到这一点,我将不胜感激
  • @masmic_87 这个呢?
  • 我首先尝试使用我的代码,我看到当我在文件上写入时,只有 1 个字符串,我手动打开文件并且没有写入任何内容。那么在用你的代码调整代码之前,为什么会这样呢??
  • @masmic_87 您的writeSelling() 方法正确且有效。尝试用fileOutPutStream = new FileOutputStream ("test.txt"); 替换fileOutPutStream = new FileOutputStream (file); 行(在writeSelling() 方法中并只用一行运行main() - writeSelling("i'm sure it works");。结果你应该得到一个大小超过0kB 的test.txt 文件:)跨度>
  • 感谢@Maciej Dobrowolski,但我发现它在哪里做错了。看看你是否可以帮助我。我认为这是一件容易的事情,但我找不到我正在做的事情。我现在正在更新帖子
【解决方案2】:

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

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

【讨论】:

  • 我将如何在我的代码中执行此操作?抱歉,正如我所说,我还在学习 java
  • 根据 contador 计数器逻辑编辑我的答案
  • 我想我明白你指的是什么,但是,你能解释一下你发布的内容到底是什么吗?我必须能够多次调用将字符串写入文件的方法。每次调用该方法,它只写入一个字符串,但是这个字符串并不能覆盖文件内部的实际字符串,所以如果我调用3次该方法,它里面应该有3个字符串。
猜你喜欢
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多