Tôi biết phương thức getResourceAsStream()
nhưng có sự cố với trình phân tích cú pháp đọc tệp, toàn bộ cấu trúc được triển khai để mong đợi một FileInputStream()
và getResourceAsStream()
trả về luồng đầu vào không thể truyền. Có dễ dàng "sửa chữa" cho tình huống này?Làm cách nào để truy cập tệp txt trong một tệp jar bằng FileInputStream?
Trả lời
Tài nguyên chứa trong tệp JAR không phải là tệp chính nó và không thể đọc được bằng cách sử dụng FileInputStream
. Nếu bạn có mã hoàn toàn yêu cầu FileInputStream
, thì bạn sẽ cần phải trích xuất dữ liệu bằng cách sử dụng getResourceAsStream()
, sao chép dữ liệu đó vào tệp tạm thời, sau đó chuyển FileInputStream
cho tệp tạm thời đó vào mã của bạn.
Tất nhiên, trong tương lai, không bao giờ viết mã để mong đợi việc triển khai cụ thể những thứ như InputStream
, bạn sẽ luôn hối tiếc.
không tin phân tích cú pháp của bạn chỉ hoạt động trên FileInputStream nhưng không InputStream
nếu đó là trường hợp thực tế, và bạn phải sử dụng phân tích cú pháp
2 lựa chọn
sử dụng bộ chuyển đổi mô hình để tạo CustomFileInputStream và ghi đè lên các phương thức tương ứng, nhiều chuyển hướng dữ liệu getResourceAsStream đến CustomFileInputStream
lưu ur getResourceAsStream vào tệp tạm thời và phân tích cú pháp tệp tạm thời, sau đó xóa tệp khi hoàn thành
Gần đây tôi đã gặp phải vấn đề tương tự. Thư viện của bên thứ ba chúng tôi sử dụng lần đọc từ FileInputStream nhưng các tài nguyên có thể ở bất cứ đâu, trong JAR hoặc từ xa. Chúng tôi đã từng viết các tệp tạm thời nhưng có quá nhiều chi phí.
Một giải pháp tốt hơn là viết một FileInputStream kết thúc tốt đẹp InputStream. Đây là lớp chúng tôi sử dụng,
public class VirtualFileInputStream extends FileInputStream {
private InputStream stream;
public VirtualFileInputStream(InputStream stream) {
super(FileDescriptor.in); // This will never be used
this.stream = stream;
}
public int available() throws IOException {
throw new IllegalStateException("Unimplemented method called");
}
public void close() throws IOException {
stream.close();
}
public boolean equals(Object obj) {
return stream.equals(obj);
}
public FileChannel getChannel() {
throw new IllegalStateException("Unimplemented method called");
}
public int hashCode() {
return stream.hashCode();
}
public void mark(int readlimit) {
stream.mark(readlimit);
}
public boolean markSupported() {
return stream.markSupported();
}
public int read() throws IOException {
return stream.read();
}
public int read(byte[] b, int off, int len) throws IOException {
return stream.read(b, off, len);
}
public int read(byte[] b) throws IOException {
return stream.read(b);
}
public void reset() throws IOException {
stream.reset();
}
public long skip(long n) throws IOException {
return stream.skip(n);
}
public String toString() {
return stream.toString();
}
}
+1 nhưng tôi gọi nó là FakeFileInputStream để nhấn mạnh sự cần thiết của những thứ giả mạo :) và khuyến khích không sử dụng triển khai FileInputStream cụ thể. – helios
- 1. Cách truy cập tài nguyên trong tệp JAR?
- 2. Cách đọc tệp từ tệp jar?
- 3. Làm cách nào để truy cập tệp trong gói OSGi?
- 4. Truy cập các tệp thuộc tính bên ngoài .jar?
- 5. Tạo tệp RDF bằng tệp txt làm đầu vào
- 6. Đang cập nhật tệp .class trong jar
- 7. Làm cách nào để nối nhiều tệp txt vào cột?
- 8. Làm cách nào để đưa tệp jar vào thư mục lib của tệp tai bằng kiến?
- 9. Làm cách nào để thay đổi quyền truy cập tệp?
- 10. Làm cách nào để truy cập các tệp trên Heroku?
- 11. Làm cách nào để một FileInputStream có được nội dung của Tệp?
- 12. Cách lưu trữ Nhật ký trong tệp txt bằng android.util.log
- 13. Làm cách nào để truy cập các tệp bên trong tệp trứng trăn?
- 14. Đọc một dòng đặc biệt trong tệp txt trong Java
- 15. Tạo tệp txt mới bằng VB.NET
- 16. Cách truy cập Phiên trong tệp .ashx?
- 17. Cách đăng ký tệp JAR bằng tệp .PFX
- 18. Làm cách nào để tải các hàng cụ thể từ tệp .txt bằng Python?
- 19. Làm cách nào để thêm tệp TXT vào tài nguyên vào tệp EXE của tôi?
- 20. Làm cách nào để in cấu trúc lớp trong tệp jar bằng công cụ javap?
- 21. Cách tạo và ghi vào tệp txt bằng VBA
- 22. Làm cách nào để đọc tệp tài nguyên từ tệp jar Java?
- 23. Truy cập tệp cục bộ bằng NSURL
- 24. Cách truy cập tệp mạng?
- 25. Java FileInputStream ObjectInputStream đến cuối tệp EOF
- 26. Làm cách nào để tự động tạo tệp .jar trong một dự án Java Eclipse
- 27. PHP - Có thực hành tốt để lưu các truy vấn MYSQL trong một tệp txt không?
- 28. Làm cách nào để đọc tệp từ tệp Zip tới bộ nhớ bằng Java?
- 29. Làm cách nào để truy cập tệp cấu hình bên trong bình?
- 30. Tệp tin AndroidInInStreamStream đọc() txt đến chuỗi
Đây sẽ là lý do tại sao bạn nên viết mã cho giao diện chứ không phải triển khai. – Powerlord
Bạn không nên truyền luồng đầu vào cho việc triển khai của chúng. Họ được cho là đã triển khai ống và bộ lọc. Đó là, một (tập tin) inputrteam đọc từ một tập tin, giải nén khác (GZipI.S.), Một ngắt dòng (bufferedI.S.), Khác ... và như vậy. Vì vậy, nếu chương trình của bạn mong đợi một dòng byte mong đợi một inputstream (bất kỳ I.S.) và sau đó cung cấp một số triển khai của nó. Nếu bạn muốn chuyển đổi luồng nối với nhau: ví dụ: GZipInputStream (new FileInputStream (path)) mới. – helios