private void fetchNextIfNeeded() { if (next == null) { FileTreeWalker.Event ev = walker.next(); while (ev != null) { IOException ioe = ev.ioeException(); if (ioe != null) throw new UncheckedIOException(ioe); // END_DIRECTORY events are ignored if (ev.type() != FileTreeWalker.EventType.END_DIRECTORY) { next = ev; return; } ev = walker.next(); } } }
@Override public Event next() { if (!walker.isOpen()) throw new IllegalStateException(); fetchNextIfNeeded(); if (next == null) throw new NoSuchElementException(); Event result = next; next = null; return result; }
/** * Creates a new iterator to walk the file tree starting at the given file. * * @throws IllegalArgumentException if {@code maxDepth} is negative * @throws IOException if an I/O errors occurs opening the starting file * @throws SecurityException if the security manager denies access to the starting file * @throws NullPointerException if {@code start} or {@code options} is {@ocde null} or the options * array contains a {@code null} element */ FileTreeIterator(Path start, int maxDepth, FileVisitOption... options) throws IOException { this.walker = new FileTreeWalker(Arrays.asList(options), maxDepth); this.next = walker.walk(start); assert next.type() == FileTreeWalker.EventType.ENTRY || next.type() == FileTreeWalker.EventType.START_DIRECTORY; // IOException if there a problem accessing the starting file IOException ioe = next.ioeException(); if (ioe != null) throw ioe; }
@Override public boolean hasNext() { if (!walker.isOpen()) throw new IllegalStateException(); fetchNextIfNeeded(); return next != null; }
@Override public void close() { walker.close(); }