8376294: ZipFile.Source.Key should not hold on to its BasicFileAttributes instance

Reviewed-by: jpai
This commit is contained in:
Eirik Bjørsnøs 2026-01-27 10:25:58 +00:00
parent ee2deaded8
commit e0445c09f7

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1995, 2025, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1995, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -37,6 +37,7 @@ import java.nio.charset.Charset;
import java.nio.file.InvalidPathException;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.Files;
import java.nio.file.attribute.FileTime;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.IntFunction;
@ -1444,11 +1445,13 @@ public class ZipFile implements ZipConstants, Closeable {
* The unique combination of these components identifies a Source of a ZipFile.
*/
private static class Key {
private final BasicFileAttributes attrs;
private final File file;
private final Object fileKey;
private final FileTime lastModifiedTime;
// the Charset that was provided when constructing the ZipFile instance
private final Charset charset;
/**
* Constructs a {@code Key} to a {@code Source} of a {@code ZipFile}
*
@ -1457,7 +1460,8 @@ public class ZipFile implements ZipConstants, Closeable {
* @param charset the Charset that was provided when constructing the ZipFile instance
*/
public Key(File file, BasicFileAttributes attrs, Charset charset) {
this.attrs = attrs;
this.fileKey = attrs.fileKey();
this.lastModifiedTime = attrs.lastModifiedTime();
this.file = file;
this.charset = charset;
}
@ -1465,10 +1469,9 @@ public class ZipFile implements ZipConstants, Closeable {
@Override
public int hashCode() {
long t = charset.hashCode();
t += attrs.lastModifiedTime().toMillis();
Object fk = attrs.fileKey();
t += lastModifiedTime.toMillis();
return Long.hashCode(t) +
(fk != null ? fk.hashCode() : file.hashCode());
(fileKey != null ? fileKey.hashCode() : file.hashCode());
}
@Override
@ -1477,12 +1480,12 @@ public class ZipFile implements ZipConstants, Closeable {
if (!charset.equals(key.charset)) {
return false;
}
if (!attrs.lastModifiedTime().equals(key.attrs.lastModifiedTime())) {
if (!lastModifiedTime.equals(key.lastModifiedTime)) {
return false;
}
Object fk = attrs.fileKey();
if (fk != null) {
return fk.equals(key.attrs.fileKey());
if (fileKey != null) {
return fileKey.equals(key.fileKey);
} else {
return file.equals(key.file);
}