Як створити новий файл java.io.File в пам'яті?


98

Як я можу створювати нові Filejava.io) в пам'яті, а не на жорсткому диску?

Я використовую мову Java. Я не хочу зберігати файл на жорсткому диску.

Я зіткнувся з поганим API ( java.util.jar.JarFile). Він очікує File fileвід String filename. У мене немає файлу (лише byte[]вміст) і я можу створити тимчасовий файл, але це не найкраще рішення. Мені потрібно перевірити дайджест підписаної банки.

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();

Будемо вдячні за будь-які приклади того, як отримати маніфест без створення тимчасового файлу.


8
Отже, ви просто хочете байтів у пам’яті?
Sotirios Delimanolis

6
Що ви намагаєтесь з цим зробитиFile ?
Джон Скіт,

5
A Fileза визначенням знаходиться на жорсткому диску.
Уве Плонус,

3
який сенс створювати файл, якщо ви не хочете його мати в постійній пам’яті?
Bhavik Shah

7
Ого, відсутність фантазії на StackOverflow вражає. Комусь може знадобитися простий файл у пам’яті, оскільки він використовує інтерфейс, для якого потрібен файл. Інтерфейс повинен був бути написаний для InputStream, але це не так. Тимчасовий файл просто здається надмірним, тому в пам'яті буде бажаним java.io.File.
Новатерата

Відповіді:


30

Для запису в потік в пам’яті використовуйте:

new ByteArrayOutputStream();

5
Це не відповідає на запитання, оскільки ByteArrayOutputStream не можна використовувати з інтерфейсом, який вимагає файловий об'єкт.
FableBlaze

1
@FableBlaze Ну, тоді відповідь на запитання: "це неможливо". Ця відповідь намагається бути прагматичною та розповісти, що замість цього міг зробити користувач. Відповідь Андреаса, очевидно, є ґрунтовнішою та кращою (спроба відповіді).
haraldK

"Це неможливо", на мою думку, буде вірною відповіддю. Однак я думаю, що файлова система в пам'яті (згадана в коментарях до відповіді Андреаса) також може бути згадана, тому що якщо ви не можете з якихось причин писати на жорсткий диск, то це може обійти її.
FableBlaze

80

Як я можу створити новий файл (з java.io) в пам'яті, а не на жорсткому диску?

Можливо, ви заплутали Fileі Stream:

  • A File- абстрактне подання імен шляхів до файлів і каталогів . Використовуючи Fileоб’єкт, ви можете отримати доступ до метаданих файлів у файловій системі та виконати деякі операції з файлами у цій файловій системі, наприклад, видалити або створити файл. Але Fileклас не передбачає методів читання та запису вмісту файлу.
  • Для читання та запису з файлу ви використовуєте Streamоб'єкт, наприклад FileInputStreamабо FileOutputStream. Ці потоки можна створити з Fileоб'єкта, а потім використовувати для читання та запису у файл.

Ви можете створити потік на основі байтового буфера, який знаходиться в пам'яті , використовуючи a ByteArrayInputStreamта a ByteArrayOutputStreamдля читання та запису в байт-буфер аналогічним чином, як ви читаєте та пишете з файлу. byteМасив містить вміст «файлу». FileТоді вам не потрібен об’єкт.

І потоки, File...і ByteArray...потоки успадковуються від java.io.OutputStreamі java.io.InputStream, відповідно, так що ви можете використовувати загальний суперклас, щоб приховати, чи читаєте ви з файлу чи з байтового масиву.


95
Я не впевнений, що саме цього хотів оригінальний плакат, але одним із прикладів, коли "Файл у пам'яті" буде корисним, є те, коли ви хочете повторно використовувати існуючу бібліотеку, яка потребує файлу java.io.File як вхідний параметр, але ви насправді хочу використовувати "файли", що зберігаються в пам'яті. У такому випадку я думаю, що одним із рішень було б використання Apache Commons VFS для створення екземпляра DefaultFileSystemManager і використання його для створення RamFileProvider. Я б додав це як (більш повну) правильну відповідь, але, схоже, це питання було закрито деякий час тому ...
Сорін Постельнику

2
+1 Я шукав такого роду рішення, щоб компонент unit test come не використовував фактичний файл
GClaramunt

3
Якщо ви не хочете створювати "фактичний файл", спробуйте створити тимчасовий файл. Див createTempFileдля java.io.file. Цей файл можна налаштувати на автоматичне видалення при виході модульного тесту.
Andrew-Dufresne

2
Це не відповідає на запитання. Як добре сказав @SorinPostelnicu, "Файл" у пам'яті - це щось на зразок Файлової системи в пам'яті або близько того.
Феліпе

1
Ймовірно, це підсумки використання OP та цінний метод зменшення затримки за допомогою дорогого системного вводу-виводу.
Едді Б,

3

Ви можете використовувати файлову систему в пам'яті, таку як Jimfs

Ось приклад використання з їх readme:

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.