Как сохранить в файл в Java

Обновлено: 21.11.2024

Следуйте описанным ниже шагам, чтобы сохранить, скомпилировать и запустить программу Java. В этих инструкциях содержится только минимум информации, необходимой для компиляции и запуска примера программы для этого урока. Для получения дополнительной информации о компиляторе, интерпретаторе, а также о структурировании среды программирования и управлении ею см. соответствующий урок в разделе Среда разработки Java .

Сохранение Java-программы

Вы можете использовать любой редактор или программу обработки текстов для создания и редактирования программы Java, если она может сохранять файлы в формате ASCII. Java-программы должны быть сохранены в файле, имя которого заканчивается расширением .java, поэтому с помощью вашего любимого редактора ASCII введите программу точно так, как она представлена ​​на первой странице этого урока, и сохраните программу в файле с именем DateApp.java.

Компиляция Java-программы

Создав программу на Java, вы должны скомпилировать ее с помощью компилятора Java, прежде чем запускать ее. Если у вас возникли проблемы, см. раздел Устранение неполадок компилятора.

Компилятор Java преобразует исходный код Java в байт-коды Java, которые являются компонентами машинного языка для виртуальной машины Java. Байт-коды Java интерпретируются и выполняются интерпретатором Java.

При компиляции исходного файла Java компилятор создает файл с расширением .class в той же папке, что и исходный файл. Компилятор называет результирующий файл .class именем класса, определенного в исходном файле. Например, когда вы компилируете класс DateApp, созданный выше, компилятор называет результирующий файл класса DateApp.class после класса, независимо от имени исходного файла. Даже если бы вы сохранили класс DateApp в исходный файл с именем Wow.java, компилятор все равно создал бы файл с именем DateApp.class. По соглашению, чтобы избежать путаницы, исходные файлы Java называются в соответствии с классом, определенным внутри.

Запуск приложения Java

Теперь вы можете запустить свое приложение с помощью интерпретатора Java. Программа должна отображать текущую дату и время. Если у вас возникли проблемы, см. раздел Устранение неполадок с интерпретатором .

Сохранение строки в файлы можно выполнить несколькими способами с помощью Java. В этой статье мы покажем некоторые распространенные методы записи строки в файл.

Вот список всех классов и методов, которые мы рассмотрим:

Файлы.writeString()

Начиная с Java 11 класс Files содержит полезный служебный метод Files.writeString() . Этот метод существует в двух вариантах. В самой простой форме требуется путь к файлу для записи и текстовое содержимое. Другой вариант также принимает необязательный CharSet :

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

Файлы.write()

Как и другие объекты, строку можно преобразовать в byte[] . Метод Files.write() работает с байтами:

Нет необходимости закрывать какие-либо ресурсы, поскольку мы сами не открывали никаких ресурсов.

FileWriter

FileWriter — это один из самых простых способов записи текстового содержимого в файл. Мы создадим экземпляр File и передадим его в конструктор FileWriter, чтобы «соединить» их.

Затем мы просто используем экземпляр FileWriter для записи в него:

После использования модуля записи важно очистить и закрыть ресурсы. Кроме того, вы можете сделать это с помощью синтаксиса try-with-resources:

Буферизованная запись

BufferedWriter — это объект-оболочка, который используется вокруг объектов типа Writer . Если у нас есть существующий Writer, такой как FileWriter, мы можем обернуть его внутри BuffereWriter.

BufferedWriter лучше всего использовать, когда для файла выполняется несколько операций записи(). В этом случае эти множественные записи временно сохраняются во внутреннем буфере и записываются в файл только тогда, когда содержимого достаточно. Это позволяет избежать сохранения каждого нового фрагмента текста в файле и вместо этого обеспечивает соответствующий буфер для временного хранения.

Использование BufferedWriter намного эффективнее, чем FileWriter, для многократной записи, но не помогает при одиночной записи.

На самом деле использование BufferedWriter для одной записи приведет к ненужным накладным расходам. Для таких простых случаев лучше использовать FileWriter.

Давайте создадим BufferedWriter:

BufferedWriter и FileWriter расширяют Writer, поэтому у них одни и те же методы:

Принтрайтер

PrintWriter позволяет форматировать текст перед его записью. Он содержит привычные нам методы, такие как printf() , println() и т. д. Давайте создадим PrintWriter :

Лучший способ работы с PrintWriter — использовать синтаксис try-with-resources:

Бесплатная электронная книга: Git Essentials

Ознакомьтесь с нашим практическим руководством по изучению Git, включающим передовые практики, общепринятые стандарты и памятку. Перестаньте гуглить команды Git и на самом деле изучите их!

После того как у нас есть экземпляр PrintWriter, давайте рассмотрим некоторые из предоставляемых им методов.

PrintWriter с append()

PrintWriter, как и StringBuilder, предоставляет метод append(), который позволяет добавлять содержимое в конец существующего файла.

Давайте добавим (appent()) некоторый текст в пустой модуль записи:

Метод append() возвращает объект PrintWriter, для которого он был вызван. Это позволяет связывать методы append() и организовывать их более аккуратно:

PrintWriter с print()

PrintWriter содержит методы форматированной печати. К ним относятся print() , printf() и println() :

PrintWriter с write()

С помощью write() мы можем записывать в поток текстовое содержимое различных типов. Примеры включают массивы символов, строки и целые числа:

Метод write() принимает только содержимое без параметров форматирования, поэтому он похож на print() , но не может форматировать строки.

Чтобы завершить каждый "сеанс" PrintWriter добавления, печати или записи, важно сбросить и закрыть поток:

Метод flush() "сбрасывает" содержимое в файл, а метод close() окончательно закрывает поток.

Примечание. Если вы используете синтаксис try-with-resources, он автоматически сбросит и закроет поток.

Заключение

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

Мы рассмотрели методы Files.writeString(), Files.write(), а также классы FileWriter, BufferedWriter и PrintWriter.


Сохранение объектов в файл в Java состоит из нескольких шагов, но это довольно просто. Мы открываем файл для записи, создаем «поток» для помещения объектов в файл, записываем объекты в этот поток, чтобы поместить их в файл, а затем закрываем поток и файл, когда закончим.

Повторяю:

1. Откройте файл.

<р>2. Откройте поток объектов в файл.

<р>3. Запишите объекты в этот поток.

<р>4. Закройте поток и файл.

1. Открытие файла
Чтобы открыть файл для записи, мы используем объект FileOutputStream. Когда мы создаем новый FileOutputStream, мы даем ему имя файла для открытия. Если имя файла существует, он открывает существующий файл. В противном случае создается новый файл. Для простоты мы не будем проверять наличие здесь файла или что-то в этом роде.

Пример:
FileOutputStream saveFile = new FileOutputStream("saveFile.sav");

<р>2. Откройте поток объектов.
Для записи объектов в поток FileOutputStream мы создаем поток ObjectOutputStream. Мы передаем ему объект FileOutputStream, который создали при создании нового объекта ObjectOutputStream.

Пример:
ObjectOutputStream save = ObjectOutputStream(saveFile);

<р>3. Запись объектов
Когда мы записываем объекты в ObjectOutputStream, они отправляются через него в FileOutputStream и в файл.

<р>4. Close Up
Когда мы закроем ObjectOutputStream, он также закроет для нас наш FileOutputStream, так что это всего лишь один шаг.

Чтение файлов данных с помощью Java


Теперь нам нужно знать, как вернуть данные из файла с помощью Java. Поскольку объекты данных были сохранены с использованием ObjectOutputStream, они сохраняются таким образом, чтобы их было легко прочитать с помощью ObjectInputStream.

Однако есть одна проблема с ObjectImputStream. Он не возвращает объекты определенных классов, которыми они были изначально. Он просто возвращает общие объекты. Чтобы вернуть вещи в их первоначальный класс, мы должны привести их к этому типу. Обычно это означает, что нам нужно знать, каким был их класс, когда они были написаны. Можно сохранить информацию о классе вместе с данными, но в этом случае мы просто предполагаем, что считываем файл, который мы написали, поэтому мы уже знаем, к какому классу все должно относиться. Подробнее о чтении других файлов я расскажу в другой статье.

Действия практически такие же, как и для записи объектов в файл:

1. Откройте файл.

<р>2. Откройте поток объектов из файла.

<р>3. Считайте объекты в этот поток.

<р>4. Закройте поток и файл.

1. Открытие файла
Чтобы открыть файл для чтения, мы используем объект FileInputStream. Когда мы создаем новый FileIntputStream, мы даем ему имя файла для открытия. Если имя файла существует, он открывает существующий файл. В противном случае мы получим ошибку, которая распечатает настиграмму, когда мы доберемся до нашего оператора catch. Для простоты мы не будем проверять наличие файла здесь.

Пример:
FileInputStream saveFile = new FileInputStream("saveFile.sav");

<р>2.Откройте поток объектов.
Чтобы читать объекты в FileInputStream, мы создаем ObjectInputStream. Мы передаем ему объект FileInputStream, который создали при создании нового ObjectInputStream.

Пример:
ObjectInputStream restore = ObjectInputStream(saveFile);

<р>3. Чтение объектов
Когда мы читаем объекты из ObjectInputStream, он получает их из файла.

Пример:
Object obj = restore.readObject();

3 с половиной. Cast Back to Class
Шаг 3. восстанавливает только общий объект. Если мы знаем исходный класс, мы должны привести объект обратно к его исходному классу, когда мы его прочитаем. Если бы мы сохранили объект String, то прочитали бы его примерно так:
Имя строки = (String) restore.readObject();

<р>4. Close Up
Когда мы закроем ObjectInputStream, он также закроет для нас наш FileInputStream, так что это всего лишь один шаг.

Вот пример программы для считывания информации, сохраненной первой программой-примером:

Примеры программ можно загрузить по адресу:
Начните с загрузки кода Java

Пришло время написать ваше первое приложение! Следующие инструкции предназначены для пользователей Windows Vista, Windows 7 и Windows 8. Инструкции для других платформ находятся в разделе «Hello World!». для ОС Solaris, Linux и Mac OS X и "Hello World!" для среды IDE NetBeans.

Контрольный список

Чтобы написать свою первую программу, вам потребуется:

Комплект разработки Java SE 8 (JDK 8)

Вы можете загрузить версию для Windows прямо сейчас. (Убедитесь, что вы загружаете JDK, не JRE.) Ознакомьтесь с инструкциями по установке.

В этом примере мы будем использовать Блокнот, простой редактор, входящий в состав платформ Windows. Вы можете легко изменить эти инструкции, если используете другой текстовый редактор.

Эти два элемента — все, что вам нужно для написания вашего первого приложения.

Создание вашего первого приложения

Ваше первое приложение, HelloWorldApp, будет просто отображать приветствие "Hello world!". Чтобы создать эту программу, вы должны:

Создать исходный файл

Исходный файл содержит код, написанный на языке программирования Java, понятный вам и другим программистам. Вы можете использовать любой текстовый редактор для создания и редактирования исходных файлов.

Скомпилируйте исходный файл в файл .class

компилятор языка программирования Java ( javac ) берет ваш исходный файл и переводит его текст в инструкции, понятные виртуальной машине Java. Инструкции, содержащиеся в этом файле, известны как байт-коды.

Запустить программу

Приложение Java средство запуска ( java ) использует виртуальную машину Java для запуска вашего приложения.

Создать исходный файл

Чтобы создать исходный файл, у вас есть два варианта:

Вы можете сохранить файл HelloWorldApp.java на своем компьютере и не набирать много текста. Затем вы можете сразу перейти к компиляции исходного файла в файл .class.

Или вы можете использовать следующие (более длинные) инструкции.

Сначала запустите редактор. Вы можете запустить редактор «Блокнот» из меню «Пуск», выбрав «Программы» > «Стандартные» > «Блокнот». В новом документе введите следующий код:

Будьте осторожны при вводе текста

Примечание. Введите весь код, команды и имена файлов точно так, как показано. И компилятор ( javac ), и средство запуска ( java ) чувствительны к регистру, поэтому вы должны постоянно использовать заглавные буквы.

HelloWorldApp отличается от helloworldapp .

Сохраните код в файле с именем HelloWorldApp.java. Чтобы сделать это в Блокноте, сначала выберите «Файл» > «Сохранить как». пункт меню. Затем в диалоговом окне «Сохранить как»:

  1. Используя поле со списком Сохранить в, укажите папку (каталог), в которой вы сохраните файл. В этом примере это каталог myapplication на диске C.
  2. В текстовом поле "Имя файла" введите "HelloWorldApp.java" без кавычек.
  3. В поле со списком Тип файла выберите Текстовые документы (*.txt).
  4. В поле со списком "Кодировка" оставьте кодировку ANSI.

Когда вы закончите, диалоговое окно должно выглядеть следующим образом.

Диалоговое окно "Сохранить как" непосредственно перед нажатием кнопки "Сохранить".

Теперь нажмите Сохранить и выйдите из Блокнота.

Скомпилируйте исходный файл в файл .class

Открыть оболочку или «командное» окно. Вы можете сделать это из меню «Пуск», выбрав «Выполнить». а затем введите cmd . Окно оболочки должно выглядеть примерно так, как показано на следующем рисунке.

Приглашение показывает ваш текущий каталог.Когда вы вызываете приглашение, ваш текущий каталог обычно является вашим домашним каталогом для Windows XP (как показано на предыдущем рисунке).

Чтобы скомпилировать исходный файл, измените текущий каталог на каталог, в котором находится ваш файл. Например, если исходным каталогом является myapplication на диске C, введите в командной строке следующую команду и нажмите Enter:

Теперь подсказка должна измениться на C:\myapplication> .

Чтобы перейти в каталог на другом диске, необходимо ввести дополнительную команду: имя диска. Например, чтобы перейти в каталог myapplication на диске D, необходимо ввести D: следующим образом:

Если вы введете dir в командной строке, вы должны увидеть исходный файл следующим образом:

Теперь вы готовы к компиляции. В командной строке введите следующую команду и нажмите Enter.

Компилятор создал файл байт-кода HelloWorldApp.class . В командной строке введите dir, чтобы увидеть новый файл, созданный следующим образом:

Теперь, когда у вас есть файл .class, вы можете запустить свою программу.

Если у вас возникнут проблемы с инструкциями на этом шаге, обратитесь к разделу Общие проблемы (и их решения).

Запустить программу

В том же каталоге введите в командной строке следующую команду:

Вы должны увидеть на экране следующее:

Поздравляем! Ваша программа работает!

Если у вас возникнут проблемы с инструкциями на этом шаге, обратитесь к разделу Общие проблемы (и их решения).

Предыдущая страница: "Привет, мир!" для IDE NetBeans
Следующая страница: "Hello World!" для ОС Solaris, Linux и Mac OS X

На этой странице обсуждаются подробности чтения, записи, создания и открытия файлов. Существует широкий спектр методов файлового ввода-вывода на выбор. Чтобы лучше понять API, на следующей диаграмме методы файлового ввода-вывода упорядочены по сложности.

Способы файлового ввода-вывода расположены от менее сложных к более сложным

В крайнем левом углу диаграммы показаны служебные методы readAllBytes , readAllLines и методы записи, предназначенные для простых, распространенных случаев. Справа от них находятся методы, используемые для перебора потока или строк текста, такие как newBufferedReader, newBufferedWriter, затем newInputStream и newOutputStream. Эти методы совместимы с пакетом java.io. Справа от них находятся методы для работы с ByteChannels, SeekableByteChannels и ByteBuffers, такие как метод newByteChannel. Наконец, справа показаны методы, использующие FileChannel для расширенных приложений, которым требуется блокировка файлов или ввод-вывод с отображением памяти.

Примечание. Методы создания нового файла позволяют указать необязательный набор исходных атрибутов для файла. Например, в файловой системе, поддерживающей набор стандартов POSIX (такой как UNIX), вы можете указать владельца файла, владельца группы или права доступа к файлу во время создания файла. На странице «Управление метаданными» объясняются атрибуты файлов, а также способы доступа к ним и их установки.

Эта страница имеет следующие темы:

Параметр OpenOptions

Некоторые методы в этом разделе принимают необязательный параметр OpenOptions. Этот параметр является необязательным, и API сообщает вам, какое поведение по умолчанию для метода, если он не указан.

Поддерживаются следующие перечисления StandardOpenOptions:

  • ЗАПИСЬ — открывает файл для записи.
  • APPEND — добавляет новые данные в конец файла. Этот параметр используется с параметрами WRITE или CREATE.
  • TRUNCATE_EXISTING — усекает файл до нуля байтов. Этот параметр используется с параметром WRITE.
  • CREATE_NEW — создает новый файл и выдает исключение, если файл уже существует.
  • CREATE — открывает файл, если он существует, или создает новый файл, если он не существует.
  • DELETE_ON_CLOSE — удаляет файл при закрытии потока. Этот параметр полезен для временных файлов.
  • SPARSE — указывает на то, что вновь созданный файл будет разреженным. Этот расширенный параметр используется в некоторых файловых системах, таких как NTFS, где большие файлы с «пробелами» данных могут храниться более эффективно, так как эти пустые промежутки не занимают место на диске.
  • СИНХРОНИЗАЦИЯ – синхронизирует файл (содержимое и метаданные) с базовым устройством хранения.
  • DSYNC: синхронизирует содержимое файла с базовым устройством хранения.

Часто используемые методы для небольших файлов

Чтение всех байтов или строк из файла

Если у вас небольшой файл и вы хотите прочитать все его содержимое за один проход, вы можете использовать метод readAllBytes(Path) или readAllLines(Path, Charset). Эти методы берут на себя большую часть работы за вас, например открытие и закрытие потока, но не предназначены для обработки больших файлов. В следующем коде показано, как использовать метод readAllBytes:

Запись всех байтов или строк в файл

Для записи байтов или строк в файл можно использовать один из методов записи.

В следующем фрагменте кода показано, как использовать метод записи.

Буферизованные методы ввода/вывода для текстовых файлов

Пакет java.nio.file поддерживает канальный ввод-вывод, который перемещает данные в буферы, минуя некоторые уровни, которые могут стать узким местом для потокового ввода-вывода.

Чтение файла с использованием буферизованного потокового ввода-вывода

Метод newBufferedReader(Path, Charset) открывает файл для чтения, возвращая BufferedReader, который можно использовать для эффективного чтения текста из файла.

В следующем фрагменте кода показано, как использовать метод newBufferedReader для чтения из файла. Файл закодирован в "US-ASCII".

Запись файла с использованием буферизованного потокового ввода-вывода

Вы можете использовать метод newBufferedWriter(Path, Charset, OpenOption. ) для записи в файл с помощью BufferedWriter .

В следующем фрагменте кода показано, как с помощью этого метода создать файл, закодированный в "US-ASCII":

Методы для небуферизованных потоков и совместимость с API java.io

Чтение файла с помощью потокового ввода-вывода

