7103889: (fs) Reduce String concatenation when iterating over directory

Reviewed-by: alanb
This commit is contained in:
Mike Skells 2011-10-30 14:53:43 +00:00 committed by Alan Bateman
parent bdb9312b86
commit 247532bf34
3 changed files with 38 additions and 21 deletions

View File

@ -363,6 +363,17 @@ public final class Files {
// -- Directories --
private static class AcceptAllFilter
implements DirectoryStream.Filter<Path>
{
private AcceptAllFilter() { }
@Override
public boolean accept(Path entry) { return true; }
static final AcceptAllFilter FILTER = new AcceptAllFilter();
}
/**
* Opens a directory, returning a {@link DirectoryStream} to iterate over
* all entries in the directory. The elements returned by the directory
@ -397,12 +408,7 @@ public final class Files {
public static DirectoryStream<Path> newDirectoryStream(Path dir)
throws IOException
{
return provider(dir).newDirectoryStream(dir, new DirectoryStream.Filter<Path>() {
@Override
public boolean accept(Path entry) {
return true;
}
});
return provider(dir).newDirectoryStream(dir, AcceptAllFilter.FILTER);
}
/**

View File

@ -124,26 +124,27 @@ class WindowsDirectoryStream
private boolean atEof;
private String first;
private Path nextEntry;
private String prefix;
WindowsDirectoryIterator(String first) {
atEof = false;
this.first = first;
if (dir.needsSlashWhenResolving()) {
prefix = dir.toString() + "\\";
} else {
prefix = dir.toString();
}
}
// links to self and parent directories are ignored
private boolean isSelfOrParent(String name) {
return name.equals(".") || name.equals("..");
}
// applies filter and also ignores "." and ".."
private Path acceptEntry(String s, BasicFileAttributes attrs) {
if (s.equals(".") || s.equals(".."))
return null;
if (dir.needsSlashWhenResolving()) {
StringBuilder sb = new StringBuilder(dir.toString());
sb.append('\\');
sb.append(s);
s = sb.toString();
} else {
s = dir + s;
}
Path entry = WindowsPath
.createFromNormalizedPath(dir.getFileSystem(), s, attrs);
.createFromNormalizedPath(dir.getFileSystem(), prefix + s, attrs);
try {
if (filter.accept(entry))
return entry;
@ -157,7 +158,7 @@ class WindowsDirectoryStream
private Path readNextEntry() {
// handle first element returned by search
if (first != null) {
nextEntry = acceptEntry(first, null);
nextEntry = isSelfOrParent(first) ? null : acceptEntry(first, null);
first = null;
if (nextEntry != null)
return nextEntry;
@ -184,6 +185,10 @@ class WindowsDirectoryStream
return null;
}
// ignore link to self and parent directories
if (isSelfOrParent(name))
continue;
// grab the attributes from the WIN32_FIND_DATA structure
// (needs to be done while holding closeLock because close
// will release the buffer)

View File

@ -120,12 +120,18 @@ class WindowsPathParser {
off = next;
} else {
if (isLetter(c0) && c1 == ':') {
root = input.substring(0, 2);
if (len > 2 && isSlash(input.charAt(2))) {
char c2;
if (len > 2 && isSlash(c2 = input.charAt(2))) {
// avoid concatenation when root is "D:\"
if (c2 == '\\') {
root = input.substring(0, 3);
} else {
root = input.substring(0, 2) + '\\';
}
off = 3;
root += "\\";
type = WindowsPathType.ABSOLUTE;
} else {
root = input.substring(0, 2);
off = 2;
type = WindowsPathType.DRIVE_RELATIVE;
}