MappedByteBuffer在关闭后仍然不能删除文件。
Bug database链接:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=635956
网上查询到两种方法...
第一种:
AccessController.doPrivileged(new PrivilegedAction() { public Object run() { try { Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]); getCleanerMethod.setAccessible(true); sun.misc.Cleaner cleaner = (sun.misc.Cleaner) getCleanerMethod.invoke(byteBuffer, new Object[0]); cleaner.clean(); } catch (Exception e) { e.printStackTrace(); } return null; } });
此种方法需要JDK支持,我用的是JRE 1.6,提示没有 sun.misc.Cleaner 类,JDK包太大,项目又不让用。
第二种方法是显性设置byteBuffer为null,并调用GC,没什么实际意义。实在没招了,又回来使用InputStream。
FileInputStream in = new FileInputStream(file); ByteArrayOutputStream out = new ByteArrayOutputStream((int)file.length()); byte[] cache = new byte[1048576]; for(int i = in.read(cache);i != -1;i = in.read(cache)){ out.write(cache, 0, i); } in.close(); out.close(); messageDigest.update(out.toByteArray()); md5 = bufferToHex(messageDigest.digest());