Hi, Jumping in a bit late to this thread…
To achieve this with parity to the non-Stream walk method we would need to implement a FileTreeSpliterator that accepts a FileVistor for the purposes of specialised filtering. You can do this with an Iterator-based implementation from which a Spliterator can be created from, but you could just as easily inherit from AbstractSpliterator. Then we could surface a new method accepting a FileVistor. You could implement your own Spliterator along such lines then create a Stream from it. If you go that route and wanna contribute back to OpenJDK I would be happy to help in the acceptance and processing of such a contribution. Paul. > On 25 May 2016, at 09:39, Gilles Habran <gilleshab...@gmail.com> wrote: > > Hi Henry, > > I knew there was a work around as I created something similar than yours > when I needed it. :) > > Apparently, we have two different opinions regarding Files.walk() and how > this method is supposed to handle permissions. I just sent this email > because I felt that Files.walk() didn't behave like it should, maybe I am > wrong. > > I read everything from my root directory so it makes sense that that I > don't have the permissions to read everything (I'll get the same thing when > I read /proc for sure) but what happens the day I walk the home directory > of the user as the user. I am supposed to have access to everything in > there, right ? My application will just crash if there is a dirty file in > there with bad permissions and there is nothing I can do about it... not > with Files.walk(). > > To be sure that I don't have a problem, I will need to create my own method > like yours because I would take a great risk using Files.walk() if I get an > exception that stops my process in case there is an unexpected file with > bad permissions. > > Have a nice day. > > Best regards, > > Gilles > > On 25 May 2016 at 08:23, Henry Jen <henry....@oracle.com> wrote: > >> I think there is a work-around, use list() and flatMap() should get you >> what you needed. >> >> The API is designed to walk a tree where you suppose to have access with. >> If OS level cause an IOException, that need to be dealt with. Acknowledged >> that exception handling is not a strong suite in Stream API, developer will >> need to do some work. >> >> Files.find() also allows you to get entries and filter out by permission. >> What you can do is make sure you have permission on the top level, then >> call find with maxDepth 1 to only get entries on that directory. >> >> Combined with flatMap(), you should be able to get what you want. Try the >> following code to see if it works for you. >> >> import java.nio.file.Files; >> import java.nio.file.Path; >> import java.nio.file.Paths; >> import java.util.stream.Stream; >> import java.io.IOException; >> >> public class ListCanRead { >> static Stream<Path> walkReadable(Path p) { >> if (Files.isReadable(p)) { >> if (Files.isDirectory(p)) { >> try { >> return Stream.concat(Stream.of(p), Files.list(p)); >> } catch (IOException ioe) { >> return Stream.of(p); >> } >> } else { >> return Stream.of(p); >> } >> } >> return Stream.of(p); >> } >> >> public static void main(String[] args) throws IOException { >> System.out.println("List directory: " + args[0]); >> walkReadable(Paths.get(args[0])).flatMap(ListCanRead::walkReadable) >> .forEach(System.out::println); >> >> Files.walk(Paths.get(args[0])) >> .forEach(System.out::println); // Could throw >> AccessDeniedException >> } >> } >> >> Cheers, >> Henry >> >> On May 24, 2016 at 4:48:30 PM, Gilles Habran (gilleshab...@gmail.com) >> wrote: >>> Good morning, >>> >>> well I would like to be able to manage the outcome of the processing >> myself >>> and not get an exception in a part where I have no control. >>> >>> For example, I would expect to get an exception when I tried to read a >> file >>> where I don't have the permission. I would not expect to get an exception >>> when Java creates the Stream. >>> >>> Maybe I am the only one to have a problem with this ? I don't know but it >>> feels strange to be forced to execute a software with root permissions >>> where I don't even plan to read file I cannot read because of lack of >>> permissions. >>> >>> For me, we should be able to test the attributes of a file and depending >> on >>> the result, read the file or not. If we read the file without permission, >>> we get an exception, if not, we can go to the next file without error. >>> >>> If that's unclear, please let me know, I'll try to give more informations >>> or examples. >>> >>> Thank you. >>> >>> On 24 May 2016 at 10:19, Andrew Haley wrote: >>> >>>> On 05/20/2016 10:38 AM, Gilles Habran wrote: >>>>> why is my message still waiting for approval after a month ? >>>> >>>> What is it you want Java to do? You can't walk the directory >>>> because you don't have permission. sudo should work. >>>> >>>> Andrew. >>>> >>>> >>> >> >>