วิธีอ่านไฟล์จากพา ธ สัมพัทธ์ในโปรเจ็กต์ Java java.io.File ไม่พบเส้นทางที่ระบุ


113

ฉันมีโครงการที่มี 2 แพ็คเกจ:

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

ในแพคเกจ (2) ฉันมีแฟ้มข้อความListStopWords.txtในแพคเกจ (1) FileLoadderฉันได้เรียน นี่คือรหัสในFileLoader:

File file = new File("properties\\files\\ListStopWords.txt");

แต่มีข้อผิดพลาดนี้:

The system cannot find the path specified

คุณสามารถให้ทางออกเพื่อแก้ไขได้หรือไม่? ขอบคุณ


12
ตัวอย่างแพ็คเกจของคุณทั้งสองเหมือนกัน คุณไม่ได้หมายความว่าproperties.filesสำหรับ2?
BalusC

คำตอบ:


173

หากมีอยู่แล้วใน classpath ให้รับจาก classpath แทนจากระบบไฟล์ดิสก์ java.io.Fileไม่คุ้นเคยกับเส้นทางญาติใน ขึ้นอยู่กับไดเร็กทอรีการทำงานปัจจุบันซึ่งคุณไม่สามารถควบคุมได้ทั้งหมดจากภายในโค้ด Java

สมมติว่าListStopWords.txtอยู่ในแพ็คเกจเดียวกับFileLoaderชั้นเรียนของคุณจากนั้นให้ทำ:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

หรือถ้าท้ายที่สุดแล้วสิ่งที่คุณต้องการคือInputStream:

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

สิ่งนี้เป็นที่ต้องการมากกว่าการสร้างnew File()เนื่องจากurlอาจไม่จำเป็นต้องแสดงถึงเส้นทางระบบไฟล์ดิสก์ แต่ยังสามารถแสดงเส้นทางระบบไฟล์เสมือน (ซึ่งอาจเกิดขึ้นเมื่อ JAR ถูกขยายลงในหน่วยความจำแทนที่จะเป็นโฟลเดอร์ชั่วคราวในระบบไฟล์ดิสก์) หรือแม้กระทั่งเส้นทางเครือข่ายซึ่งทั้งคู่ไม่สามารถย่อยได้ตามนิยามโดยตัวFileสร้าง

หากไฟล์อยู่ -as ชื่อแพคเกจคำแนะนำคำเป็นจริง fullworthy ไฟล์คุณสมบัติ (ที่มีkey=valueสาย) มีเพียงส่วนขยาย "ผิด" แล้วคุณจะกินInputStreamทันทีที่load()วิธีการ

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

หมายเหตุ: เมื่อคุณพยายามเข้าถึงจากstaticบริบทภายในให้ใช้FileLoader.class(หรืออะไรก็ได้YourClass.class) แทนgetClass()ในตัวอย่างด้านบน


FileLoader ถูกลบออกจาก java หรือไม่? ฉันพยายามทำสิ่งนี้จากบริบทคงที่ (java 6) และฉันไม่พบวิธีใด ๆ ในการนำเข้ามันและมันก็บอกฉันว่ามันไม่สามารถแก้ไขเป็นประเภทได้ น่าแปลกที่มันเติมข้อความอัตโนมัติขณะที่ฉันพิมพ์ แต่จากนั้นก็แจ้งข้อผิดพลาด
turbo

2
โอ้มันควรจะเป็น ClassLoader.class
turbo

4
@turbo: FileLoaderเป็นคลาสที่กำหนดเองของ OP มันควรจะเป็นคลาสที่คุณพยายามจะได้รับทรัพยากร NameOfYourCurrentClass.class.getResourceAsStream(...)ดังนั้นเพื่อให้ ClassLoader.classจะล้มเหลวถ้าClassLoaderชั้นจะถูกโหลดโดย ClassLoader แตกต่างกันซึ่งอาจจะเกิดขึ้นใน "องค์กร" แอพลิเคชันที่มีลำดับชั้นของ classloaders หลาย (เช่นโปรแกรมเว็บ Java EE บริการ)
BalusC

ฉันเข้าใจแล้ว ฉันไม่เข้าใจว่ามันขึ้นอยู่กับ ขอบคุณที่แจ้งให้ทราบ!
turbo

10
มีข้อเสนอแนะหากไฟล์ไม่ได้อยู่ในแพ็คเกจเดียวกัน? ในตัวอย่างของฉันฉันกำลังพยายามเปิดไฟล์ที่อยู่ในแพ็คเกจทดสอบ
Robin Newhouse

44

สามารถใช้บรรทัดต่อไปนี้หากเราต้องการระบุพา ธ สัมพัทธ์ของไฟล์

File file = new File("./properties/files/ListStopWords.txt");  

3
ฉันขอทราบได้ไหมว่าทำไม 3 ขีดระหว่างเส้นทาง
MSNaidu

ข้อผิดพลาด:> อักขระ Escape ไม่ถูกต้องในสตริงลิเทอรัล
IgorGanapolsky

วิธีการแปลงเป็นInputStream?
IgorGanapolsky

1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
Cameron Hudson

42

เส้นทางสัมพัทธ์ทำงานใน java โดยใช้ไฟล์. ผู้ประกอบการ

  • . หมายถึงโฟลเดอร์เดียวกับบริบทที่กำลังทำงานอยู่
  • .. หมายถึงโฟลเดอร์หลักของบริบทที่กำลังทำงานอยู่