Чтобы открыть файл для чтения, можно использовать метод newInputStream(Path, OpenOption. ). Этот метод возвращает небуферизованный входной поток для чтения байтов из файла.

Создание и запись файла с помощью потокового ввода-вывода

Вы можете создать файл, добавить в файл или записать в файл с помощью метода newOutputStream(Path, OpenOption. ). Этот метод открывает или создает файл для записи байтов и возвращает небуферизованный выходной поток.

Метод принимает необязательный параметр OpenOption. Если параметры открытия не указаны и файл не существует, создается новый файл. Если файл существует, он усекается. Этот параметр эквивалентен вызову метода с параметрами CREATE и TRUNCATE_EXISTING.

В следующем примере открывается файл журнала. Если файл не существует, он создается. Если файл существует, он открывается для добавления.

Методы для каналов и байтовых буферов

Чтение и запись файлов с помощью канала ввода/вывода

В то время как поток ввода-вывода считывает символ за раз, канальный ввод-вывод считывает буфер за раз. Интерфейс ByteChannel обеспечивает базовые функции чтения и записи. SeekableByteChannel — это ByteChannel, который может поддерживать позицию в канале и изменять эту позицию. SeekableByteChannel также поддерживает усечение файла, связанного с каналом, и запрос размера файла.

Возможность перемещаться в разные точки файла, а затем читать или записывать в это место, делает возможным произвольный доступ к файлу. Дополнительную информацию см. в разделе Файлы с произвольным доступом.

Существует два метода чтения и записи ввода-вывода канала.

Примечание. Методы newByteChannel возвращают экземпляр SeekableByteChannel . С файловой системой по умолчанию вы можете преобразовать этот байтовый канал с возможностью поиска в FileChannel, предоставляя доступ к более продвинутым функциям, таким как отображение области файла непосредственно в памяти для более быстрого доступа, блокировка области файла, чтобы другие процессы не могли получить к ней доступ, или чтение и запись байтов из абсолютной позиции без изменения текущей позиции канала.

Оба метода newByteChannel позволяют указать список опций OpenOption. Поддерживаются те же параметры открытия, что и в методах newOutputStream, в дополнение к еще одному параметру: READ требуется, поскольку SeekableByteChannel поддерживает как чтение, так и запись.

Указание READ открывает канал для чтения. Указание WRITE или APPEND открывает канал для записи. Если ни один из этих параметров не указан, то канал открывается для чтения.

Следующий фрагмент кода считывает файл и выводит его на стандартный вывод:

В следующем примере, написанном для UNIX и других файловых систем POSIX, создается файл журнала с определенным набором прав доступа к файлам. Этот код создает файл журнала или добавляет его к файлу журнала, если он уже существует. Файл журнала создается с разрешениями на чтение/запись для владельца и разрешениями только на чтение для группы.

Способы создания обычных и временных файлов

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

Вы можете создать пустой файл с начальным набором атрибутов, используя метод createFile(Path, FileAttribute). Например, если во время создания вы хотите, чтобы файл имел определенный набор прав доступа к файлу, используйте для этого метод createFile. Если вы не укажете никаких атрибутов, файл будет создан с атрибутами по умолчанию. Если файл уже существует, createFile выдает исключение.

В рамках одной атомарной операции метод createFile проверяет существование файла и создает этот файл с указанными атрибутами, что делает процесс более защищенным от вредоносного кода.

Следующий фрагмент кода создает файл с атрибутами по умолчанию:

Разрешения для файлов POSIX содержат пример использования createFile(Path, FileAttribute) для создания файла с предустановленными разрешениями.

Вы также можете создать новый файл с помощью методов newOutputStream, как описано в разделе Создание и запись файла с использованием потокового ввода-вывода. Если вы откроете новый выходной поток и сразу же его закроете, будет создан пустой файл.

Создание временных файлов

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

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

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