java.io.FileNotFoundException和(设备上没有剩余空间)

时间:2014-07-01 11:37:58

标签: java ubuntu file-io inode

我有这个Java代码,它应该读取0.5M文件并在删除一些无用信息后写入(我正在使用安然电子邮件数据集)

public void getInboxFiles(File directory){
    File[] usersFolders;
    File[] userFolders;
    File[] inboxFiles;
    usersFolders = directory.listFiles();
    for(File temp:usersFolders){
        userFolders = temp.listFiles();         
        for(File temp2:userFolders){                                    
            inboxFiles = temp2.listFiles();
            for(File tmp3:inboxFiles){
                if(tmp3.isDirectory())
                    continue;                       
                readNPrase(tmp3, new File("/media/ADATA SH12/datasets/parsedEnron/"+temp.getName()+tmp3.getName()+".txt"));                         
            }
        }
    }   

}

函数readNParse是:

public void readNPrase(File in,File out){
    BufferedReader br=null;
    BufferedWriter bw =null;
    try{
        br = new BufferedReader(new FileReader(in));
        bw= new BufferedWriter(new FileWriter(out));
        boolean messageContent = false;
        String line = null;
        while((line = br.readLine()) != null){              
            if(line.trim().equals(""))
                messageContent = true;
            if(messageContent && !isHeader(line) && !line.trim().equals("")){
                bw.write(line);
                bw.newLine();
            }

        }
            bw.flush();
            br.close();
            bw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        try{
            bw.close();
            br.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

运行此代码10分钟后,它停止工作,并给了我这个错误:

java.lang.NullPointerException java.io.FileNotFoundException: /media/ADATA SH12/datasets/parsedEnron/causholli-m98.txt (No space left on device)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
at java.io.FileWriter.<init>(FileWriter.java:90)
at EnronMailParser.readNPrase(EnronMailParser.java:16)
at EnronMailParser.getInboxFiles(EnronMailParser.java:71)
at EnronMailParser.main(EnronMailParser.java:84)

我检查了驱动器上的空间,但是空间太大了 有些人说它与文件名有关,有些人说它与inode有关,这是一个os问题,我不知道它是什么以及如何解决它。我在Ubuntu 12.04上。

2 个答案:

答案 0 :(得分:8)

正如您所指出的那样,“设备上没有剩余空间”可能意味着您没有存储新文件的文件系统上的inode。 Unix文件系统(包括Ubuntu)通常对存储在文件系统中的每个文件使用称为 inode 的数据结构。创建文件系统时,inode的数量是固定的,它限制了可以在文件系统中创建的文件数。如果文件系统没有inode,即使有空闲空间,也无法创建新文件。

您可以运行df -i来查看每个文件系统有多少个inode以及有多少inode。

文件系统通常是用大量的inode创建的,因此用完它有点不寻常。文件系统上可能有大量非常小或空的文件。发现一些程序在一些不起眼的目录中悄悄地创建空文件并不罕见。您应该检查文件系统以查看是否有一些文件可以删除。请记住,您正在寻找要删除的大型数字文件,因为您要释放大量的inode。每个文件的大小并不重要。

如果文件系统没有inode,那么在程序中你可以做很多事情来解决这个问题。如果您的程序是创建一堆空文件的程序,那么您应该重新考虑程序的工作方式。否则,您唯一的选择是在其他地方创建文件,其中inode不是问题。

答案 1 :(得分:4)

大多数文件系统对可以在单个目录中的文件数量有限制。我猜你正在达到这个极限。我建议添加一些级别的目录嵌套,以便所有结果文件不会在同一目录中。这里有一些限制信息:https://stackoverflow.com/a/466596/552759