Как записать массив в файл java

Обновлено: 03.07.2024

Я пытался записать массив в файл. Я знаю, как записать целые числа или строку в файл, но принести массив меня смущает. Я использую это прямо сейчас:

как записать массив символов в java socketchannel. Я не могу записать данные char в socketchannel, так как это занимает ByteBuffer.

Я хочу записать байтовый массив в файл в виде байтов. например, byt[] =hello.getBytes(); я хочу записать byt в файл таким образом, чтобы я видел содержимое как байты, а не как hello. Как я могу это сделать?

Как уже говорили другие, вы можете просто пройтись по массиву и распечатать элементы один за другим. Чтобы выходные данные отображались в виде чисел вместо "letters and symbols", которые вы видели, вам нужно преобразовать каждый элемент в строку. Таким образом, ваш код становится чем-то вроде этого:

Если вы просто хотите распечатать массив , например [1, 2, 3, . ] , вы можете заменить цикл на этот лайнер:

Класс ObjectOutputStream можно использовать для записи объектов в базовый поток.

И прочитал Object назад, как -

Если вы не против Apache commons lib

Просто зацикливайтесь на элементах в вашем массиве.

Если результат предназначен для чтения людьми и элементы массива имеют правильный toString() .

Похожие вопросы:

Я относительно новичок в maxima. Я хочу знать, как записать массив в текстовый файл с помощью maxima.

Как записать байтовый массив в файл в Java?

как записать массив символов в java socketchannel. Я не могу записать данные char в socketchannel, так как это занимает ByteBuffer.

Я хочу записать байтовый массив в файл в виде байтов. например, byt[] =hello.getBytes(); я хочу записать byt в файл таким образом, чтобы я видел содержимое как байты, а не как hello. Как я могу это.

