有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

ubuntu java。木卫一。FileNotFoundException和(设备上没有剩余空间)

我有这个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"));                         
            }
        }
    }   

}

ReadnPasse函数是:

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有关,inode是一个操作系统问题,我不知道它是什么,它是如何解决的。我在Ubuntu 12.04上


共 (2) 个答案

  1. # 1 楼答案

    大多数文件系统对单个目录中的文件数量有限制。我猜你已经达到了极限。我建议添加一些级别的目录嵌套,这样所有结果文件就不会出现在同一个目录中。此处有一些限制信息:https://stackoverflow.com/a/466596/552759

  2. # 2 楼答案

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

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

    文件系统通常是用大量的inode创建的,所以用完有点不寻常。文件系统上可能有大量非常小或空的文件。我们经常会发现一些程序一直在某个模糊的目录中悄悄地创建空文件。您应该检查文件系统,看看是否有一些文件可以删除。请记住,您正在寻找大量要删除的文件,因为您希望释放大量索引节点。每个文件有多大并不重要

    如果文件系统没有索引节点,那么在您的程序中就没有多少方法可以解决这个问题。如果您的程序创建了一堆空文件,那么您应该重新考虑程序的工作方式。否则,您唯一的选择就是在inode没有问题的其他地方创建文件