- Rukovodstvo
- статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
- Java: сохранить / записать строку в файл
- Введение Сохранение строки в файлы с помощью Java может быть выполнено несколькими способами. В этой статье мы покажем некоторые распространенные методы записи строки в файл. Вот список всех классов и методов, которые мы рассмотрим: * Files.writeString () * Files.write () * FileWriter * BufferedWriter * PrintWriter Files.writeString () Начиная с Java 11, класс Files содержит полезный служебный метод Files.writeString (). Есть два варианта этого метода. Самая простая форма требует Путь к файлу
- Вступление
- Files.writeString ()
- Files.write ()
- FileWriter
- BufferedWriter
- PrintWriter
- PrintWriter с append ()
- PrintWriter с print ()
- PrintWriter с записью ()
- Заключение
- Java Swing — пример JFileChooser
- 1. show * Dialog () — Открыть или сохранить файл
- 2. setFileSelectionMode (int) — Выбрать файлы или каталоги
- Работа с файловой системой
Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Java: сохранить / записать строку в файл
Введение Сохранение строки в файлы с помощью Java может быть выполнено несколькими способами. В этой статье мы покажем некоторые распространенные методы записи строки в файл. Вот список всех классов и методов, которые мы рассмотрим: * Files.writeString () * Files.write () * FileWriter * BufferedWriter * PrintWriter Files.writeString () Начиная с Java 11, класс Files содержит полезный служебный метод Files.writeString (). Есть два варианта этого метода. Самая простая форма требует Путь к файлу
Вступление
Сохранить строку в файлы можно несколькими способами с помощью Java. В этой статье мы покажем некоторые распространенные методы записи строки в файл.
Вот список всех классов и методов, которые мы рассмотрим:
Files.writeString ()
Начиная с Java 11, Files содержит полезный служебный метод Files.writeString() . Есть два варианта этого метода. Самая простая форма требует Path к файлу для записи и текстовое содержимое. Другой вариант также принимает необязательный CharSet :
Path path = Paths.get("output.txt"); String contents = "Hello"; try < Files.writeString(path, contents, StandardCharsets.UTF_8); >catch (IOException ex) < // Handle exception >
Здесь мало места для гибкости, но он отлично работает, если вам нужно быстро что-то записать в файл.
Files.write ()
String, как и другие объекты, можно преобразовать в byte[] . Метод Files.write() работает с байтами:
Path path = Paths.get("output.txt"); String someString = "Hello World"; byte[] bytes = someString.getBytes(); try < Files.write(path, bytes); >catch (IOException ex) < // Handle exception >
Нет необходимости закрывать какие-либо ресурсы, так как мы сами не открывали никаких ресурсов.
FileWriter
FileWriter — один из самых простых способов записать текстовое содержимое в файл. Мы создадим File и передадим его в FileWriter чтобы «связать» их.
Затем мы просто используем FileWriter для записи в него:
File output = new File("output.txt"); FileWriter writer = new FileWriter(output); writer.write("This text was written with a FileWriter"); writer.flush(); writer.close();
После использования писателя важно очистить и закрыть ресурсы. В качестве альтернативы вы можете сделать это с помощью синтаксиса try-with-resources
try(FileWriter writer = new FileWriter("output.txt")) < writer.write("This text was written with a FileWriter"); >catch(IOException e) < // Handle the exception >
BufferedWriter
BufferedWriter — это объект-оболочка, который используется вокруг объектов типа Writer . Если у нас есть существующий Writer такой как FileWriter , мы можем обернуть его внутри BuffereWriter .
BufferedWriter лучше всего использовать, когда для файла write() В этом случае эти многократные записи временно сохраняются во внутренний буфер и записываются в файл только при наличии достаточного содержимого. Это позволяет избежать необходимости хранить каждый новый фрагмент текста в файле и вместо этого предоставляет соответствующий буфер для временного хранения.
Использование BufferedWriter намного эффективнее, чем FileWriter для множественной записи, но это не помогает с одной записью.
Фактически, использование BufferedWriter для одной записи приведет к ненужным накладным расходам. Для таких простых случаев FileWriter — лучший вариант.
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
BufferedWriter и FileWriter расширяют Writer поэтому у них одинаковые методы:
try(BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) < writer.write("Written with BufferedWriter); >catch(IOException e) < // Handle the exception >
PrintWriter
PrintWriter позволяет нам форматировать текст перед его записью. Он содержит методы, к которым мы привыкли, такие как printf() , println() и т. Д. Давайте создадим PrintWriter :
File output = new File("output.txt"); PrintWriter writer = new PrintWriter(output);
Лучший способ работать с PrintWriter — использовать синтаксис try-with-resources
try(PrintWriter writer = new PrintWriter(new FileWriter("output.txt"))) < // Write using the PrintWriter instance >catch < // Handle Exception >
Когда у нас есть PrintWriter , давайте рассмотрим некоторые из предоставляемых им методов.
PrintWriter с append ()
PrintWriter , как и StringBuilder предоставляет метод append() который позволяет нам добавлять содержимое в конец существующего файла.
Давайте appent() некоторый текст в пустой writer :
writer.append("Welcome to my fruit store! From me, you can buy:\n"); writer.append("Apples"); writer.append("\n"); writer.append("Oranges"); writer.append("\n"); writer.append("Bananas");
Метод append() возвращает PrintWriter к которому он был вызван. Это позволяет append() и упорядочить их более аккуратно:
writer.append("Welcome to my fruit store! From me, you can buy:\n"); writer.append("Apples\n").append("Oranges\n").append("Bananas\n");
PrintWriter с print ()
PrintWriter содержит методы для форматированной печати. К ним относятся print() , printf() и println() :
writer.print("Welcome to my fruit store %f", 2.0); writer.printf("From me, you can buy %s and %s.", "apples", "oranges");
PrintWriter с записью ()
С помощью write() мы можем записывать в поток много различных типов текстового содержимого. Примеры включают массивы символов, строки и целые числа:
char[] hello = ; writer.write(hello); writer.write("Welcome to my fruit store\n"); writer.write("From me, you can buy apples and oranges");
Метод write() принимает только контент без параметров форматирования, поэтому он похож на print() , но не может форматировать строки.
Чтобы завершить каждый PrintWriter в добавлении, печати или записи, важно очистить и закрыть поток:
Метод flush() «сбрасывает» содержимое в файл, а close() навсегда закрывает поток.
Примечание. Если вы используете try-with-resources , он автоматически очистит и закроет поток.
Заключение
В этой статье мы показали несколько распространенных методов записи строк в файлы. Есть много вариантов, потому что есть много возможных вариантов использования.
Мы рассмотрели Files.writeString() , Files.write() , а также классы FileWriter , BufferedWriter и PrintWriter
Licensed under CC BY-NC-SA 4.0
Java Swing — пример JFileChooser
JFileChooser это быстрый и простой способ предложить пользователю выбрать файл или место сохранения файла. Ниже приведены несколько простых примеров использования этого класса.
JFileChooser имеет 6 конструкторов:
- JFileChooser() — пустой конструктор, который указывает на каталог пользователя по умолчанию
- JFileChooser(String) — использует заданный путь
- JFileChooser(File) — использует данный файл в качестве пути
- JFileChooser(FileSystemView) — использует данный FileSystemView
- JFileChooser(String, FileSystemView) — использует заданный путь и FileSystemView
- JFileChooser(File, FileSystemView) — использует данный текущий каталог и FileSystemView
Все разные способы вызова JFileChooser конструктор
// JFileChooser jfc; // String path = "C: Users Public"; // File file = new File ("C: Users Public"); // FileSystemView fsv = FileSystemView.getFileSystemView (); // jfc = new JFileChooser (); // jfc = new JFileChooser (path); // jfc = new JFileChooser (file); // jfc = new JFileChooser (fsv); // jfc = new JFileChooser (path, fsv); // jfc = new JFileChooser (file, fsv);
Личное предпочтение автора должно принимать во внимание FileSystemView , В приведенных ниже примерах мы используем FileSystemView.getFileSystemView() и указать его в домашний каталог через getHomeDirectory() , Этот процесс приводит к типу файла. Другими словами, мы используем конструктор JFileChooser(File) принимая во внимание FileSystemView ,
1. show * Dialog () — Открыть или сохранить файл
Пример использования JFileChooser чтобы получить абсолютный путь к файлу, который пользователь хочет открыть, или получить местоположение, где пользователь хочет сохранить файл:
package com.csharpcoderr.jfileChooser; import java.io.File; import javax.swing.JFileChooser; import javax.swing.filechooser.FileSystemView; public class FileChooser1 < public static void main(String[] args) < JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); int returnValue = jfc.showOpenDialog(null); // int returnValue = jfc.showSaveDialog (null); if (returnValue == JFileChooser.APPROVE_OPTION) < File selectedFile = jfc.getSelectedFile(); System.out.println(selectedFile.getAbsolutePath()); >> >
Обратите внимание, что два метода showOpenDialog() а также showSaveDialog() похожи, что делает разницу в том, как разработчик обрабатывает каждый из них. Для удобства чтения я бы не советовал смешивать два метода.
Когда пользователь переходит в каталог, выбирает файл и нажимает «Открыть».
C:UsersPublicPicturespollock.she-wolf.jpg
2. setFileSelectionMode (int) — Выбрать файлы или каталоги
С помощью этого метода мы можем ограничить выбор пользователем только каталогов ( JFileChooser.DIRECTORIES_ONLY ) или только файлы ( JFileChooser.FILES_ONLY ) или файлы и каталоги ( JFileChooser.FILES_AND_DIRECTORIES ). По умолчанию FILES_ONLY , Вот пример, который реализует JFileChooser.DIRECTORIES_ONLY :
package com.csharpcoderr.jfileChooser; import javax.swing.JFileChooser; import javax.swing.filechooser.FileSystemView; public class FileChooser2 < public static void main(String[] args) < JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); jfc.setDialogTitle("Choose a directory to save your file: "); jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int returnValue = jfc.showSaveDialog(null); if (returnValue == JFileChooser.APPROVE_OPTION) < if (jfc.getSelectedFile().isDirectory()) < System.out.println("You selected the directory: " + jfc.getSelectedFile()); >> > >
Работа с файловой системой
Работа с настройками уровня activity и приложения позволяет сохранить небольшие данные отдельных типов (string, int), но для работы с большими массивами данных, такими как графически файлы, файлы мультимедиа и т.д., нам придется обращаться к файловой системе.
ОС Android построена на основе Linux. Этот факт находит свое отражение в работе с файлами. Так, в путях к файлам в качестве разграничителя в Linux использует слеш «/», а не обратный слеш «\» (как в Windows). А все названия файлов и каталогов являются регистрозависимыми, то есть «data» это не то же самое, что и «Data».
Приложение Android сохраняет свои данные в каталоге /data/data// и, как правило, относительно этого каталога будет идти работа.
Для работы с файлами абстрактный класс android.content.Context определяет ряд методов:
- boolean deleteFile (String name) : удаляет определенный файл
- String[] fileList () : получает все файлы, которые содержатся в подкаталоге /files в каталоге приложения
- File getCacheDir() : получает ссылку на подкаталог cache в каталоге приложения
- File getDir(String dirName, int mode) : получает ссылку на подкаталог в каталоге приложения, если такого подкаталога нет, то он создается
- File getExternalCacheDir() : получает ссылку на папку /cache внешней файловой системы устройства
- File getExternalFilesDir(String type) : получает ссылку на каталог /files внешней файловой системы устройства
- File getFileStreamPath(String filename) : возвращает абсолютный путь к файлу в файловой системе
- FileInputStream openFileInput(String filename) : открывает файл для чтения
- FileOutputStream openFileOutput (String name, int mode) : открывает файл для записи
Все файлы, которые создаются и редактируются в приложении, как правило, хранятся в подкаталоге /files в каталоге приложения.
Для непосредственного чтения и записи файлов применяются также стандартные классы Java из пакета java.io.
Итак, применим функционал чтения-записи файлов в приложении. Пусть у нас будет следующая примитивная разметка layout:
Поле EditText предназначено для ввода текста, а TextView — для вывода ранее сохраненного текста. Для сохранения и восстановления текста добавлены две кнопки.
Теперь в коде Activity пропишем обработчики кнопок с сохранением и чтением файла:
package com.example.filesapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity < private final static String FILE_NAME = "content.txt"; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >// сохранение файла public void saveText(View view) < FileOutputStream fos = null; try < EditText textBox = findViewById(R.id.editor); String text = textBox.getText().toString(); fos = openFileOutput(FILE_NAME, MODE_PRIVATE); fos.write(text.getBytes()); Toast.makeText(this, "Файл сохранен", Toast.LENGTH_SHORT).show(); >catch(IOException ex) < Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); >finally < try< if(fos!=null) fos.close(); >catch(IOException ex) < Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); >> > // открытие файла public void openText(View view) < FileInputStream fin = null; TextView textView = findViewById(R.id.text); try < fin = openFileInput(FILE_NAME); byte[] bytes = new byte[fin.available()]; fin.read(bytes); String text = new String (bytes); textView.setText(text); >catch(IOException ex) < Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); >finally < try< if(fin!=null) fin.close(); >catch(IOException ex) < Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); >> > >
При нажатии на кнопку сохранения будет создаваться поток вывода FileOutputStream fos = openFileOutput(FILE_NAME, MODE_PRIVATE)
В данном случае введенный текст будет сохраняться в файл «content.txt». При этом будет использоваться режим MODE_PRIVATE
Система позволяет создавать файлы с двумя разными режимами:
- MODE_PRIVATE : файлы могут быть доступны только владельцу приложения (режим по умолчанию)
- MODE_APPEND : данные могут быть добавлены в конец файла
Поэтому в данном случае если файл «content.txt» уже существует, то он будет перезаписан. Если же нам надо было дописать файл, тогда надо было бы использовать режим MODE_APPEND:
FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);
Для чтения файла применяется поток ввода FileInputStream :
FileInputStream fin = openFileInput(FILE_NAME);
Подробнее про использование потоков ввода-вывода можно прочитать в руководстве по Java: https://metanit.com/java/tutorial/6.3.php
В итоге после нажатия кнопки сохранения весь текст будет сохранен в файле /data/data/название_пакета/files/content.txt
Где физически находится созданный файл? Чтобы увидеть его на подключенном устройстве перейдем в Android Stud в меню к пункту View -> Tool Windows -> Device File Explorer
После этого откроектся окно Device File Explorer для просмотра файловой системы устройства. И в папке data/data/[название_пакета_приложения]/files мы сможем найти сохраненный файл.