Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ARM没有';无法正确关闭文件,最终导致打开的文件过多_Java_File_Nio - Fatal编程技术网

Java ARM没有';无法正确关闭文件,最终导致打开的文件过多

Java ARM没有';无法正确关闭文件,最终导致打开的文件过多,java,file,nio,Java,File,Nio,不确定我的代码的哪一部分确实导致了问题,但当我开始确定问题时,我注意到当我运行以下代码时,打开的文件数增加了 public synchronized String readStringSync(String basePath,String path){ if(useLegacy){ return readStringLegacy(basePath,path); }

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

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版本“1.7.0_51” OpenJDK运行时环境(IcedTea 2.4.4)(7u51-2.4.4-0ubuntu0.13.04.2)
OpenJDK 64位服务器VM(build 24.45-b08,混合模式)

try with resources语句正确地关闭了流/读取器,您不必担心这一点


如果您体验到文件保持打开状态,那么这不是由于代码中的错误造成的。如果系统范围内打开的文件相对较少,那么出于性能原因,操作系统甚至JVM可能会将其打开一段时间,如果出现问题,则关闭它们。从您的角度看,您无法做更多的事情,您可以使用
try with resources
语句正确地关闭它。

去掉java.nio.parts,并用以下内容替换try行: try(BufferedReader=new BufferedReader(new FileReader(basePath+path))){


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

useLegacy的值是多少?
readStringLegacy()
中可能存在问题。尝试添加if(true)返回null;就在try块=>文件计数保持在11之前,因此try块编写了一个
for
循环,循环次数约为1000次,在该循环中调用相同的
readStringSync()
读取同一个文件。打印之后打开的文件计数。尝试将等待时间设为10秒,并用System.gc()将其放在前面,没有效果ZA,仍然有12个打开的文件问题是,整个事情最终开始抛出FileNotFoundException:打开的文件太多,这是我需要担心的。你发布的代码不会导致资源泄漏。如果我找到这个问题,我会查看你代码中的其他地方。结果表明,泄漏的主要原因是确实是在其他地方。打开的文件仍然有一些增加,但要低得多,我不能再让它爆炸成4图了,所以这可能也是由于一些优化。