2010-10-02 22 views
83

Tôi có một dự án với 2 gói:Cách đọc tệp từ đường dẫn tương đối trong dự án Java? java.io.File không thể tìm thấy đường dẫn cụ thể

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

Trong gói (2) Tôi có một file văn bản ListStopWords.txt, trong gói (1) Tôi có một lớp học FileLoadder. Dưới đây là mã trong FileLoader:

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

Nhưng có lỗi này:

The system cannot find the path specified 

Bạn có thể cho một giải pháp để sửa chữa nó? Cảm ơn.

+5

Cả hai ví dụ về gói của bạn đều giống nhau. Bạn không có nghĩa là 'properties.files' cho' 2'? – BalusC

Trả lời

119

Nếu nó đã có trong classpath, sau đó chỉ cần lấy nó từ classpath. Đừng fiddle với đường dẫn tương đối trong java.io.File. Chúng phụ thuộc vào thư mục làm việc hiện tại mà bạn hoàn toàn không có quyền kiểm soát từ bên trong mã Java.

Giả sử rằng ListStopWords.txt là trong gói giống như FileLoader lớp:

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

Hoặc nếu tất cả các bạn đang theo đuổi là một InputStream của nó:

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

Nếu tập tin là -Như các gợi ý tên gói là thực sự là đầy đủ có thể là properties file (chứa key=value dòng) chỉ với tiện ích "sai", sau đó bạn có thể nạp theo phương pháp load().

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

Lưu ý: khi bạn đang cố gắng truy cập nó từ bên trong static bối cảnh, sau đó sử dụng FileLoader.class thay vì getClass() trong ví dụ trên.

+0

FileLoader có bị xóa khỏi java không? Tôi đang cố gắng để làm điều này từ một bối cảnh tĩnh (java 6) và tôi không thể tìm thấy bất kỳ cách nào để nhập khẩu nó và nó giữ cho tôi biết nó không thể giải quyết cho một loại. Kỳ lạ, nó tự động hoàn thành khi tôi gõ nó, nhưng sau đó tiến hành cho tôi một lỗi. – turbo

+1

oh, nó được coi là ClassLoader.class. – turbo

+4

@turbo: 'FileLoader' là lớp tùy chỉnh của OP. Nó được cho là chính xác mà lớp học mà bạn đang cố gắng để có được nguồn tài nguyên. Vì vậy, do đó, 'NameOfYourCurrentClass.class.getResourceAsStream (...)'. Lớp 'ClassLoader.class' sẽ thất bại nếu lớp' ClassLoader' đang được nạp bởi một trình nạp lớp khác, có thể xảy ra trong một ứng dụng "doanh nghiệp" với một hệ thống phân cấp của nhiều trình nạp lớp (như một ứng dụng web Java EE). – BalusC

3

thử .\properties\files\ListStopWords.txt

4
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) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+1

FileLoadder quái gì ??? –

+1

@IgorGanapolsky là tên của Lớp. Bạn chỉ có thể tham khảo chữ '.class' bằng cách cung cấp tên đầy đủ của lớp của nó. – Tomasz

+0

Tôi nghĩ rằng nó dự định được FileLoader. – jamesdeath123

26

Dòng sau có thể được sử dụng nếu chúng tôi muốn chỉ định đường dẫn tương đối của tệp.

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

tôi có thể biết tại sao 3 dấu gạch chéo giữa đường dẫn. –

+0

Lỗi:> Ký tự thoát bất hợp pháp trong chuỗi ký tự. –

+0

Làm thế nào để chuyển đổi điều này thành 'InputStream'? –

-1

Nếu bạn đang cố gắng gọi getClass() từ phương pháp tĩnh hoặc khối tĩnh, bạn có thể thực hiện theo cách sau.

Bạn có thể gọi getClass() trên đối tượng Properties bạn đang tải.

public static Properties pathProperties = null; 

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

Đơn giản chỉ cần thiếu một báo giá đóng. – jamesdeath123

2

Trong khi câu trả lời cung cấp bởi BalusC làm việc cho trường hợp này, nó sẽ phá vỡ khi đường dẫn tập tin chứa dấu cách vì trong một URL, đây là những được chuyển đổi sang% 20 mà không phải là một tên tập tin hợp lệ. Nếu bạn xây dựng các đối tượng tập tin bằng cách sử dụng URI chứ không phải là một String, khoảng trắng sẽ được xử lý một cách chính xác:

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

Đường dẫn tương đối hoạt động ở trong java bằng cách sử dụng. nhà điều hành.

  • . có nghĩa là cùng một thư mục với bối cảnh hiện đang chạy.
  • .. có nghĩa là thư mục chính của ngữ cảnh hiện đang chạy.

Vì vậy, câu hỏi là làm cách nào để bạn biết đường dẫn nơi java hiện đang tìm kiếm?

làm một thí nghiệm nhỏ

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

Quan sát kết quả, bạn sẽ đến để nhận biết thư mục hiện hành nơi java đang tìm kiếm. Từ đó, chỉ cần sử dụng toán tử ./ để định vị tệp của bạn.

ví dụ nếu đầu ra là

G:\JAVA8Ws\MyProject\content.

và tập tin của bạn có mặt trong MyProject thư mục chỉ đơn giản là sử dụng

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

Hope this helps

-1

Nếu tập tin văn bản không được đọc, thử sử dụng đường dẫn tuyệt đối gần hơn (nếu bạn muốn bạn có thể sử dụng đường dẫn tuyệt đối hoàn chỉnh,) như sau:

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

giả định rằng đường dẫn tuyệt đối là:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt 
0

tôi muốn phân tích 'command.json' bên src/main // js/Simulator.java. Tôi đã sao chép tệp json trong thư mục src và cung cấp đường dẫn tuyệt đối như sau:

Object obj = parser.parse(new FileReader("./src/command.json")); 
Các vấn đề liên quan