java.io.Fileและภริยาทำหน้าที่ในระบบไฟล์ดิสก์ภายใน สาเหตุที่แท้จริงของปัญหาของคุณคือเส้นทางที่สัมพันธ์java.ioนั้นขึ้นอยู่กับไดเรกทอรีการทำงานปัจจุบัน นั่นคือไดเรกทอรีที่ JVM (ในกรณีของคุณ: เว็บเซิร์ฟเวอร์หนึ่งรายการ) เริ่มต้นขึ้น ตัวอย่างนี้อาจจะเป็นC:\Tomcat\binหรือสิ่งที่แตกต่างอย่างสิ้นเชิง แต่ไม่ C:\Tomcat\webapps\contextnameหรือสิ่งที่คุณคาดหวังให้ C:\Eclipse\workspace\projectnameในโครงการคราสปกติที่จะเป็น คุณสามารถเรียนรู้เกี่ยวกับไดเรกทอรีการทำงานปัจจุบันด้วยวิธีต่อไปนี้:
System.out.println(new File(".").getAbsolutePath());
อย่างไรก็ตามไดเรกทอรีการทำงานไม่สามารถควบคุมได้โดยทางโปรแกรม คุณควรใช้พา ธสัมบูรณ์ในFileAPI แทนการใช้พา ธ สัมพัทธ์ C:\full\path\to\file.extเช่น
คุณไม่ต้องการ hardcode หรือเดาเส้นทางสัมบูรณ์ในแอปพลิเคชัน Java (เว็บ) นั่นเป็นเพียงปัญหาการพกพา (เช่นมันทำงานในระบบ X แต่ไม่ใช่ในระบบ Y) การปฏิบัติปกติคือการวางทรัพยากรประเภทนั้นในclasspathหรือเพื่อเพิ่มเส้นทางแบบเต็มไปยัง classpath (ใน IDE เช่น Eclipse ที่เป็นsrcโฟลเดอร์และ "เส้นทางสร้าง" ตามลำดับ) วิธีนี้คุณสามารถคว้าพวกเขาด้วยความช่วยเหลือของClassLoaderโดย หรือClassLoader#getResource() ClassLoader#getResourceAsStream()มันสามารถที่จะหาไฟล์ที่เกี่ยวข้องกับ "root" ของ classpath ในขณะที่คุณคิดออกโดยบังเอิญ ใน webapplications (หรือแอปพลิเคชันอื่น ๆ ที่ใช้ classloaders หลายรายการ) ขอแนะนำให้ใช้สิ่งClassLoaderที่ถูกส่งคืนโดยThread.currentThread().getContextClassLoader()สิ่งนี้เพื่อให้คุณสามารถดู "นอก" บริบทของ webapp ได้เช่นกัน
ทางเลือกใน webapps ก็คือและคู่ServletContext#getResource() ServletContext#getResourceAsStream()สามารถเข้าถึงไฟล์ที่อยู่ในwebโฟลเดอร์สาธารณะของโครงการ webapp รวมถึง/WEB-INFโฟลเดอร์ ที่ServletContextมีอยู่ใน servlets โดยgetServletContext()วิธีการสืบทอดคุณสามารถเรียกมันตามสภาพ
ดูสิ่งนี้ด้วย: