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ố?
Trả lời
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");
// ...
}
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. –
Đú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
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ì.
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
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
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.
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.
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ừ).
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". –
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.
- 1. Làm thế nào để vượt qua một đối số khi gọi một tập tin xem?
- 2. Làm thế nào để bạn vượt qua một Container.DataItem như một tham số?
- 3. Làm thế nào để vượt qua std :: bản đồ như một tham số constructor mặc định
- 4. Làm thế nào để vượt qua GridView như một ConverterParameter
- 5. Làm thế nào để bạn vượt qua một hàm như một tham số trong C?
- 6. Làm thế nào để viết văn bản vào một tập tin văn bản bằng Photoshop JavaScript?
- 7. Làm thế nào để vượt qua một phương pháp học như một tham số trong Scala
- 8. Làm thế nào để vượt qua một đối tượng duy nhất [] để một đối tượng params []
- 9. Làm thế nào để vượt qua enum như một đối số trong một phương pháp trong java?
- 10. Những tập tin tôi phải vượt qua như là đối số tên đường dẫn của ftok()
- 11. Làm thế nào để vượt qua đối số argparse để hoạt động như kwargs?
- 12. Làm thế nào để ghi đè lên một file văn bản từ một tập tin batch
- 13. Làm thế nào để vượt qua một đối số để xử lý sự kiện trong tkinter?
- 14. Làm thế nào để xóa một dòng từ một tập tin văn bản trong C#?
- 15. Làm thế nào để vượt qua MethodName như tham số của một thủ tục trong VBNET
- 16. Làm thế nào để vượt qua một con trỏ để LuaJIT ffi được sử dụng như là đối số ra?
- 17. jquery - Đọc một tập tin văn bản?
- 18. Có cách nào để vượt qua biểu thức lambda như một biến hoặc đối số?
- 19. Vượt qua một phương pháp làm đối số
- 20. Có cách nào để vượt qua 'stdin' như là một đối số cho một quá trình trong python?
- 21. Làm thế nào để vượt qua một lớp Generic như một thông số để một constructor lớp phi generic
- 22. Vượt qua một loại Enum là một đối số?
- 23. Làm thế nào để sử dụng EOF để chạy qua một tập tin văn bản trong C?
- 24. Làm thế nào để vượt qua một tham chiếu thông qua một gói tham số?
- 25. Làm thế nào để đọc một số tiền cụ thể của các nhân vật từ một tập tin văn bản
- 26. vượt qua một loại như một tham số thuộc tính
- 27. làm thế nào để vượt qua một đối số cho một bài kiểm tra junit android (thử nghiệm tham số)
- 28. Làm thế nào để vượt qua một đối tượng băm để một thẻ HAML
- 29. Làm thế nào để tải một tập tin dưới dạng chuỗi văn bản vào một số var với jQuery?
- 30. Làm thế nào để đọc từ một tập tin văn bản nhanh hơn/thông minh hơn?
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? –
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