2010-07-22 52 views
8

Tôi đang cố gắng viết một chương trình để đọc một tập tin văn bản thông qua args nhưng khi tôi chạy nó, nó luôn luôn nói rằng tập tin không thể được tìm thấy mặc dù tôi đặt nó bên trong cùng một thư mục như main.java im đang chạy. Có ai biết giải pháp cho vấn đề của tôi hay cách tốt hơn để đọc một tệp văn bản không?Làm thế nào để vượt qua một tập tin văn bản như một đối số?

+0

Tôi giả định rằng nếu đầu vào đang được truyền vào như một chương trình arg, bạn muốn chuyển đầu vào tùy ý vào chương trình. Đúng không? –

+0

Umm không thực sự. Bạn đang nói về phương pháp hay chức năng? Im nói về như là một lớp im đi qua trong một đối số và khi tôi chạy phương pháp chính nó nên đọc các tập tin văn bản nhưng nó không. Mã của tôi là Scanner sc1 = new Scanner (tệp mới (args [0])); Khi gỡ lỗi nó thậm chí không thể vượt qua dòng này. – Victor

Trả lời

8

Không sử dụng đường dẫn tương đối trong java.io.File.

Nó sẽ trở nên tương đối so với thư mục làm việc hiện tại phụ thuộc vào cách bạn chạy ứng dụng mà lần lượt không thể điều khiển được từ bên trong ứng dụng của bạn. Nó sẽ chỉ dẫn đến sự cố di chuyển. Nếu bạn chạy nó từ bên trong Eclipse, đường dẫn sẽ tương ứng với /path/to/eclipse/workspace/projectname. Nếu bạn chạy nó từ bên trong bảng điều khiển lệnh, nó sẽ liên quan đến hiện đang mở thư mục mở (mặc dù khi bạn chạy mã theo đường dẫn tuyệt đối!). Nếu bạn chạy nó bằng cách bấm đúp vào JAR, nó sẽ liên quan đến thư mục gốc của JAR. Nếu bạn chạy nó trong một máy chủ web, nó sẽ liên quan đến /path/to/webserver/binaries. Etcetera.

Luôn sử dụng đường dẫn tuyệt đối trong java.io.File, không bào chữa.

Để có tính di động tốt nhất và ít đau đầu hơn với đường dẫn tuyệt đối, chỉ cần đặt tệp trong đường dẫn được đường dẫn lớp thời gian chạy bao phủ (hoặc thêm đường dẫn của nó vào đường dẫn lớp thời gian chạy). Bằng cách này, bạn có thể tải tệp theo số Class#getResource() hoặc nội dung của tệp theo số Class#getResourceAsStream(). Nếu nó nằm trong cùng một thư mục (package) với lớp hiện tại của bạn thì nó đã có trong classpath. Để truy cập vào nó, chỉ cần làm:

public MyClass() { 
    URL url = getClass().getResource("filename.txt"); 
    File file = new File(url.getPath()); 
    InputStream input = new FileInputStream(file); 
    // ... 
} 

hoặc

public MyClass() { 
    InputStream input = getClass().getResourceAsStream("filename.txt"); 
    // ... 
} 
+0

Bạn có thể chỉ định thư mục làm việc trong Eclipse. Nó nằm trong hộp thoại dưới "chạy dưới dạng". Đó là một cách để sử dụng đường dẫn tương đối và vẫn nhận được hành vi hợp lý bên trong nhật thực. –

+0

Đúng, sẽ luôn có cách giải quyết và né tránh, nhưng bạn thực sự không muốn ứng dụng của bạn vĩnh viễn phụ thuộc vào điều đó khi có nhiều cách tốt hơn. – BalusC

1

Thử cung cấp đường dẫn tuyệt đối cho tên tệp.

Ngoài ra, hãy đăng mã để chúng tôi có thể biết chính xác bạn đang cố gắng làm gì.

+0

Không thể vượt qua dòng này: Máy quét sc1 = Máy quét mới (Tệp mới (args [0])); và tôi đã chuyển tập tin văn bản của mình thành arg đầu tiên – Victor

+0

Kết hợp các dòng có thể giúp rút ngắn mã và có thể cải thiện hiệu suất (tốc độ), nhưng khi gỡ lỗi, nó giúp chia nhỏ mọi thứ (tức là không xây dựng các nhà xây dựng trong các nhà xây dựng). Tạo đối tượng Tệp, xem đây có phải là nơi chương trình đi lên hay không. Nếu không, sau đó vượt qua đối tượng File để Scanner (trong một dòng riêng biệt) và xem loại lỗi được ném. – chimeracoder

0

Nếu bạn đang sử dụng Eclipse (hoặc một IDE tương tự), vấn đề phát sinh từ thực tế là chương trình của bạn được chạy từ một vài thư mục ở trên nơi nguồn thực sự được đặt. Hãy thử di chuyển tệp của bạn lên một hoặc hai cấp trong cây dự án.

Khám phá this question để biết thêm chi tiết.

0

Nếu bạn đặt các tập tin và các lớp làm việc với nó dưới cùng gói bạn có thể sử dụng này:

Class A { 


    void readFile (String fileName) { 
    Url tmp = A.class.getResource (fileName); 
    // Or Url tmp = this.getClass().getResource (fileName); 

    File tmpFile = File (tmp); 

    if (tmpFile.exists()) 
     System.out.print("I found the file.") 

    } 

} 

Nó sẽ giúp đỡ nếu bạn đọc về classloaders.

0

Khi bạn đang mở một tệp có tên tệp tương đối trong Java (và nói chung) nó sẽ mở nó tương ứng với thư mục làm việc.

bạn có thể tìm thấy thư mục làm việc hiện tại của quá trình bạn sử dụng

String workindDir = new File(".").getAbsoultePath() 

Hãy chắc chắn rằng bạn đang chạy chương trình của bạn từ thư mục chính xác (hoặc thay đổi tên tập tin để nó sẽ được liên quan đến nơi bạn đang chạy nó từ).

+0

Thư mục làm việc hiện tại cũng có sẵn thông qua thuộc tính hệ thống "user.dir". –

0

Giải pháp đơn giản nhất là để tạo ra một tập tin mới, sau đó nhìn thấy nơi các tập tin đầu ra là. Đó là nơi chính xác để đưa tập tin đầu vào của bạn vào.

Các vấn đề liên quan