不确定我的代码的哪一部分会导致问题的确切问题,但是当我开始查明问题时,我注意到当我运行以下代码时,打开的文件数会增加。
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,混合模式)
答案 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开始的问题是否为&还不确定这是否解决了主要问题。