@NotNull private FileAccessorCache.Handle<ZipFile> getZipFileHandle() throws IOException { FileAccessorCache.Handle<ZipFile> handle = ourZipFileFileAccessorCache.get(this); if (getFile() == getFileToUse()) { // files are canonicalized // IDEA-148458, http://bugs.java.com/view_bug.do?bug_id=4425695, JVM crashes on use of opened // ZipFile after it was updated // Reopen file if the file has been changed FileAttributes attributes = FileSystemUtil.getAttributes(getCanonicalPathToZip()); if (attributes == null) { throw new FileNotFoundException(getCanonicalPathToZip()); } if (attributes.lastModified == myFileStamp && attributes.length == myFileLength) return handle; // Note that zip_util.c#ZIP_Get_From_Cache will allow us to have duplicated ZipFile instances // without a problem removeZipHandlerFromCache(); handle.release(); handle = ourZipFileFileAccessorCache.get(this); } return handle; }
// also used in Kotlin public static void clearFileAccessorCache() { ourZipFileFileAccessorCache.clear(); }
private void removeZipHandlerFromCache() { ourZipFileFileAccessorCache.remove(this); }