Java dir/files list -
i trying list directories , files within directory, while "d:\data" works, "d:\" doesn't. "d" secondary disk.
this exception:
exception in thread "main" java.lang.nullpointerexception @ java.util.objects.requirenonnull(objects.java:203) @ java.util.arrays$arraylist.<init>(arrays.java:3813) @ java.util.arrays.aslist(arrays.java:3800) @ project.1.scavenger.listf(scavenger.java:19) @ project.1.scavenger.listf(scavenger.java:30) @ project.1.scavenger.listf(scavenger.java:30) @ project.1.main(project1.java:28) java result: 1 build successful (total time: 0 seconds)
code:
public static list<file> listf(string directoryname) throws ioexception { file directory = new file(directoryname); list<file> resultlist = new arraylist<file>(); // files directory file[] flist = directory.listfiles(); resultlist.addall(arrays.aslist(flist)); (file file : flist) { if (file.isfile()) { system.out.println(file.getabsolutepath()); try { system.out.println(scavenger.checkmime(file.getabsolutepath())); } catch (exception ex) { } } else if (file.isdirectory()) { resultlist.addall(listf(file.getabsolutepath())); } } // system.out.println(flist); return resultlist; } public static string checkmime(string fl) throws malformedurlexception, ioexception { file file = new file(fl); string mimetype = file.tourl().openconnection().getcontenttype(); // system.out.println(mimetype); return mimetype; }
what's wrong code?
removed error version
in recursion never ask null values. , should run this:
public static list<file> listf(string directoryname) throws ioexception { file directory = new file(directoryname); list<file> resultlist = new arraylist<>(); // files directory file[] flist = directory.listfiles(); // missing if (flist == null) { return null; } resultlist.addall(arrays.aslist(flist)); (file file : flist) { if (file.isfile()) { system.out.println(file.getabsolutepath()); try { system.out.println(checkmime(file.getabsolutepath())); } catch (exception ex) { } } else if (file.isdirectory()) { // ask here if null list<file> files = listf(file.getabsolutepath()); if (files != null) { resultlist.addall(files); } } } //system.out.println(flist); return resultlist; }
why d:\data works , d:\ not
in every root of drive in windows system hidden folder structure called $recycle.bin. in folder windows stores each user (sid) own folder deleted data (links it). normal user allowed first level , not user folder (with sid value name).
(german windows: papierkorb = trash)
a maybe better solution:
a maybe better way of doing such searchings in tree's create iterator on directory tree (like composite iterator). solution uses java nio features, platform should changeable (haven't tested!) ex. linux.
directorytreeiterator.java
import java.io.ioexception; import java.io.uncheckedioexception; import java.nio.file.files; import java.nio.file.path; import java.util.arraydeque; import java.util.deque; import java.util.iterator; public class directorytreeiterator implements iterator<path> { private final deque<iterator<path>> deque = new arraydeque<>(); public directorytreeiterator(iterator<path> it) { deque.push(it); } @override public boolean hasnext() { if (deque.isempty()) { return false; } else { iterator<path> = deque.peek(); if (!it.hasnext()) { deque.pop(); return hasnext(); } else { return true; } } } @override public path next() { if (hasnext()) { iterator<path> = deque.peek(); path p = it.next(); try { // here magic recursive on filtered paths if (files.isdirectory(p) && files.isreadable(p) && !files.ishidden(p)) { deque.push(files.newdirectorystream(p).iterator()); } } catch (ioexception ex) { throw new uncheckedioexception(ex); } return p; } else { return null; } } }
then able use charm:
filelister.java
import java.io.ioexception; import java.nio.file.files; import java.nio.file.path; import java.nio.file.paths; import java.util.iterator; public class filelister { public static void main(string[] args) throws ioexception { path p = paths.get("d:\\"); iterator<path> = files.newdirectorystream(p).iterator(); directorytreeiterator dti = new directorytreeiterator(it); while (dti.hasnext()) { path path = dti.next(); if (!files.isdirectory(path)) { string mime = files.probecontenttype(path); system.out.println("mime of file " + path.getfilename() + " is: " + mime); } } } }
Comments
Post a Comment