Làm cách nào để tạo tệp java.io.File mới trong bộ nhớ?


98

Làm cách nào để tạo mới File(từ java.io) trong bộ nhớ, không phải trên đĩa cứng?

Tôi đang sử dụng ngôn ngữ Java. Tôi không muốn lưu tệp trên ổ cứng.

Tôi phải đối mặt với một API xấu ( java.util.jar.JarFile). Nó mong đợi File filecủa String filename. Tôi không có tệp (chỉ byte[]nội dung) và có thể tạo tệp tạm thời, nhưng đó không phải là giải pháp đẹp. Tôi cần xác thực thông báo của một lọ đã ký.

byte[] content = getContent();
File tempFile = File.createTempFile("tmp", ".tmp");
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(archiveContent);
JarFile jarFile = new JarFile(tempFile);
Manifest manifest = jarFile.getManifest();

Bất kỳ ví dụ nào về cách đạt được tệp kê khai mà không cần tạo tệp tạm thời sẽ được đánh giá cao.


8
Vì vậy, bạn chỉ muốn byte trong bộ nhớ?
Sotirios Delimanolis

6
Bạn đang cố gắng làm gì với điều này File?
Jon Skeet

5
Một Fileđịnh nghĩa là trên ổ cứng.
Uwe Plonus

3
lợi ích của việc tạo một tệp nếu bạn không muốn nó trên bộ nhớ liên tục?
Bhavik Shah,

7
Chà, việc thiếu trí tưởng tượng trên StackOverflow thật đáng kinh ngạc. Ai đó có thể cần Tệp trong bộ nhớ đơn giản vì họ đang sử dụng giao diện yêu cầu Tệp. Giao diện lẽ ra phải được viết cho InputStream, nhưng không phải vậy. Một tệp tạm thời có vẻ như quá mức cần thiết, vì vậy một tệp java.io.File trong bộ nhớ sẽ thích hợp hơn.
Novaterata

Câu trả lời:


30

Để ghi vào luồng, trong bộ nhớ, hãy sử dụng:

new ByteArrayOutputStream();

5
Điều này không trả lời câu hỏi vì ByteArrayOutputStream không thể sử dụng được với giao diện yêu cầu đối tượng tệp.
FableBlaze

1
@FableBlaze Chà, câu trả lời cho câu hỏi sau đó, là “không thể”. Câu trả lời này cố gắng thực dụng và cho biết người dùng có thể làm gì để thay thế. Câu trả lời của Andreas rõ ràng là thấu đáo hơn và là một câu trả lời (cố gắng) tốt hơn.
haraldK

"Không thể" sẽ là một câu trả lời hợp lệ theo quan điểm của tôi. Tuy nhiên, tôi nghĩ rằng một hệ thống tệp trong bộ nhớ (được đề cập trong phần nhận xét của câu trả lời của Andreas) cũng có thể được đề cập, bởi vì nếu bạn không thể ghi vào ổ cứng vì một lý do nào đó, thì đó có thể là một cách giải quyết.
FableBlaze

80

Làm cách nào để tạo Tệp mới (từ java.io) trong bộ nhớ, không phải trong đĩa cứng?

Có thể bạn đang nhầm lẫn FileStream:

  • A Filelà một đại diện trừu tượng của tên đường dẫn tệp và thư mục . Sử dụng một Fileđối tượng, bạn có thể truy cập siêu dữ liệu tệp trong hệ thống tệp và thực hiện một số thao tác trên tệp trên hệ thống tệp này, chẳng hạn như xóa hoặc tạo tệp. Nhưng Filelớp không cung cấp các phương thức để đọc và ghi nội dung tệp.
  • Để đọc và ghi từ một tệp, bạn đang sử dụng một Streamđối tượng, như FileInputStreamhoặc FileOutputStream. Các luồng này có thể được tạo từ một Fileđối tượng và sau đó được sử dụng để đọc và ghi vào tệp.

Bạn có thể tạo một luồng dựa trên bộ đệm byte nằm trong bộ nhớ , bằng cách sử dụng a ByteArrayInputStreamvà a ByteArrayOutputStreamđể đọc và ghi vào bộ đệm byte theo cách tương tự như cách bạn đọc và ghi từ tệp. Các bytemảng chứa nội dung "File của". Khi đó bạn không cần một Fileđối tượng.

Cả luồng File...ByteArray...luồng đều kế thừa từ java.io.OutputStreamjava.io.InputStreamtương ứng để bạn có thể sử dụng lớp cha chung để ẩn xem bạn đang đọc từ tệp hay từ mảng byte.


95
Tôi không chắc đây có phải là những gì người đăng ban đầu muốn hay không, nhưng một ví dụ khi "Tệp trong bộ nhớ" sẽ hữu ích là khi bạn muốn sử dụng lại thư viện hiện có cần java.io.File làm tham số đầu vào, nhưng bạn thực sự muốn sử dụng "tệp" được lưu trữ trong bộ nhớ. Trong trường hợp đó, tôi nghĩ rằng một giải pháp sẽ là sử dụng Apache Commons VFS để khởi tạo DefaultFileSystemManager và sử dụng nó để tạo RamFileProvider. Tôi sẽ bổ sung này như một (hoàn chỉnh hơn) câu trả lời thích hợp, nhưng có vẻ như câu hỏi này đã bị đóng cửa một số thời gian trước đây ...
Sorin Postelnicu

2
+1 Tôi đang tìm kiếm loại giải pháp này, để kiểm tra đơn vị đến thành phần mà không cần phải sử dụng tệp thực tế
GClaramunt

3
Nếu bạn không muốn tạo "một tệp thực" thì bạn có thể thử tạo một tệp tạm thời. Xem createTempFilecho java.io.file. Tệp này có thể được đặt thành tự động xóa khi bài kiểm tra đơn vị thoát.
Andrew-Dufresne

2
Điều này không trả lời câu hỏi. Như @SorinPostelnicu đã nói rõ "Tệp" trong bộ nhớ giống như Hệ thống tệp trong bộ nhớ hoặc tương tự.
Felipe

1
Có lẽ tổng hợp trường hợp sử dụng của OP và một phương pháp có giá trị để giảm độ trễ với i / o đĩa hệ thống đắt tiền.
Eddie B

3

Bạn có thể sử dụng hệ thống tệp trong bộ nhớ, chẳng hạn như Jimfs

Đây là một ví dụ sử dụng từ readme của họ:

FileSystem fs = Jimfs.newFileSystem(Configuration.unix());
Path foo = fs.getPath("/foo");
Files.createDirectory(foo);

Path hello = foo.resolve("hello.txt"); // /foo/hello.txt
Files.write(hello, ImmutableList.of("hello world"), StandardCharsets.UTF_8);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.