The java.io.File
dan mendampingi bertindak pada sistem file disk lokal. Akar penyebab masalah Anda adalah bahwa jalur relatif dalam java.io
bergantung pada direktori kerja saat ini. Yaitu direktori dari mana JVM (dalam kasus Anda: satu server web) dimulai. Misalnya ini mungkin C:\Tomcat\bin
atau sesuatu yang sama sekali berbeda, tetapi dengan demikian tidak C:\Tomcat\webapps\contextname
atau apa pun yang Anda harapkan. Dalam proyek Eclipse yang normal, itu akan menjadi C:\Eclipse\workspace\projectname
. Anda dapat mempelajari tentang direktori kerja saat ini dengan cara berikut:
System.out.println(new File(".").getAbsolutePath());
Namun, direktori kerja sama sekali tidak dapat dikontrol secara pemrograman. Anda harus benar-benar lebih suka menggunakan jalur absolut di File
API daripada jalur relatif. Misalnya C:\full\path\to\file.ext
.
Anda tidak ingin hardcode atau menebak jalur absolut dalam aplikasi Java (web). Itu hanya masalah portabilitas (yaitu berjalan di sistem X, tetapi tidak di sistem Y). Praktik yang normal adalah menempatkan sumber daya semacam itu di classpath , atau menambahkan path lengkapnya ke classpath (dalam IDE seperti Eclipse yang merupakan src
folder dan "build path"). Dengan cara ini Anda bisa meraihnya dengan bantuan ClassLoader
oleh ClassLoader#getResource()
atau ClassLoader#getResourceAsStream()
. Itu dapat menemukan file relatif ke "root" dari classpath, seperti yang Anda temukan secara kebetulan. Dalam aplikasi web (atau aplikasi lain yang menggunakan banyak classloader), disarankan untuk menggunakan yang ClassLoader
dikembalikan oleh Thread.currentThread().getContextClassLoader()
untuk ini sehingga Anda dapat melihat "di luar" konteks webapp juga.
Alternatif lain di webapps adalah ServletContext#getResource()
dan rekannya ServletContext#getResourceAsStream()
. Itu dapat mengakses file yang terletak di web
folder publik proyek webapp, termasuk /WEB-INF
folder. Ini ServletContext
tersedia dalam servlets dengan getServletContext()
metode yang diwarisi , Anda dapat menyebutnya apa adanya.
Lihat juga:
getResourceAsStream
adalah cara yang tepat untuk melakukannya untuk aplikasi web (seperti yang sudah Anda pelajari).Alasannya adalah bahwa membaca dari sistem file tidak dapat berfungsi jika Anda mengemas aplikasi web Anda dalam PERANG. Ini adalah cara yang tepat untuk mengemas aplikasi web. Itu portabel seperti itu, karena Anda tidak bergantung pada jalur file absolut atau lokasi di mana server aplikasi Anda diinstal.
sumber
FileInputStream akan memuat path file yang Anda lewati ke konstruktor sebagai relatif dari direktori kerja proses Java. Biasanya dalam wadah web, ini mirip
bin
folder.getResourceAsStream()
akan memuat path file relatif dari classpath aplikasi Anda .sumber
The
FileInputStream
kelas bekerja secara langsung dengan sistem file yang mendasari. Jika file yang dimaksud tidak ada secara fisik di sana, ia akan gagal membukanya. ThegetResourceAsStream()
Metode bekerja secara berbeda. Ia mencoba untuk menemukan dan memuat sumber daya menggunakanClassLoader
kelas yang dipanggilnya. Ini memungkinkannya menemukan, misalnya, sumber daya yang disematkan ke dalamjar
file.sumber
jar
format file dan implikasinya. Dan di Jawa, yang tepatClassLoader
mungkin memiliki pengetahuan ini, sedangkan dataranFileInputStream
jelas tidak.classname.getResourceAsStream () memuat file melalui classloader dari classname. Jika kelas berasal dari file jar, dari situlah sumber daya akan diambil.
FileInputStream digunakan untuk membaca file dari sistem file.
sumber
Saya di sini dengan memisahkan kedua penggunaan dengan menandainya sebagai File Read (java.io) dan Resource Read (ClassLoader.getResourceAsStream ()).
File Read - 1. Bekerja pada sistem file lokal. 2. Mencoba mencari file yang diminta dari direktori JVM yang diluncurkan saat ini sebagai root 3. Idealnya bagus saat menggunakan file untuk diproses di lokasi yang telah ditentukan seperti, / dev / file atau C: \ Data.
Baca Sumber Daya - 1. Bekerja pada jalur kelas 2. Mencoba untuk mencari file / sumber daya di classpather induk atau saat ini. 3. Idealnya bagus ketika mencoba memuat file dari file paket seperti war atau jar.
sumber