提交 d94bcee3 编写于 作者: A alanb

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

Reviewed-by: alanb
Contributed-by: mike.skells@talk21.com
上级 1d489b23
...@@ -363,6 +363,17 @@ public final class Files { ...@@ -363,6 +363,17 @@ public final class Files {
// -- Directories -- // -- 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 * Opens a directory, returning a {@link DirectoryStream} to iterate over
* all entries in the directory. The elements returned by the directory * all entries in the directory. The elements returned by the directory
...@@ -397,12 +408,7 @@ public final class Files { ...@@ -397,12 +408,7 @@ public final class Files {
public static DirectoryStream<Path> newDirectoryStream(Path dir) public static DirectoryStream<Path> newDirectoryStream(Path dir)
throws IOException throws IOException
{ {
return provider(dir).newDirectoryStream(dir, new DirectoryStream.Filter<Path>() { return provider(dir).newDirectoryStream(dir, AcceptAllFilter.FILTER);
@Override
public boolean accept(Path entry) {
return true;
}
});
} }
/** /**
......
...@@ -124,26 +124,27 @@ class WindowsDirectoryStream ...@@ -124,26 +124,27 @@ class WindowsDirectoryStream
private boolean atEof; private boolean atEof;
private String first; private String first;
private Path nextEntry; private Path nextEntry;
private String prefix;
WindowsDirectoryIterator(String first) { WindowsDirectoryIterator(String first) {
atEof = false; atEof = false;
this.first = first; 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 ".." // applies filter and also ignores "." and ".."
private Path acceptEntry(String s, BasicFileAttributes attrs) { 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 Path entry = WindowsPath
.createFromNormalizedPath(dir.getFileSystem(), s, attrs); .createFromNormalizedPath(dir.getFileSystem(), prefix + s, attrs);
try { try {
if (filter.accept(entry)) if (filter.accept(entry))
return entry; return entry;
...@@ -157,7 +158,7 @@ class WindowsDirectoryStream ...@@ -157,7 +158,7 @@ class WindowsDirectoryStream
private Path readNextEntry() { private Path readNextEntry() {
// handle first element returned by search // handle first element returned by search
if (first != null) { if (first != null) {
nextEntry = acceptEntry(first, null); nextEntry = isSelfOrParent(first) ? null : acceptEntry(first, null);
first = null; first = null;
if (nextEntry != null) if (nextEntry != null)
return nextEntry; return nextEntry;
...@@ -184,6 +185,10 @@ class WindowsDirectoryStream ...@@ -184,6 +185,10 @@ class WindowsDirectoryStream
return null; return null;
} }
// ignore link to self and parent directories
if (isSelfOrParent(name))
continue;
// grab the attributes from the WIN32_FIND_DATA structure // grab the attributes from the WIN32_FIND_DATA structure
// (needs to be done while holding closeLock because close // (needs to be done while holding closeLock because close
// will release the buffer) // will release the buffer)
......
...@@ -120,12 +120,18 @@ class WindowsPathParser { ...@@ -120,12 +120,18 @@ class WindowsPathParser {
off = next; off = next;
} else { } else {
if (isLetter(c0) && c1 == ':') { if (isLetter(c0) && c1 == ':') {
root = input.substring(0, 2); char c2;
if (len > 2 && isSlash(input.charAt(2))) { 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; off = 3;
root += "\\";
type = WindowsPathType.ABSOLUTE; type = WindowsPathType.ABSOLUTE;
} else { } else {
root = input.substring(0, 2);
off = 2; off = 2;
type = WindowsPathType.DRIVE_RELATIVE; type = WindowsPathType.DRIVE_RELATIVE;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册