Saya memiliki folder / paket sumber daya di root proyek saya, saya "tidak" ingin memuat File tertentu. Jika saya ingin memuat File tertentu, saya akan menggunakan class.getResourceAsStream dan saya akan baik-baik saja !! Apa yang sebenarnya ingin saya lakukan adalah memuat "Folder" di dalam folder sumber daya, memutar File di dalam Folder itu dan mendapatkan Stream ke setiap file dan membaca di konten ... Asumsikan bahwa nama File tidak ditentukan sebelum runtime ... Apa yang harus saya lakukan? Apakah ada cara untuk mendapatkan daftar file di dalam Folder di File jar Anda? Perhatikan bahwa file Jar dengan sumber daya adalah file jar yang sama dengan kode yang dijalankan ...
Terima kasih sebelumnya...
Jawaban:
Akhirnya, saya menemukan solusinya:
final String path = "sample/folder"; final File jarFile = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath()); if(jarFile.isFile()) { // Run with JAR file final JarFile jar = new JarFile(jarFile); final Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar while(entries.hasMoreElements()) { final String name = entries.nextElement().getName(); if (name.startsWith(path + "/")) { //filter according to the path System.out.println(name); } } jar.close(); } else { // Run with IDE final URL url = Launcher.class.getResource("/" + path); if (url != null) { try { final File apps = new File(url.toURI()); for (File app : apps.listFiles()) { System.out.println(app); } } catch (URISyntaxException ex) { // never happens } } }
Blok kedua hanya berfungsi ketika Anda menjalankan aplikasi di IDE (bukan dengan file jar), Anda dapat menghapusnya jika Anda tidak menyukainya.
sumber
Coba berikut ini.
Jadikan jalur sumber daya
"<PathRelativeToThisClassFile>/<ResourceDirectory>"
Misalnya jika jalur kelas Anda adalah com.abc.package.MyClass dan file sumber Anda berada dalam src / com / abc / package / resources /:URL url = MyClass.class.getResource("resources/"); if (url == null) { // error - missing folder } else { File dir = new File(url.toURI()); for (File nextFile : dir.listFiles()) { // Do something with nextFile } }
Anda juga bisa menggunakan
URL url = MyClass.class.getResource("/com/abc/package/resources/");
sumber
File
kelas. Kode ini tidak berfungsi dengan sumber daya di dalam file JAR. Titik.Saya tahu ini bertahun-tahun yang lalu. Tapi hanya untuk orang lain menemukan topik ini. Apa yang dapat Anda lakukan adalah menggunakan
getResourceAsStream()
metode dengan jalur direktori, dan Arus input akan memiliki semua nama file dari direktori itu. Setelah itu Anda dapat menggabungkan jalur dir dengan setiap nama file dan memanggil getResourceAsStream untuk setiap file dalam satu lingkaran.sumber
Saya memiliki masalah yang sama ketika saya mencoba memuat beberapa konfigurasi hadoop dari sumber daya yang dikemas dalam jar ... di IDE dan di jar (versi rilis).
Saya menemukan
java.nio.file.DirectoryStream
cara terbaik untuk melakukan iterasi atas isi direktori melalui filesystem lokal dan jar.String fooFolder = "/foo/folder"; .... ClassLoader classLoader = foofClass.class.getClassLoader(); try { uri = classLoader.getResource(fooFolder).toURI(); } catch (URISyntaxException e) { throw new FooException(e.getMessage()); } catch (NullPointerException e){ throw new FooException(e.getMessage()); } if(uri == null){ throw new FooException("something is wrong directory or files missing"); } /** i want to know if i am inside the jar or working on the IDE*/ if(uri.getScheme().contains("jar")){ /** jar case */ try{ URL jar = FooClass.class.getProtectionDomain().getCodeSource().getLocation(); //jar.toString() begins with file: //i want to trim it out... Path jarFile = Paths.get(jar.toString().substring("file:".length())); FileSystem fs = FileSystems.newFileSystem(jarFile, null); DirectoryStream<Path> directoryStream = Files.newDirectoryStream(fs.getPath(fooFolder)); for(Path p: directoryStream){ InputStream is = FooClass.class.getResourceAsStream(p.toString()) ; performFooOverInputStream(is); /** your logic here **/ } }catch(IOException e) { throw new FooException(e.getMessage()); } } else{ /** IDE case */ Path path = Paths.get(uri); try { DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path); for(Path p : directoryStream){ InputStream is = new FileInputStream(p.toFile()); performFooOverInputStream(is); } } catch (IOException _e) { throw new FooException(_e.getMessage()); } }
sumber
Kode berikut mengembalikan "folder" yang diinginkan sebagai Path terlepas dari apakah itu di dalam jar atau tidak.
private Path getFolderPath() throws URISyntaxException, IOException { URI uri = getClass().getClassLoader().getResource("folder").toURI(); if ("jar".equals(uri.getScheme())) { FileSystem fileSystem = FileSystems.newFileSystem(uri, Collections.emptyMap(), null); return fileSystem.getPath("path/to/folder/inside/jar"); } else { return Paths.get(uri); } }
Membutuhkan java 7+.
sumber
folder
) tampaknya diabaikan saat membuat sistem file. Oleh karenagetPath
itu tidak kembalifolder/path/to/...
, tetapi hanyapath/to/...
.Solusi lain, Anda bisa melakukannya dengan menggunakan
ResourceLoader
seperti ini:import org.springframework.core.io.Resource; import org.apache.commons.io.FileUtils; @Autowire private ResourceLoader resourceLoader; ... Resource resource = resourceLoader.getResource("classpath:/path/to/you/dir"); File file = resource.getFile(); Iterator<File> fi = FileUtils.iterateFiles(file, null, true); while(fi.hasNext()) { load(fi.next()) }
sumber
Sederhana ... gunakan OSGi. Di OSGi Anda dapat mengulang entri Bundle Anda dengan findEntries dan findPaths.
sumber
Di dalam file jar saya, saya memiliki folder bernama Upload, folder ini memiliki tiga file teks lain di dalamnya dan saya harus memiliki folder dan file yang persis sama di luar file jar, saya menggunakan kode di bawah ini:
URL inputUrl = getClass().getResource("/upload/blabla1.txt"); File dest1 = new File("upload/blabla1.txt"); FileUtils.copyURLToFile(inputUrl, dest1); URL inputUrl2 = getClass().getResource("/upload/blabla2.txt"); File dest2 = new File("upload/blabla2.txt"); FileUtils.copyURLToFile(inputUrl2, dest2); URL inputUrl3 = getClass().getResource("/upload/blabla3.txt"); File dest3 = new File("upload/Bblabla3.txt"); FileUtils.copyURLToFile(inputUrl3, dest3);
sumber
Seperti yang ditunjukkan jawaban lain, begitu sumber daya berada di dalam file jar, semuanya menjadi sangat buruk. Dalam kasus kami, solusi ini:
https://stackoverflow.com/a/13227570/516188
berfungsi sangat baik dalam pengujian (karena saat pengujian dijalankan, kode tidak dikemas dalam file jar), tetapi tidak berfungsi saat aplikasi benar-benar berjalan normal. Jadi apa yang telah saya lakukan adalah ... Saya melakukan hardcode daftar file di aplikasi, tetapi saya memiliki tes yang membaca daftar sebenarnya dari disk (dapat melakukannya karena itu berfungsi dalam tes) dan gagal jika daftar sebenarnya tidak tidak cocok dengan daftar yang dikembalikan aplikasi.
Dengan begitu saya memiliki kode sederhana di aplikasi saya (tidak ada trik), dan saya yakin saya tidak lupa menambahkan entri baru ke dalam daftar berkat pengujian.
sumber
Tautan ini memberi tahu Anda caranya.
Ajaibnya adalah metode getResourceAsStream ():
InputStream is = this.getClass().getClassLoader().getResourceAsStream("yourpackage/mypackage/myfile.xml")
sumber