JDK 10 RFR of 8182710: File.listRoots() always returns the root of CD drive
Peter Levart
peter.levart at gmail.com
Sat Jun 24 21:07:12 UTC 2017
Hi Brian,
On 06/23/2017 11:56 PM, Brian Burkhalter wrote:
> Please review at your convenience.
>
> https://bugs.openjdk.java.net/browse/JDK-8182710
> http://cr.openjdk.java.net/~bpb/8182710/webrev.00/
>
> The listRoots() method invokes the GetLogicalDrives() Windows function [1] which may set the bit for a CD’s logical drive even if no CD is currently inserted which also means that the root at which the CD file system would exist were a CD inserted is included in the returned list even though that file system location does not actually exist. This change eliminates including any locations implied by a set bit in the return value of GetLogicalDrives() if that location does not exist.
>
> Thanks,
>
> Brian
>
> [1] https://msdn.microsoft.com/en-us/library/windows/desktop/aa364972(v=vs.85).aspx
This looks good, but since this is not a performance-critical method,
why not use streams?
For exmaple:
public File[] listRoots() {
int ds = listRoots0();
return IntStream
.range(0, 26)
.filter(i -> ((ds >> i) & 1) != 0)
.mapToObj(i -> new File((char)('A' + i) + ":" + slash))
.filter(f -> access(f.getPath()) && f.exists())
.toArray(File[]::new);
}
Isn't this nicer compared to:
public File[] listRoots() {
int ds = listRoots0();
ArrayList<File> fs = new ArrayList<File>(Integer.bitCount(ds));
char slash = this.slash;
for (int i = 0; i < 26; i++) {
if (((ds >> i) & 1) != 0) {
File f = new File((char)('A' + i) + ":" + slash);
if (access(f.getPath()) && f.exists()) {
fs.add(f);
}
}
}
return fs.toArray(new File[fs.size()]);
}
Regards, Peter
More information about the core-libs-dev
mailing list