ARM没有正确关闭文件,最终会导致太多打开的文件

时间:2014-08-13 06:07:57

标签: java file nio

不确定我的代码的哪一部分会导致问题的确切问题,但是当我开始查明问题时,我注意到当我运行以下代码时,打开的文件数会增加。

public synchronized String readStringSync(String basePath,String path){

                if(useLegacy){
                        return readStringLegacy(basePath,path);

                }
                if(!basePath.endsWith("/"))
                        basePath+="/";
                StringBuffer sb = new StringBuffer(420);
                File f= new File(basePath+path);
                if(!f.exists()){
                        return null;
                }
                Charset charset = Charset.forName("UTF-8");
                try (BufferedReader reader = Files.newBufferedReader(Paths.get(f.getAbsolutePath()), charset)) {
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                                sb.append(line+"\r\n");

                        }
                        String ret = sb.toString();

                        if(ret.trim().startsWith("deleted")||ret.trim().equalsIgnoreCase("dummy"))
                                return null;
                        return ret;

                } catch (Exception ex) {
                        ex.printStackTrace();
                        return null;
                }

        }

        public static void main(String... args) throws Exception{

                com.sun.management.UnixOperatingSystemMXBean mxb = (com.sun.management.UnixOperatingSystemMXBean)java.lang.management.ManagementFactory.getOperatingSystemMXBean();
                System.out.println(mxb.getOpenFileDescriptorCount());  //11

                System.out.println(readString("sometestfile"));

                Thread.sleep(1000);

                mxb = (com.sun.management.UnixOperatingSystemMXBean)java.lang.management.ManagementFactory.getOperatingSystemMXBean();
                System.out.println(mxb.getOpenFileDescriptorCount()); //12 wtf


        }

我已经尝试摆脱File.exists并将其替换为Files.exists,但这绝对没有。

由于stackoverflow仍然抱怨缺乏细节,这里是我正在使用的java版本:

java version" 1.7.0_51" OpenJDK运行时环境(IcedTea 2.4.4)(7u51-2.4.4-0ubuntu0.13.04.2) OpenJDK 64位服务器VM(构建24.45-b08,混合模式)

2 个答案:

答案 0 :(得分:1)

try-with-resources语句正确关闭了流/阅读器,您不必担心。

如果您遇到文件保持打开状态,则不是因为代码中存在错误。如果您在系统范围内打开文件相对较低,则出于性能原因,您的操作系统甚至JVM可能会暂时保持打开状态,如果这成为问题则关闭它们。在您身边,您无法做更多事情,您可以使用try-with-resources声明正确关闭它。

答案 1 :(得分:0)

摆脱了java.nio.parts并用以下代码替换了try行:      try(BufferedReader reader = new BufferedReader(new FileReader(basePath + path))){

文件计数现在保持在11,但不确定我使用java.nio开始的问题是否为&还不确定这是否解决了主要问题。