ObjectInputStream.readObject

时间:2017-12-05 17:55:17

标签: java file eofexception

我的应用程序流式传输Twitter数据并将其写入文件。

while(true){
        Status status = queue.poll();

        if (status == null) {
            Thread.sleep(100);
        }

        if(status!=null){
            list.add(status);
        }

        if(list.size()==10){
            FileOutputStream fos = null;
            ObjectOutputStream out = null;
            try {
                String uuid = UUID.randomUUID().toString();
                String filename = "C:/path/"+topic+"-"+uuid+".ser";
                fos = new FileOutputStream(filename);
                out = new ObjectOutputStream(fos);
                out.writeObject(list);
                tweetsDownloaded += list.size();
                if(tweetsDownloaded % 100==0)
                    System.out.println(tweetsDownloaded+" tweets downloaded");
            //  System.out.println("File: "+filename+" written.");
                out.close();
            } catch (IOException e) {

                e.printStackTrace();
            }

            list.clear();
    }

我有这个从文件中获取数据的代码。

while(true){
    File[] files = folder.listFiles();

    if(files != null){
        Arrays.sort(//sorting...);

        //Here we manage each single file, from data-load until the deletion
        for(int i = 0; i<files.length; i++){
            loadTweets(files[i].getAbsolutePath());
            //TODO manageStatuses
            files[i].delete();
            statusList.clear();
        }

    }

}

方法loadTweets()执行以下操作:

private static void loadTweets(String filename) {

    FileInputStream fis = null;
    ObjectInputStream in = null;
    try{
        fis = new FileInputStream(filename);
        in = new ObjectInputStream(fis);
        statusList = (List<Status>) in.readObject();
        in.close();
    }
    catch(IOException | ClassNotFoundException ex){
        ex.printStackTrace();
    }


}

不幸的是,我不知道为什么有时会抛出一个

  

EOFException类

运行此行时

statusList = (List<Status>) in.readObject();

有谁知道如何解决这个问题?谢谢。

2 个答案:

答案 0 :(得分:2)

我已经看到你正在使用getAbsolutePath()根据你之前的问题正确传递文件

从我读过的内容可能是一些事情,其中​​一个是文件为空。

解释这个想法,你可能已经编写了文件,但有些东西导致文件里面没有任何内容,这可能会导致EOFException。该文件实际上存在它只是空的

修改

尝试将代码括在while(in.available() > 0)

看起来像这样

private static void loadTweets(String filename) {

    FileInputStream fis = null;
    ObjectInputStream in = null;
    try{
        fis = new FileInputStream(filename);
        in = new ObjectInputStream(fis);
        while(in.available() > 0) {
            statusList = (List<Status>) in.readObject();
        }
        in.close();
    }
    catch(IOException | ClassNotFoundException ex){
        ex.printStackTrace();
    }
}

答案 1 :(得分:1)

找出解决这个问题的必要条件。感谢@ VGR的评论,如果文件创建的时间不到一秒钟,我想暂停执行线程0.2秒。

if(System.currentTimeMillis()-files[i].lastModified()<1000){
        Thread.sleep(200);

这可以防止异常,现在应用程序正常工作。