【问题标题】:Too many files open in system when outputting to a txt file in Java [duplicate]输出到Java中的txt文件时系统中打开的文件太多[重复]
【发布时间】:2014-06-21 18:55:51
【问题描述】:

我正在尝试使用 Eclipse 制作一个通过文本文件并计算 Java 中单词使用量的程序。该程序有效,但我想将输出值保存到文本文件中。我正在使用这段代码来做到这一点:

PrintStream out = new PrintStream(new FileOutputStream("output.txt"));
System.setOut(out);

我用过

throws FileNotFoundException

摆脱文件未找到异常。

当我运行程序时,我收到一个错误提示

Exception in thread "main" java.io.FileNotFoundException: output.txt 
    (Too many open files in system)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
at java.io.FileOutputStream.<init>(FileOutputStream.java:110)
at nGram.HashMapFun.main(HashMapFun.java:66)

我在java项目中做了一个output.txt文件,所以不知道为什么程序找不到。输出来自 HashMap。

我该如何解决这个问题?

提前致谢。

【问题讨论】:

  • 您是否在打开每个文件进行阅读/字数统计后关闭它?你要关闭缓冲区吗?向我们展示整个代码。
  • 每个进程的打开文件引用有一个限制,您的代码似乎没有关闭文件并继续打开许多文件达到该限制
  • 听起来你在某处有资源泄漏
  • 你要关闭直播吗?
  • @JigarJoshi - 我认为这就是问题所在。他可能不会在阅读文件/流后关闭它们。引用太多..

标签: java eclipse filenotfoundexception


【解决方案1】:

我用过
throws FileNotFoundException
摆脱文件未找到异常。

听着,使用throws 不要摆脱异常。

您需要捕获抛出的异常。但是只要有异常,您就不能从该点继续,直到您使用条件语句跳过该阶段。

try {
   // code here
} catch (Exception e) {
   // message here
} 

UNIX 操作系统和其他此类操作系统会将每个进程限制为一次加载多个文件。所以,我认为你在使用 Reader 或 Scanner 时需要关闭它们。

使用这个

scanner.Close(); 

我不知道您的 fileReader 代码扫描仪。所以,你可以用那个重新电镀这个。使用此代码后,您完成工作的文件将被关闭,并且指向它的链接将被关闭。从而使您能够打开一个新文件。

【讨论】:

    【解决方案2】:

    导入 java.io.*; 公共课你好 {

    public static void main(String[] args) 
    {
        try
        {
            /*the File class uses a constructor File("absolute URI")
             * example linux/OSX/Unix
             * File("home/user/workspace/hello.txt);
             * 
             * example Windows
             * File("C:/Documents/hello);+
             */
    
            File file = new File("/home/nirban/hello.txt");
    
            FileOutputStream fis = new FileOutputStream(file);
    
            PrintStream out = new PrintStream(fis);
            System.setOut(out);
            out.println("Hello this is my file");
            out.close();
            fis.close();        
        }
        catch(FileNotFoundException e)
        {
                e.printStackTrace();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
    

    }

    操作后需要关闭输入/输出流, 如果流未关闭,则 JVM 将文件保存在 jvm 进程中 检查文件是否存在 LINUX

    $ ps -e |grep java

    (pid) ? 00:03:42 java

    $lsof -p (pid)

    这将列出JVM运行的所有文件和进程

    感谢并享受......

    【讨论】:

      【解决方案3】:

      关闭 FileOutputStream 和 PrintStream。它会解决你的问题。试试下面的代码

      FileOutputStream fos = new FileOutputStream("output.txt");
      
      PrintStream out = new PrintStream(fos);
      System.setOut(out);
      
      out.close();
      fos.close();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-29
        • 2011-09-10
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多