Работа с файлами
Как прочитать данные из файла
[Как прочитать данные из файла]В этой статье мы узнаем, как прочитать содержимое файла в Java. Для этой цели мы рассотрим несколько способов чтения файла.
Во всех способах мы будем вычитывать файл names.txt, который должен находиться в корне проекта
1. Files.newBufferedReader (Java 8+)
Первый способ – используя BufferedReader из Java 8:
public class ReadFileBufferedReaderJava8 { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); try (BufferedReader reader = Files.newBufferedReader(Paths.get("names.txt"))) { String line; while ((line = reader.readLine()) != null) { sb.append(line).append(System.lineSeparator()); } } catch (IOException e) { e.printStackTrace(); } System.out.println(sb); } }
Как узнать размер директории
[Как узнать размер директории]Иногда требуется узнать размер директории на файловой системе. В Java это можно сделать несколькими способами — с помощью стандартного API и внешних библиотек.
Здесь мы рассмотрим различные способы узнать размер директории:
- Используя сторонню библиотеку Apache Commons IO (FileUtils.sizeOfDirectory)
- Используя стандартную библиотеку Java 8 (Files.walk)
- Используя стандартную библиотеку Java 7 (FileVisitor)
- Используя стандартную библиотеку Java 6
1. Размер директории с помощью Apache Commons IO
Это наиболее простой в использовании способ — достаточно воспользоваться одним методом из этой библиотеки. Но сначала её требуется подключить к проекту:
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.7</version> </dependency>После этого, воспользуемся методом sizeOfDirectory:
FileUtils.sizeOfDirectory(new File("/home/alex/java-lessons.ru"));В ответ вернётся размер директории в байтах:
2. Размер директории с помощью Files.walk (Java 8+)
Если вы не хотите подключать сторонние библиотеки, можно воспользоваться стандартным API. В Java 8 появился метод Files.walk, с помощью которого можно обойти все файлы в директории и подсчитать их размер:
Path path = Paths.get("/home/alex/java-lessons.ru"); long size = 0; try (Stream<Path> walk = Files.walk(path)) { size = walk .filter(Files::isRegularFile) .mapToLong(p -> { try { return Files.size(p); } catch (IOException e) { System.out.printf("Невозможно получить размер файла %s%n%s", p, e); return 0L; } }) .sum(); } catch (IOException e) { System.out.printf("Ошибка при подсчёте размера директории %s", e); } System.out.println(size);
Как прочитать файл ресурсов из war приложения
[Как прочитать файл ресурсов из war приложения]WAR (Web Archive) — это приложение JavaEE, упакованное в архив и готовое для разворачивания на сервере приложений. В этом файле находятся классы приложения, ресурсные файлы и служебные файлы. Как быть, если вам требуется прочитать файл ресурсов из этого приложения?
Какие файлы можно прочитать из WAR архива
Можно прочитать те файлы, которые в архиве расположены в директории WEB-INF/classes
Как прочитать файл ресурсов из архива WAR
Для того, чтобы прочитать контент ресурсного файла из war архива, сначала требуется получить InputStream этого файла:
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
Если вернувшийся объект не равен null, остаётся вычитать контент любым удобным способом. Например, таким:
StringBuilder sb = new StringBuilder(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { String line; while ((line = reader.readLine()) != null) { sb.append(line).append(System.lineSeparator()); } } catch (IOException e) { e.printStackTrace(); } System.out.println(sb.toString());Исходный код
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class ReadFileFromWarArchive { public static void main(String[] args) { System.out.println(resourceToString("git.properties")); } public static String resourceToString(String path) { if (path == null) { return null; } InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(path); if (in == null) { return null; } StringBuilder sb = new StringBuilder(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { String line; while ((line = reader.readLine()) != null) { sb.append(line).append(System.lineSeparator()); } } catch (IOException e) { e.printStackTrace(); } System.out.println(sb.toString()); return sb.toString(); } }
Как записать данные в файл
[Как записать данные в файл]В этой статье мы рассмотрим различные способы записи текстовой и бинарной информации в файл, используя стандартные API Java.
Запись текста в файл (Java 7 и выше)
Первый способ годится, если вы используете Java 7 и выше. Здесь используется класс Paths, который был добавлен в Java 7. Данный код перезапишет информацию в файле, если тот уже существует.
// запись в файл текстовой информации (файл перезаписывается) List<String> lines = Arrays.asList("Привет", "Мир"); Path file = Paths.get("output.txt"); Files.write(file, lines, StandardCharsets.UTF_8);Если же вам нужно добавить текст в конец файла, укажите дополнительную опцию StandardOpenOption.APPEND:
// запись в файл текстовой информации (информация добавляется в конец файла) List<String> lines2 = Arrays.asList("Привет", "Мир"); Path file2 = Paths.get("output.txt"); Files.write(file2, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);
Конвертирование File в Path и обратно
[Конвертирование File в Path и обратно]Тип Path появился в Java 7. Он представляет собой абстракцию пути в файловой системе. Иногда требуется преобразовать Path в File и обратно.
Конвертирование File в Path
Чтобы сконвертировать File в Path, достаточно воспользоваться методом File.toPath:
File file = new File("/home/alex/java-lessons.ru/test.txt"); Path path = file.toPath();Конвертирование Path в File
Чтобы сконвертировать Path в File, нужно воспользоваться методом Path.toFile:
Path path2 = Paths.get("/home/alex/java-lessons.ru/test.txt"); File file2 = path2.toFile();Исходный код
import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; public class FileToPath { public static void main(String[] args) { File file = new File("/home/alex/java-lessons.ru/test.txt"); Path path = file.toPath(); Path path2 = Paths.get("/home/alex/java-lessons.ru/test.txt"); File file2 = path2.toFile(); } }
Как удалить файл
[Как удалить файл]Удалить файл в Java можно несколькими способами: с помощью стандартного API и с помощью сторонних библиотек. В этой статье мы рассмотрим три способа:
- с помощью Files.delete
- с помощью Files.deleteIfExists
- с помощью FileUtils.deleteQuietly
Примечание 1: если вместо файла передан путь к директории, указанная директория будет удалена, если она пуста.
Примечание 2: если вместо файла указана символическая ссылка, она будет удалена, но файл не будет затронут.
Удаление файла с помощью Files.delete
Первый способ удалить файл – это воспользоваться стандартным методом Files.delete:
try { Files.delete(Paths.get("/home/alex/test")); } catch (IOException x) { System.err.println(x); }Стоит заметить, что метод Files.delete может генерировать исключения, поэтому его придётся завернуть в блок try-catch. Например, если указанный файл не найден, будет сгенерировано исключение NoSuchFileException .
Удаление файла с помощью Files.deleteIfExists
Следующий способ – использовать метод Files.deleteIfExists, который возвращает true или false в зависимости от того, получилось ли удалить указанный файл:
try { Files.deleteIfExists(Paths.get("/home/alex/test")); } catch (IOException e) { System.err.println(e); }Также метод Files.deleteIfExists отличается от Files.delete тем, что не выбрасывает исключение NoSuchFileException в случае, если файл не найден.
Удаление файла с помощью FileUtils.deleteQuietly
Следующий способ – использовать библиотеку Commons IO. Для этого нужно подключить библиотеку в проект:
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.7</version> </dependency>И воспользоваться методом FileUtils.deleteQuietly:
FileUtils.deleteQuietly(new File("/home/alex/test"));Этот метод не генерирует исключений в случае, если файл не найден или произошла другая ошибка при попытке удалить указанный файл.
Исходный код
import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.nio.file.*; public class RemoveFile { public static void main(String[] args) { try { Files.delete(Paths.get("/home/alex/test")); } catch (IOException x) { System.err.println(x); } try { Files.deleteIfExists(Paths.get("/home/alex/test")); } catch (IOException e) { System.err.println(e); } FileUtils.deleteQuietly(new File("/home/alex/test")); } }