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. > > > > > > > > > >