У меня есть образец массива следующим образом var arr = [ [ 1373628934214, 3 ], [ 1373628934218, 3 ], [ 1373628934220, 1 ], [ 1373628934230, 1 ], [ 1373628934234, 0 ], [ 1373628934237, -1 ], [.

Я работаю над проектом в java и пытаюсь записать массив байтов в файл (как значения hex). Я перепробовал все, что мог придумать, но мне все равно кажется, что он записывается в виде строк, а не.

Я пытаюсь написать фрагмент кода в Java, который генерирует массив данных, и я хотел бы записать эти данные в файл CSV в одном столбце. Тем не менее, я борюсь с получением правильного вывода. Моя.

У меня есть массив целых чисел: [56, 6090, 1510, 256, 17] Как записать это в файл в режиме добавления? У меня будет еще много массивов, которые можно записать в один и тот же файл.. как я могу.

У меня возникла одна и та же проблема, и проблема заключалась в том, что у меня было несколько проектов в решении ( Web и Droid ), и хотя Default project был выбран в Package Manager Console , он использовал строку подключения из Droid project:

После установки Startup Project на Web и Default Project в Package Manger Console я получил его для работы.

Обратите внимание, что каждый из примеров кода ниже может выдать IOException . Блоки try / catch / finally для краткости опущены.

Создание текстового файла (обратите внимание, что это будет перезаписывать файл, если он уже существует):

Создание двоичного файла (это также перезапишет файл):

Пользователи Java 7+ могут использовать класс Files для записи в файлы :

Создание текстового файла:

Создание двоичного файла:

Стоит отметить, что PrintWriter усечет размер файла до нуля, если файл уже существует – Covar 21 May 2010 в 21:16 PrintWriter может использоваться (и часто используется), но не является (концептуально) правильным классом для задания. Из документов: "PrintWriter prints formatted representations of objects to a text-output stream. " Ответ Божо более правильный, хотя он выглядит громоздким (вы всегда можете обернуть его каким-то способом утилиты). – leonbloy 21 May 2010 в 21:40 @MarlonAbeykoon Хороший вопрос. Ответ заключается в том, что он создаст текстовый файл в рабочем каталоге . Рабочий каталог - это любая директория, из которой вы выполняете свою программу. Например, если вы выполняете свою программу из командной строки, тогда рабочий каталог будет любой директорией, в которой вы находитесь & quot; & quot; в этот момент (в Linux, типа & quot; pwd & quot; для просмотра текущего рабочего каталога). Или, если я дважды щелкнул JAR-файл на своем рабочем столе, чтобы запустить его, тогда рабочий каталог будет рабочим столом. – Michael 2 September 2014 в 13:06 Не было бы лучше поставить output.close () в блок finally? – qed 6 November 2014 в 01:00 Простой код здесь никогда не может быть ответом. Вы должны объяснить. – user207421 14 April 2017 в 01:34 на самом деле это не будет компилироваться, output.close() выбрасывает IOException – Bob Yoplait 9 November 2017 в 16:19

Если у вас уже есть контент, который вы хотите записать в файл (и не генерируется «на лету»), добавление java.nio.file.Files в Java 7 как часть встроенного ввода-вывода обеспечивает простейший и наиболее эффективный способ достижения ваших целей.

В основном создание и запись в файл - это только одна строка, более того, один простой вызов метода!

В следующем примере создается и записывается 6 разных файлы, чтобы продемонстрировать, как это можно использовать:

Красиво сделано. Мне нравится пример file5 и file6. Чтобы проверить файл6, убедитесь, что вы дважды запускаете программу, затем увидите, что она снова добавляет строки. – tazboy 13 November 2016 в 05:22

Если мы используем Java 7 и выше, а также знаем, какой контент будет добавлен (добавлен) в файл, мы можем использовать метод newBufferedWriter в пакете NIO.

Есть несколько замечаний:

  1. Всегда хорошая привычка указывать кодировку кодировки и для этого мы имеем константу в классе StandardCharsets .
  2. В коде используется инструкция try-with-resource , в которой ресурсы автоматически закрываются после попытки.

Хотя OP не спросил, но на всякий случай мы хотим искать строки с определенным ключевым словом, например confidential мы можем использовать потоковые API в Java:

Используя Google Guava-библиотеку, мы можем легко создать и записать файл.

В примере создается новый файл fruits.txt в корневом каталоге проекта.

Только одна строка! path и line являются строками

Ах, автор явно указал «текст». файлы. И текстовые файлы состоят из символов. Двоичные файлы состоят из байтов. Кроме того, неясно, что lines . Если это java.lang.String , то вызов getBytes() будет генерировать байты с использованием платформы default , что не очень хорошо в общем случае. – afk5min 13 May 2015 в 04:45

Вот некоторые из возможных способов создания и записи файла в Java:

Для дополнительной проверки этого руководства о том, как читать и записывать файлы в Java .

Если вы по какой-то причине хотите отделить действие создания и записи, эквивалент Java touch -

createNewFile() , проверка наличия и файл создаются атомарно. Это может быть полезно, если вы хотите, чтобы вы были создателем файла, прежде чем писать его, например.

[touch] также обновляет временную метку файла как побочный эффект (если он уже существует). У этого также есть побочный эффект? – Ape-inago 21 August 2013 в 19:34 @ Ape-inago: В моей системе это, конечно, не было (он просто возвращает false и не влияет на файл). Я не имел в виду touch в общем смысле, а скорее в своем общем вторичном использовании для создания файла без записи данных на него. Задокументированная цель - обновить временную метку файла. Создание файла, если оно не существует, действительно является побочным эффектом и может быть отключено с помощью переключателя. – Mark Peters 21 August 2013 в 20:30

Вот небольшая примерная программа для создания или перезаписывания файла. Это длинная версия, поэтому ее легче понять.

Чтение коллекции с клиентами и сохранение в файл с помощью JFilechooser.

Похоже, у писателя нет метода writeln (). Он имеет только write () – YankeeWhiskey 11 July 2013 в 14:35 Если вы измените тип записи на BufferedWriter (который на самом деле есть), вы можете использовать writer.newLine () – Niek 5 December 2013 в 12:48 Не похоже, чтобы в конце наконец попытался / поймать. Я знаю причину, но это похоже на запах кода. – ashes999 7 December 2013 в 04:48 Следует отметить, что это Java 7-функция, поэтому не будет работать в предыдущих версиях Java. – Dan Temple 3 June 2014 в 08:34 это самый простой способ, который я нашел . все проблемы решены здесь, и только текст необходимо вставить – Rohit ZP 15 July 2014 в 15:50 @Trengot Это так. Вызов close() в любом потоке, обернутом вокруг любого другого, также закроет все внутренние потоки. – Nic Hartley 18 November 2014 в 18:23 Обратите внимание, что закрытия BufferedWriter достаточно, так как он также заботится о закрытии FileWriter. – rbaleksandar 29 August 2015 в 13:48 «Если файл не может быть написан / добавлен, вы, возможно, не сможете даже знать, почему» не соответствует действительности. Вы точно узнаете, почему, из текста FileNotFoundException , который вызывается, когда операция завершается с ошибкой. – user207421 26 November 2016 в 02:23 Я рассмотрю встроенные реализации для типичных файловых систем (которые будут в OpenJDK, но у меня нет оснований думать, что эта часть будет отличаться в запатентованной Oracle JDK или значительно отличается в проприетарном IBM JDK и других) и обновление мой ответ основывался на этих выводах. Ваш комментарий имеет смысл - просто потому, что у «многих методов» могут быть проблемы, автор ясно заявил, что это только операция записи / добавления к файлу, о которой они заботятся. – afk5min 14 April 2017 в 06:48 File.exists () / createNewFile () не бессмысленна и расточительна. Я искал способ выполнить другой код, основываясь на том, присутствует ли файл уже. Это было очень полезно. – KirstieBallance 27 December 2017 в 18:50 Я использовал этот метод, но вы должны знать, что он каждый раз перезаписывает файл. Если вы хотите, чтобы он был добавлен в случае, если файл существует, вам необходимо создать экземпляр FileWriter следующим образом: new FileWriter(file.getAbsoluteFile(),true) – Adelin 23 February 2018 в 08:14 По той причине, о которой я говорил, это обе бессмысленно и . Вы вызываете тесты two , два создания, и удаление: и вы not выполняете другой код здесь в зависимости от того, присутствует ли файл уже. – user207421 29 June 2018 в 01:05 И точка перезаписи файла с новым контентом не указана. – user207421 29 June 2018 в 01:08

В Java 8 используйте файлы и пути и используя конструкцию try-with-resources.

Если вы хотите иметь относительно безболезненный опыт, вы также можете взглянуть на пакет Apache Commons IO , более конкретно класс FileUtils .

Никогда не забывайте проверять сторонние библиотеки. Joda-Time для обработки даты, Apache Commons Lang StringUtils для обычных операций с строками и, таким образом, сделает ваш код более читаемым.

Java - отличный язык, но стандартная библиотека иногда немного низкоуровневая. Мощный, но низкий уровень, тем не менее.

лучший способ - использовать Java7: Java 7 вводит новый способ работы с файловой системой, а также новый класс утилиты - Files. Используя класс Files, мы можем создавать, перемещать, копировать, удалять файлы и каталоги; его также можно использовать для чтения и записи в файл.

Запись с помощью FileChannel. Если вы имеете дело с большими файлами, FileChannel может быть быстрее стандартного ввода-вывода. Следующий код записывает String в файл с помощью FileChannel:

Запись с помощью DataOutputStream

Запись с помощью FileOutputStream

Давайте посмотрим, как мы можем используйте FileOutputStream для записи двоичных данных в файл. Следующий код преобразует строковый int bytes и записывает байты в файл с помощью FileOutputStream:

Write with PrintWriter мы можем использовать PrintWriter для записи форматированного текста в файл:

Запись с помощью BufferedWriter: используйте BufferedWriter для записи String в новый файл:

Как видно из заголовка, я ищу самый быстрый способ записи целочисленных массивов в файлы. Массивы будут различаться по размеру и реально будут содержать от 2500 до 25 000 000 дюймов.

Вот код, который я сейчас использую:

Учитывая, что в DataOutputStream есть метод для записи массивов байтов, я попытался преобразовать массив int в байтовый массив следующим образом:

Кажется, что оба дают небольшое увеличение скорости, около 5%. Я не достаточно тщательно их протестировал, чтобы это подтвердить.

Существуют ли какие-либо методы, ускоряющие эту операцию записи в файл, или соответствующие руководства, которые помогут повысить производительность записи Java IO?

Я рассмотрел три варианта:

  1. Использование DataOutputStream ;
  2. Использование ObjectOutputStream (для Serializable объекты, которые int[] есть); и
  3. Использование FileChannel .

Так что версия NIO самая быстрая. Он также имеет то преимущество, что позволяет редактировать, то есть вы можете легко изменить один int, тогда как ObjectOutputStream потребует чтения всего массива, его изменения и записать его в файл.

Я бы использовал FileChannel из пакета nio и ByteBuffer . Похоже, этот подход (на моем компьютере) повышает производительность записи в от 2 до 4 раз :

Вывод из программы:

Я думаю, вам следует рассмотреть возможность использования файловых каналов (библиотека java.nio) вместо простых потоков (java.io). Хорошей отправной точкой является это интересное обсуждение: FileChannel Java NIO против производительности /полезности FileOutputstream

и соответствующие комментарии ниже.

Тесты должны повторяться время от времени, не так ли? :) После исправления некоторых ошибок и добавления собственного варианта написания, вот результаты, которые я получаю при запуске теста на ASUS ZenBook UX305 под управлением Windows 10 (время указано в секундах):

А вот результаты, запущенные на том же компьютере, но с Arch Linux и порядок записи методов переключаются:

Каждый тест записывал файл размером 800 Мб. Небуферизованный DataOutputStream взял долго, поэтому я исключил его из теста.

Как видно, запись с использованием файлового канала по-прежнему бьет все дерьмо другие методы, но это имеет большое значение, является ли байтовый буфер отображается в памяти или нет. Без отображения памяти запись файла канала заняло 3-5 секунд:

Но учтите, что результаты зависят от порядка. Особенно так далее Linux. Похоже, что отображенные в память методы не записывают данные в полном объеме, а скорее выгружает запрос задания в ОС и возвращает до его завершения. Желательно ли такое поведение или нет зависит от ситуации.

Как видно из заголовка, я ищу самый быстрый способ записи целочисленных массивов в файлы. Массивы будут различаться по размеру и реально будут содержать от 2500 до 25 000 000 дюймов.

Вот код, который я сейчас использую:

Учитывая, что в DataOutputStream есть метод для записи массивов байтов, я попытался преобразовать массив int в байтовый массив следующим образом:

Кажется, что оба дают небольшое увеличение скорости, около 5%. Я не достаточно тщательно их протестировал, чтобы это подтвердить.

Существуют ли какие-либо методы, ускоряющие эту операцию записи в файл, или соответствующие руководства, которые помогут повысить производительность записи Java IO?

Я рассмотрел три варианта:

  1. Использование DataOutputStream ;
  2. Использование ObjectOutputStream (для Serializable объекты, которые int[] есть); и
  3. Использование FileChannel .

Так что версия NIO самая быстрая. Он также имеет то преимущество, что позволяет редактировать, то есть вы можете легко изменить один int, тогда как ObjectOutputStream потребует чтения всего массива, его изменения и записать его в файл.

Я бы использовал FileChannel из пакета nio и ByteBuffer . Похоже, этот подход (на моем компьютере) повышает производительность записи в от 2 до 4 раз :

Вывод из программы:

Я думаю, вам следует рассмотреть возможность использования файловых каналов (библиотека java.nio) вместо простых потоков (java.io). Хорошей отправной точкой является это интересное обсуждение: FileChannel Java NIO против производительности /полезности FileOutputstream

и соответствующие комментарии ниже.

Тесты должны повторяться время от времени, не так ли? :) После исправления некоторых ошибок и добавления собственного варианта написания, вот результаты, которые я получаю при запуске теста на ASUS ZenBook UX305 под управлением Windows 10 (время указано в секундах):

А вот результаты, запущенные на том же компьютере, но с Arch Linux и порядок записи методов переключаются:

Каждый тест записывал файл размером 800 Мб. Небуферизованный DataOutputStream взял долго, поэтому я исключил его из теста.

Как видно, запись с использованием файлового канала по-прежнему бьет все дерьмо другие методы, но это имеет большое значение, является ли байтовый буфер отображается в памяти или нет. Без отображения памяти запись файла канала заняло 3-5 секунд:

Но учтите, что результаты зависят от порядка. Особенно так далее Linux. Похоже, что отображенные в память методы не записывают данные в полном объеме, а скорее выгружает запрос задания в ОС и возвращает до его завершения. Желательно ли такое поведение или нет зависит от ситуации.

Читайте также: