java.io.File
และภริยาทำหน้าที่ในระบบไฟล์ดิสก์ภายใน สาเหตุที่แท้จริงของปัญหาของคุณคือเส้นทางที่สัมพันธ์java.io
นั้นขึ้นอยู่กับไดเรกทอรีการทำงานปัจจุบัน นั่นคือไดเรกทอรีที่ JVM (ในกรณีของคุณ: เว็บเซิร์ฟเวอร์หนึ่งรายการ) เริ่มต้นขึ้น ตัวอย่างนี้อาจจะเป็นC:\Tomcat\bin
หรือสิ่งที่แตกต่างอย่างสิ้นเชิง แต่ไม่ C:\Tomcat\webapps\contextname
หรือสิ่งที่คุณคาดหวังให้ C:\Eclipse\workspace\projectname
ในโครงการคราสปกติที่จะเป็น คุณสามารถเรียนรู้เกี่ยวกับไดเรกทอรีการทำงานปัจจุบันด้วยวิธีต่อไปนี้:
System.out.println(new File(".").getAbsolutePath());
อย่างไรก็ตามไดเรกทอรีการทำงานไม่สามารถควบคุมได้โดยทางโปรแกรม คุณควรใช้พา ธสัมบูรณ์ในFile
API แทนการใช้พา ธ สัมพัทธ์ 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()
วิธีการสืบทอดคุณสามารถเรียกมันตามสภาพ
ดูสิ่งนี้ด้วย: