как узнать размер файла java

как узнать размер файла и каталога в Java без создания объекта?

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

Есть ли способ узнать размер файла без создания объекта?

Я использую для файлов File file1 = new file (fileName); длинный размер = file1.length ();

А для каталога File dir1 = new file (dirPath); длинный размер = fileUtils.sizeOfDirectiry (dir1);

У меня есть один параметр, который позволяет вычислять размер. Если параметр false, то все идет гладко. Если false, программа тормозит или зависает. Я рассчитываю размер 4 каталогов и 2 файлов базы данных.

6 ответов

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

Я думаю, что вам нужно прочитать метаданные файла. Прочтите это руководство для получения дополнительной информации. Это может быть решение, которое вы ищете: http://download.oracle.com/javase/tutorial/essential/io /fileAttr.html

У нас была аналогичная проблема производительности с File.listFiles () в каталогах с большим количеством файлов.

Наша установка представляла собой одну папку с 10 подпапками по 10 000 файлов в каждой. Папка находилась в общей сетевой папке, а не на машине, на которой выполнялся тест.

Мы использовали FileFilter, чтобы принимать только файлы с известными расширениями или каталогом, чтобы мы могли обратиться к каталогам.

Профилирование показало, что около 70% времени было потрачено на вызов File.isDirectory (который, как я предполагаю, вызывает Apache). Было два вызова isDirectory для каждого файла (один в фильтре и один на этапе обработки файла).

File.isDirectory был медленным, потому что ему приходилось попадать в общий сетевой ресурс для каждого файла.

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

Мое решение заключалось в том, чтобы реализовать версию listFiles в собственном коде, которая возвращала бы структуру данных, содержащую все метаданные о файле, а не только имя файла, как это делает File.

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

Если вы хотите получить размер всех файлов в каталоге, ОС должна прочитать каталог, а затем найти каждый файл, чтобы узнать его размер. Каждый доступ занимает около 10 мс (потому что это типичное время поиска для жесткого диска). Таким образом, если у вас есть 100 000 файлов, вам потребуется около 17 минут, чтобы получить все их размеры.

Кстати: размер каждого файла не имеет значения, потому что он фактически не читает файл. Только запись файла, имеющая размер.

РЕДАКТИРОВАТЬ: Например, если я попытаюсь получить размеры большого каталога. Сначала это происходит медленно, но после кэширования данных становится намного быстрее.

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

Время FileUtils.sizeOfDirectory («/ usr») занимает менее 8,7 секунд. Это относительно медленно по сравнению со временем, которое требуется du, но он обрабатывает около 30К файлов в секунду.

Файловые объекты очень легкие. Либо с вашим кодом что-то не так, либо проблема не в файловых объектах, а в доступе HD, необходимом для получения размера файла. Если вы сделаете это для большого количества файлов (скажем, десятков тысяч), то жесткий диск будет выполнять множество поисков, что в значительной степени является самой медленной операцией, возможной на современном ПК (на несколько порядки величины).

Источник

Как получить размер объекта в Java

Краткое и практическое руководство по получению размера объекта в Java.

1. Обзор

В отличие от C/C++, где мы можем использовать метод sizeof () для получения размера объекта в байтах, в Java нет истинного эквивалента такого метода.

В этой статье мы продемонстрируем, как мы все еще можем получить размер конкретного объекта.

2. Потребление памяти в Java

2.1. Объекты, ссылки и классы-оболочки

Ссылки имеют типичный размер 4 байта на 32-разрядных платформах и на 64-разрядных платформах с границей кучи менее 32 ГБ ( -Xmx32G ) и 8 байт для этой границы выше 32 ГБ.

Это означает, что 64-разрядной JVM обычно требуется на 30-50% больше места в куче.

3. Оценка Размера Объекта С Помощью Контрольно-Измерительных Приборов

Как мы могли видеть в документации Javadoc, метод обеспечивает “аппроксимацию для конкретной реализации” размера указанного объекта. Примечательно, что существует потенциальное включение накладных расходов в размер, и значения могут отличаться во время одного вызова JVM.

3.1. Создание Агента Инструментирования

Давайте теперь создадим класс Агент инструментирования :

Прежде чем мы создадим JAR для этого агента, нам нужно убедиться, что в него включен простой метафайл MANIFEST.MF :

Теперь мы можем создать банку агента с включенным файлом MANIFEST.MF. Один из способов-через командную строку:

3.2. Пример Класса

Давайте посмотрим на это в действии, создав класс с образцами объектов, которые будут использовать наш класс агента:

Чтобы это сработало, нам нужно включить опцию – javaagent с путем к JAR агента при запуске нашего приложения :

Результаты запуска нашего класса покажут нам предполагаемые размеры объектов:

4. Заключение

В этой статье мы описали, как память используется определенными типами в Java, как JVM хранит данные и подчеркивали вещи, которые могут повлиять на общее потребление памяти. Затем мы продемонстрировали, как мы можем на практике получить расчетный размер объектов Java.

Источник

java получить размер файла эффективно

в то время как googling, я вижу, что с помощью java.io.File#length() может быть медленным. FileChannel есть size() метод, который также доступен.

есть ли эффективный способ в java получить размер файла?

9 ответов

Ну, я попытался измерить его с помощью кода ниже:

для runs = 1 и итераций = 1 метод URL-адреса является самым быстрым в большинстве случаев с последующим каналом. Я запускаю это с некоторой паузой около 10 раз. Таким образом, в течение одного времени доступ, используя URL-адрес, это самый быстрый способ, который я могу придумать:

для прогонов = 5 и итераций = 50 рисунок рисуется по-разному.

файл должен кэшировать вызовы файловой системы, в то время как каналы и URL имеют некоторые накладные расходы.

