我的应用程序流式传输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();
有谁知道如何解决这个问题?谢谢。
答案 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);
这可以防止异常,现在应用程序正常工作。