คำถามคือคุณรู้เส้นทางที่จาวากำลังมองหาอยู่ได้อย่างไร?

ทำการทดลองเล็ก ๆ

   File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

สังเกตผลลัพธ์คุณจะได้ทราบไดเร็กทอรีปัจจุบันที่ java กำลังมองหา จากนั้นใช้ตัวดำเนินการ. / เพื่อค้นหาไฟล์ของคุณ

ตัวอย่างเช่นหากเอาต์พุตเป็น

G: \ JAVA8Ws \ MyProject \ เนื้อหา

และไฟล์ของคุณอยู่ในโฟลเดอร์ MyProject เพียงแค่ใช้

File resourceFile = new File("../myFile.txt");

หวังว่านี่จะช่วยได้


หลังจากหลายชั่วโมงของการค้นหาคำตอบนี้ทำให้ฉันมีวิธีแก้ปัญหา
erdostamasa

8
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}

1
@IgorGanapolsky เป็นชื่อของ Class คุณสามารถอ้างถึง.classตัวอักษรได้โดยการระบุชื่อเต็มของคลาสเท่านั้น
Tomasz Mularczyk

ฉันคิดว่ามันตั้งใจจะเป็น FileLoader
jamesdeath123


5

ฉันสามารถแสดงความคิดเห็นได้ แต่ฉันมีตัวแทนน้อยลง คำตอบของ Samrat ได้ผลสำหรับฉัน ควรดูเส้นทางไดเรกทอรีปัจจุบันผ่านรหัสต่อไปนี้

    File directory = new File("./");
    System.out.println(directory.getAbsolutePath());

ฉันแค่ใช้มันเพื่อแก้ไขปัญหาที่ฉันพบในโครงการของฉัน อย่าลืมใช้. / เพื่อกลับไปที่ไดเร็กทอรีหลักของไดเร็กทอรีปัจจุบัน

    ./test/conf/appProperties/keystore 

ฉันกำลังเรียกใช้รหัสของฉันผ่าน tomcat ดังนั้นไดเรกทอรีปัจจุบันจึงไม่ใช่โฟลเดอร์โครงการ - ฉันจะกำหนดเส้นทางสัมพัทธ์ไปยังรูทโปรเจ็กต์ได้อย่างไร ขณะนี้ฉันใช้ฮาร์ดพา ธ : "C: \\ Users \\ user \\ Desktop \\ Repositories \\ L1_WebShop \\ dblogs.log";
Tiago Redaelli

@TiagoRedaelli ตรวจสอบคำถามนี้: stackoverflow.com/questions/12843217/…
dezible

4

แม้ว่าคำตอบที่ BalusC ให้ไว้จะใช้ได้กับกรณีนี้ แต่ก็จะหยุดทำงานเมื่อเส้นทางของไฟล์มีช่องว่างเนื่องจากใน URL สิ่งเหล่านี้จะถูกแปลงเป็น% 20 ซึ่งไม่ใช่ชื่อไฟล์ที่ถูกต้อง หากคุณสร้างอ็อบเจกต์ File โดยใช้ URI แทนที่จะเป็น String ช่องว่างจะได้รับการจัดการอย่างถูกต้อง:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());

2

ฉันต้องการแยกวิเคราะห์ 'command.json' ภายใน src / main // js / Simulator.java ด้วยเหตุนี้ฉันจึงคัดลอกไฟล์ json ในโฟลเดอร์ src และให้เส้นทางสัมบูรณ์เช่นนี้:

Object obj  = parser.parse(new FileReader("./src/command.json"));

2

ใส่คำอธิบายภาพที่นี่

สมมติว่าคุณต้องการอ่านจากresourcesไดเร็กทอรีในFileSystemคลาส

String file = "dummy.txt";
var path = Paths.get("src/com/company/fs/resources/", file);
System.out.println(path);

System.out.println(Files.readString(path));

หมายเหตุ:.ไม่จำเป็นต้องใช้ชั้นนำ


1

สำหรับฉันจริงๆแล้วปัญหาคือพา ธ คลาสของอ็อบเจ็กต์ไฟล์มาจาก<project folder path> or ./srcดังนั้นใช้เพื่อFile file = new File("./src/xxx.txt");แก้ไขปัญหาของฉัน


0

สตริง basePath = ไฟล์ใหม่ ("myFile.txt") getAbsolutePath (); พื้นฐานนี้คุณสามารถใช้เป็นเส้นทางที่ถูกต้องของไฟล์ของคุณ


-1

หากคุณพยายามโทรgetClass()จาก Static method หรือ static block คุณสามารถทำได้ด้วยวิธีต่อไปนี้

คุณสามารถเรียกgetClass()บนPropertiesวัตถุที่คุณโหลดลงใน

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}

ไม่มีใบเสนอราคาปิด
jamesdeath123

-1

หากไม่ได้อ่านไฟล์ข้อความให้ลองใช้พา ธ สัมบูรณ์ที่ใกล้กว่ามากขึ้น (หากคุณต้องการใช้พา ธ สัมบูรณ์แบบสมบูรณ์) ดังนี้:

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

สมมติว่าเส้นทางสัมบูรณ์คือ:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.