бенчмарк, заданный GHad, измеряет множество других вещей (таких как отражение, создание экземпляров объектов и т. д. кроме того, чтобы получить длину. Если мы попытаемся избавиться от этих вещей, то за один звонок я получаю следующее время в микросекундах:

для 100 запусков и 10000 итераций я:

я запустил следующий измененный код, дающий в качестве аргумента имя файла 100MB.

все тестовые случаи в этом сообщении имеют недостатки, поскольку они обращаются к одному и тому же файлу для каждого проверенного метода. Так что кэширование диска пинков на тесты 2 и 3 воспользоваться. Чтобы доказать свою точку зрения, я взял тестовый пример, предоставленный GHAD, и изменил порядок перечисления, и ниже приведены результаты.

Читайте также:  как узнать свое корейское имя по настоящему

глядя на результат, я думаю, что файл.length() действительно победитель.

порядок тестирования-это порядок вывода. Вы даже можете видеть, что время, затраченное на мою машину, варьировалось между казнями, но Файл.Length () когда не первый, и при первом доступе к диску выиграл.

когда я изменяю ваш код для использования файла, доступ к которому осуществляется по абсолютному пути вместо ресурса, я получаю другой результат (для 1 запуска, 1 итерации и файла 100,000 байт-раз для файла 10 байт идентичны 100,000 байт)

сумма длины: 33, за итерацию: 33.0

сумма каналов: 3626, за итерацию: 3626.0

сумма URL: 294, за итерацию: 294.0

в ответ на бенчмарк rgrig, время, необходимое для открытия / закрытия экземпляров FileChannel & RandomAccessFile также необходимо учитывать, так как эти классы откроют поток для чтения файла.

после изменения бенчмарка я получил эти результаты для 1 итерации в файле 85MB:

для 10000 итераций в одном файле:

Я столкнулся с этой же проблемой. Мне нужно было получить размер файла и дату изменения 90,000 файлов в сетевом ресурсе. Используя Java и будучи максимально минималистичным, это займет очень много времени. (Мне нужно было получить URL-адрес из файла, а также путь к объекту. Так что он несколько разнился, но больше часа.) Затем я использовал собственный исполняемый файл Win32 и выполнил ту же задачу, просто сбросив путь к файлу, измененный и размер в консоль, и выполнил это из Java. Скорость было потрясающе. Собственный процесс и моя обработка строк для чтения данных могут обрабатывать более 1000 элементов в секунду.

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

проблема также казалась специфичной для Windows. OS X не имел та же проблема и может получить доступ к информации сетевого файла так же быстро, как ОС может это сделать.

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

на самом деле, я думаю, что «LS» может быть быстрее. Есть определенно некоторые проблемы в Java, связанные с получением информации о файле. К сожалению, нет эквивалентного безопасного метода рекурсивных ls для Windows. (УМК.exe DIR / S может запутаться и генерировать ошибки в бесконечных циклах)

на XP, доступ к серверу в локальной сети, мне требуется 5 секунд в Windows, чтобы получить количество файлов в папке (33,000) и общий размер.

когда я повторяю рекурсивно через это на Java это занимает у меня более 5 минут. Я начал измерять время, необходимое для создания файла.length (), file.lastModified () и файл.toURI() и я обнаружил, что 99% моего времени занимают эти 3 звонка. 3 звонка, которые мне действительно нужно сделать.

разница для 1000 файлов составляет 15 мс локально против 1800 МС на сервере. Сканирование пути сервера в Java смехотворно медленно. Если родная ОС может быть быстрой при сканировании той же папки, почему Java не может?

как более полный тест, я использовал WineMerge на XP для сравнения измененной даты и размера файлов на сервере против файлов локально. Это повторялось по всему дереву каталогов из 33 000 файлов в каждой папке. Общее время, 7 секунд. java: более 5 минут.

таким образом, исходное утверждение и вопрос из OP истинны и действительны. Это менее заметно при работе с локальной файловой системой. Выполнение локального сравнения папки с 33 000 элементов занимает 3 секунды в WinMerge и занимает 32 секунд локально в Java. Опять же, java против native-это замедление 10x в этих рудиментарных тестах.

Java 1.6.0_22 (последний), Gigabit LAN и сетевые подключения, ping меньше 1 мс (оба в одном коммутаторе)

из эталона GHad, есть несколько вопросов, которые люди упомянули:

1>Как BalusC отметил: поток.в этом случае available() течет.

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

Итак, 1st, чтобы удалить URL-адрес этого подхода.

Теперь начать тест:

когда Первый канал работает в одиночку:

когда длина один бег в одиночку:

таким образом, похоже, что длина один победитель здесь:

Источник

Как узнать размер файла java

— Привет, Амиго. Давно не виделись.

— Привет, Билаабо. О чем будешь рассказывать?

Сегодня я расскажу о работе с файлами. В Java есть специальный класс (File), с помощью которого можно управлять файлами на диске компьютера. Для того чтобы управлять содержимым файлов, есть другие классы: FileInputStream, FileOutputStream,…

— Интересно. А когда ты говоришь «управлять файлами», что ты имеешь в виду?

— Как раз сейчас и расскажу. Файлы можно создавать, удалять, переименовывать и еще много чего. В практически все классы, которые работают (читают, пишут, изменяют) с содержимым файла, можно передавать объект класса File. Пример:

Можно сразу передавать имя файла в FileInputStream
FileInputStream input = new FileInputStream( «c:/path/a.txt» );
А можно отдельно создать объект-файл, а потом передать его в FileInputStream
File file = new File( «c:/path/a.txt» );
FileInputStream input = new FileInputStream( file );

— Но во втором случае длиннее же получается. Так и не понял – зачем эти файлы нужны.

— Для этого конкретного случая – да. Это не пример, как надо делать, а скорее – как можно.

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

listFiles() – это метод, который возвращает список файлов в папке с именем «c:/path/»?

— Да. Хотя программисты обычно говорят «директория» или «каталог». Название «папка» стало употребляться совсем недавно, но, в принципе, они все верные, и ты можешь говорить, как тебе удобнее.

— Ок. А getName() что делает? Выдает имя файла? И какое именно имя? Полное вместе с путем или только имя самого файла?

— Только имя самого файла. Для полного есть file.getAbsolutePath()

— А какие еще методы есть у класса File?

— Ничего себе! А не маленький такой список получился. Да и вроде, можно довольно много сделать с помощью него: создавать, удалять файлы, переименовывать,…

А чтобы получить директорию текущего файла, надо вызвать getParent()?

— Ага, но он вернет не объект-файл, а строку – путь к файлу. Фактически у класса File почти все методы дублированы: одна версия возвращает String, вторая File. Вот смотри:

File file = new File( «c:/path/a.txt» );
String directory = file.getParent();
File file = new File( «c:/path/a.txt» );
File directory = file.getParentFile();
Читайте также:  как определить что девушка тебе не подходит

Если у тебя есть строка с путем к файлу, а надо объект File, то воспользуйся конструктором. Если же наоборот – есть объект File, а нужна строка – используй getAbsolutePath(). Пример:

— Отлично. Тогда вот тебе маленькое задание – выведи имена всех файлов, которые есть в той же директории, что и текущий файл.

— Нет ничего проще, вот, смотри:

Код
//какой-то текущий файл
File originalFile = new File(«c:/path/dir2/a.txt»);

— А, то! Немного путает, что и для файла и для директории используется один и тот же класс – File. Как то это не очень логично, мне кажется.

— Так исторически сложилось. Раньше директория была специальным «пустым» файлом на диске. Сейчас уже, конечно, многое изменилось, но не везде. У меня на сегодня все.

— Спасибо, за отличную лекцию, Билаабо.

2. Задачи на File

— Привет, Амиго! Я придумал тебе пару интересных задач.

Решать их можно только в Intellij IDEA. Вот, смотри, какие интересные условия…

Задачи
1. Проход по дереву файлов

3. Files, Path

— Привет, Амиго! Как жизнь?

— Отлично. Только что Билаабо рассказывал кучу интересного про File, и как с ним работать.

— Думаю, у меня как раз есть, что добавить по этой теме.

— Да? Тогда с удовольствием послушаю.

— Тогда слушай. Java постоянно развивается, постоянно ищутся новые способы делать различные вещи эффективнее. В Java 7 была добавлена альтернатива классу File.

— Ну, раз с точки зрения ООП, то – ок. А что поменялось-то?

В третьих, удобнее стало работать с относительными путями.

Вот список методов:

Методы класса Path Описание
boolean isAbsolute() Возвращает true, если путь – абсолютный.
Path getRoot() Возвращает корень текущего пути – директорию самого верхнего уровня.
Path getFileName() Возвращает имя файла из текущего пути.
Path getParent() Возвращает директорию из текущего пути.
boolean startsWith(Path other) Проверяет, что текущий путь начинается с переданного пути.
boolean endsWith(Path other) Проверяет, что текущий путь заканчивается на переданный путь.
Path normalize() Нормализует текущий путь. Например, приводит путь «c:/dir/dir2/../a.txt» к пути «c:/dir/a.txt»
Path relativize(Path other) Вычисляет относительный путь двух путей – «разницу путей»
Path resolve(String other) Восстанавливает абсолютный путь по текущему и относительному.
URI toUri() Возвращает URI текущего пути/файла.
Path toAbsolutePath() Приводит путь к абсолютному, если был относительный.
File toFile() Возвращает объект File, который соответствует текущему объекту Path.

— А текущий путь – это что?

— Это тот путь, который был передан в конструктор объекта Path, методы которого вызываются. Path – это «путь» по-английски.

— Ну и куда же ты так спешишь-то? Сейчас все расскажу. Вот основные методы:

— Как интересно, столько крутых функций, и все в одном месте.

А зачем нужны временные файлы?

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

— А сложно скачать файл из интернета?

— Очень просто. Смотри пример:

— Да, а что ты ожидал тут увидеть? Тут всего 4 строчки.

Строка номер 2. Создается объект URL, куда передается ссылка в интернете на файл с картинкой.

Строка номер 5. С помощью метода createTempFile создается временный файл.

— Отлично, рад, что тебе понравилось. Думаю, с остальными методами ты разберёшься сам. А я попрошу Диего дать тебе несколько задачек на них.

Вот тебе, кстати, хорошая ссылка на этот материал:

4. Задачи на Files, Path

— Привет, Амиго! Я придумал тебе пару интересных задач.

Решать их можно только в Intellij IDEA. Вот, смотри, какие интересные условия…

Задачи
1. Своя реализация

ГЛАВНОЕ УСЛОВИЕ:
Никаких других импортов!

2. Поиск скрытых файлов

В классе Solution переопределите логику двух методов:
— visitFile кроме своей логики должен добавлять в archived все пути к zip и rar файлам
— visitFileFailed должен добавлять в failed все пути к недоступным файлам и возвращать SKIP_SUBTREE

Пример вывода:
D:/mydir/BCD.zip

Метод main не участвует в тестировании.

5. FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream

— Сегодня мы будем изучать потоки ввода-вывода.

— Да, я уже там все знаю. Это делается с помощью классов FileInputStream и FileOutputStream.

— Да, а какие методы есть у этих классов, знаешь?

— Конечно, вот методы FileInputStream:

Метод Описание
int read() Читает один байт и возвращает его.
int read(byte b[]) Читает массив байт, возвращает количество.
int read(byte b[], int off, int len) Читает из потока массив байт.
long skip(long n) Пропускает n байт, используется при чтении из потока.
int available() Возвращает количество байт, которое еще можно прочитать из потока.
void close() Закрывает поток.

— Все верно! А методы FileOutputStream?

Метод Описание
void write(int b) Записывает один байт в поток.
void write(byte b[]) Записывает массив байт в поток.
void write(byte b[], int off, int len) Записывает массив байт в поток.
void close() Закрывает поток.

— Амиго, ты меня удивляешь!

— Отлично, тогда дам тебе два новых класса ZipInputStream и ZipOutputStream.

— Именно. Эти потоки предназначены для работы с файлами, которые являются zip-архивами. С помощью них можно что-то читать прямо из zip-фала или писать в него!

— Ух ты! Как интересно. Но ведь в zip-архиве может быть не один файл, как же они работают?

— А для этого есть еще один специальный класс – ZipEntry. Он представляет файл, хрянящийся в архиве. Из ZipInputStream можно читать только объекты типа ZipEntry, а в ZipOutputStream можно писать только объекты ZipEntry. А вот сами ZipEntry как раз можно читать и писать как обычные файлы.

— А можно пример, как это работает?

— Конечно, вот пример, где мы создаем архив и кладем в него файл:

Код
// создаем архив
FileOutputStream zipFile = new FileOutputStream( «c:/archive.zip» );
ZipOutputStream zip = new ZipOutputStream( zipFile );

— Как интересно. А разархивировать файлы так же легко?

— Ага. Вот тебе краткое описание методов классов ZipEntry, ZipInputStream и ZipOutputStream

ZipInputStream – это поток, поэтому все ZipEntry могут быть прочитаны только последовательно. Вот его методы:

Метод Описание
ZipEntry getNextEntry() Возвращает объект, описывающий следующий ZipEntry (пропускает все байты текущего entry).
void closeEntry() Закрывает чтение текущего ZipEntry (пропускает все байты текущего entry).
int available() Возвращает 1, если есть доступные ZipEntry, иначе 0.
int read(byte[] b, int off, int len) Читает байты из текущего ZipEntry.
long skip(long n) Пропускает n байт при чтении из потока.
void close() Закрывает поток.

— Вроде понятно, хотя не уверен, что правильно.

— ZipOutputStrem и его методы:

Метод Описание
void setComment(String comment) Устанавливает комментарий к архиву.
void setMethod(int method) Указывает метод (тип) сжатия.
void setLevel(int level) Указывает степень сжатия. Чем сильнее, тем медленнее.
void putNextEntry(ZipEntry e) Добавляет новый ZipEntry.
void closeEntry() Закрывает текущий ZipEntry.
void write(byte[] b, int off, int len) Пишет набор байт в текущий ZipEntry.
void close() Закрывает поток.

— А мы же в примере выше почти ничего этого не использовали.

— Это необязательные методы. Можно не указывать степень и метод сжатия, тогда будут использованы настройки по умолчанию.

— Гм. Тоже не плохо. А ZipEntry?

— Ага. В ZipEntry дополнительно хранится только служебная информация:

Метод Описание
String getName(), setName(String) Внутреннее имя файла.
long getTime(), setTime(long) Время последней модификации entry.
long getCRC(), setCRC(long) Контрольная сумма.
long getSize(), setSize(long) Размер до компрессии.
int getMethod(), setMethod(int) Метод сжатия.
long get/setCompressedSize() Размер после архивации.
boolean isDirectory() Является ли entry директорией.

— Выглядит не сложно и интересно, что не может не радовать!

— Отлично, тогда Диего даст тебе задачи и на эту тему.

— Язык мой – враг мой.

6. Задачи

— Привет, Амиго! Я придумал тебе пару интересных задач.

Решать их можно только в Intellij IDEA. Вот, смотри, какие интересные условия…

Задачи
1. Добавление файла в архив

Пример входных данных:
C:/result.mp3
C:/pathToTest/test.zip

Файлы внутри test.zip:
a.txt
b.txt

После запуска Solution.main архив test.zip должениметь такое содержимое:
new/result.mp3
a.txt
b.txt

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

2. Разархивируем файл

Пример входных данных. Внутри архива находится один файл с именем abc.mp3:
C:/result.mp3
C:/pathToTest/test.zip.003
C:/pathToTest/test.zip.001
C:/pathToTest/test.zip.004
C:/pathToTest/test.zip.002

7. Reader, Writer

— Привет, Амиго, еще раз.

— И тебе привет, Риша. О чем будет сегодняшняя лекция?

— Сегодня я тебе расскажу про Reader и Writer.

— Но, Риша, я же уже почти все о них знаю!

— Повторение мать учения.

Reader и Writer – это аналоги InputStream и OutputStream, но в отличие от них, они работают не с байтами, а с символами. Иногда их еще называют символьными потоками, в противовес InputStream и OutputStream – байтовым потокам.

— Один символ – два байта, я помню.

— Дело не только в этом. Эти классы специально ориентированы для работы с текстом и строками. Сегодня мы рассмотрим две классические реализации этих абстрактных классов – классы FileReader и FileWriter.

Вот методы класса FileReader:

Метод Описание
int read() Читает один символ из потока и возвращает его.
int read(char cbuf[], int offset, int length) Читает массив символов, возвращает количество прочитанных символов.
boolean ready() Возвращает true, если из потока еще можно читать.
void close() Закрывает поток для чтения.
int read(java.nio.CharBuffer target) Читает набор символов в буфер.
int read(char cbuf[]) Читает массив символов.
long skip(long n) Пропускает n символов в потоке.
String getEncoding() Возвращает текущую кодировку потока.

— Ну, я почти все это знаю. А FileWriter?

Метод Описание
void write(int c) Пишет один символ в поток.
void write(char cbuf[], int off, int len) Пишет массив символов в поток.
void write(char cbuf[]) Пишет массив символов в поток.
void write(String str, int off, int len) Пишет часть строки в поток.
void write(String str) Пишет строку в поток.
void flush() Записывает на диск, все для оптимизации хранится в памяти.
void close() Закрывает поток.
String getEncoding() Возвращает текущую кодировку потока.

— Да, но это же отлично. Тогда давай разберем один интересный пример, а Диего потом даст тебе еще задач.

Как прочитать файл построчно? Сможешь написать код?

Код
//создаем список для хранения строк
List list = new ArrayList ();

// открываем файл
File file = new File( «c:/document.txt» );
BufferedReader reader = new BufferedReader(new FileReader ( file ));

//закрываем файл
reader.close();

— Неплохо? Да тут все просто и красиво. Признайся, Риша, что я уже отлично владею потоками ввода-вывода. Ну что тут можно улучшить-то?

— Ну, например, можно сделать так:

Код Ришы
File file = new File( «c:/document.txt» );

— Гм. Действительно короче. И ведь только сегодня вы мне рассказывали про все эти методы. Буду отрабатывать. Спасибо за урок, Риша.

8. Задачи

— Привет, Амиго! Я придумал тебе пару интересных задач.

Решать их можно только в Intellij IDEA. Вот, смотри, какие интересные условия…

Задачи
1. Null Object Pattern

9. Properties

— Сегодня мы изучаем еще одну новую и интересную тему – свойства (properties).

В Java принято делать программы гибкими и легко настраиваемыми. Иногда еще говорят легко конфигурируемыми (от конфигурация).

Например, твоя программа раз в час копирует файлы из некоторой директории, архивирует их и отсылает тебе на email. Для этого программе надо знать директорию, откуда брать файлы и email, куда их посылать. Такие данные принято хранить не в коде программы, а в отдельных файлах свойств – properties-файлах.

Данные в таком файле хранятся в виде пар ключ-значение, разделенные знаком равно.

Пример
Файл data.properties
directory = c:/text/downloads
email = zapp@javarush.ru

Слева от знака равно – имя (ключ), справа – значение.

— Т.е. это что-то типа текстового представления HashMap?

Метод Описание
void load(Reader reader) Загружает свойства из файла, представленного объектом Reader
void load(InputStream inStream) Загружает свойства из файла, представленного объектом InputStream
void loadFromXML(InputStream in) Загружает свойства из XML-файла
Object get(Object key) Возвращает значение по ключу. Метод унаследован от HashTable
String getProperty(String key) Возвращает значение свойства (строку) по ключу.
String getProperty(String key, String defaultValue) Возвращает значение свойства по ключу или defaultValue, если такого ключа нет.
Set stringPropertyNames() Возвращает список всех ключей

Т.е. фактически тебе нужно выполнить всего две операции – загрузить в объект Properties данные из какого-нибудь файла, а затем получить эти свойства с помощью метода getProperty(). Ну и не забывай, что можешь пользоваться объектом Properties как HashMap.

Код
//файл, который хранит свойства нашего проекта
File file = new File( «c:/data.properties» );

— Ага. Т.е. мы создаем объект Properties, затем передаем в него файл. В метод load, а затем просто вызываем getProperty. Так?

— А ты еще говорил, что им можно пользоваться как HashMap? Что ты имел в виду?

— Класс Properties унаследован от Hashtable, а это – тот же HashMap, просто все методы его синхронизированы. Вот так можно просто вывести на экран все значения из файла свойств:

Код
//получаем файл со свойствами
File file = new File( «c:/data.properties» );

— Ага. Вроде все стало на свои места. Спасибо, Риша, буду пользоваться такой крутой штукой.

10. Задачи

— Привет, Амиго! Вот, держи интересную задачу, решать ее можно только в Intellij IDEA.

Задачи
1. Читаем конфиги

Источник

Читайте также:  как узнать рейс самолета
Советы мастера