И Groovy, и Java SE 7 предоставляют улучшения для управления файлами в Java, как я обсуждал в постах здесь , здесь , здесь и здесь . Однако, когда конкретное приложение Java не может пока использовать Java SE 7 или Groovy для его управления файлами, улучшенный опыт управления файлами все еще может быть получен с помощью Guava «s файлов класса.
Обработка файлов всегда была немного сложнее в Java, чем во многих других языках программирования. Java SE 7, безусловно, значительно улучшает возможности обработки файлов Java с помощью NIO.2 , но не каждый проект может использовать Java SE 7. Для тех проектов, которые не могут использовать Java SE 7, класс Files в Guava является хорошим промежуточным решением для упрощения обработки файлов. , Здесь важно отметить, что Java SE 7 представляет собственный класс Files , поэтому любое использование класса Files Guava в Java SE 7 должно быть полностью ограничено, если Java-версия Files используется в том же коде. Мои примеры были написаны и построены на Java SE 7, но я избегаю использовать класс Files Java SE 7 и поэтому не должен полностью охватывать класс с одноименным названием Guava.
Создание файла
Класс Files в Guava включает несколько перегруженных методов записи для простой записи содержимого в файл. Следующий пример кода демонстрирует использование Files.write (byte [], File) .
Демонстрация Files.write (byte [], File)
/**
* Demonstrate writing bytes to a specified file.
*
* @param fileName Name of file to be written to.
* @param contents Contents to be written to file.
*/
public void demoFileWrite(final String fileName, final String contents)
{
checkNotNull(fileName, "Provided file name for writing must NOT be null.");
checkNotNull(contents, "Unable to write null contents.");
final File newFile = new File(fileName);
try
{
Files.write(contents.getBytes(), newFile);
}
catch (IOException fileIoEx)
{
err.println( "ERROR trying to write to file '" + fileName + "' - "
+ fileIoEx.toString());
}
}
Есть несколько наблюдений, которые могут быть из этого первого примера кода, которые будут применяться ко всем другим образцам кода в этом посте. Во-первых, я использую статически импортированный класс Guava Preconditions, чтобы обеспечить простую проверку, гарантирующую, что предоставленные параметры не равны NULL. Вторая общая черта этого кода заключается в том, что он явно перехватывает и обрабатывает проверенное исключение IOException . Все остальные методы Файлов, продемонстрированные в этом посте, аналогичным образом выдают это же проверенное исключение.
Копирование файлов
Следующий пример демонстрирует, как легко копировать файлы с помощью метода Guava’s Files.copy (File, File) (один из нескольких перегруженных методов с именем «copy»).
Демонстрация Files.copy (Файл, Файл)
/**
* Demonstrate simple file copying in Guava. This demonstrates one of the
* numerous overloaded copy methods provided by Guava's Files class. The
* version demonstrated here copies one provided File instance to another
* provided File instance.
*
* @param sourceFileName Name of file that is to be copied.
* @param targetFileName Name of file that is result of file copying.
*/
public void demoSimpleFileCopy(
final String sourceFileName, final String targetFileName)
{
checkNotNull(sourceFileName, "Copy source file name must NOT be null.");
checkNotNull(targetFileName, "Copy target file name must NOT be null.");
final File sourceFile = new File(sourceFileName);
final File targetFile = new File(targetFileName);
try
{
Files.copy(sourceFile, targetFile);
}
catch (IOException fileIoEx)
{
err.println(
"ERROR trying to copy file '" + sourceFileName
+ "' to file '" + targetFileName + "' - " + fileIoEx.toString());
}
}
Перемещение файлов
Перемещение файлов с помощью Guava так же просто, как копирование. Метод Files.move (File, File) демонстрируется в следующем фрагменте кода.
Демонстрация файлов .move (файл, файл)
/**
* Demonstrate moving a file with Guava's Files.move(File,File).
*
* @param sourceFileName Path/name of File to be moved.
* @param targetFileName Path/name of Destination of file.
*/
public void demoMove(final String sourceFileName, final String targetFileName)
{
checkNotNull(sourceFileName, "Move source file name must NOT be null.");
checkNotNull(targetFileName, "Move destination name must NOT be null.");
final File sourceFile = new File(sourceFileName);
final File targetFile = new File(targetFileName);
try
{
Files.move(sourceFile, targetFile);
}
catch (IOException fileIoEx)
{
err.println(
"ERROR trying to move file '" + sourceFileName
+ "' to '" + targetFileName + "' - " + fileIoEx.toString());
}
}
Сравнение файлов
Определить, являются ли два файла одинаковыми, просто с помощью метода Gauva Files.equal (File, File) .
Демонстрация Files.equal (Файл, Файл)
/**
* Demonstrate using Guava's Files.equal(File,File) to compare contents of
* two files.
*
* @param fileName1 Name of first file to be compared.
* @param fileName2 Name of second file to be compared.
*/
public void demoEqual(final String fileName1, final String fileName2)
{
checkNotNull(fileName1, "First file name for comparison must NOT be null.");
checkNotNull(fileName2, "Second file name for comparison must NOT be null.");
final File file1 = new File(fileName1);
final File file2 = new File(fileName2);
try
{
out.println(
"File '" + fileName1 + "' "
+ (Files.equal(file1, file2) ? "IS" : "is NOT")
+ " the same as file '" + fileName2 + "'.");
}
catch (IOException fileIoEx)
{
err.println(
"ERROR trying to compare two files '"
+ fileName1 + "' and '" + fileName2 + "' - " + fileIoEx.toString());
}
}
Трогательные файлы
Прикосновение к файлу для создания нового пустого файла или обновления временной метки существующего файла может быть легко выполнено с помощью файла Guava’s Files.touch (Файл), как показано в следующем примере кода.
Демонстрация Files.touch (Файл)
/**
* Demonstrate Guava's Files.touch(File) method.
*
* @param fileNameToBeTouched Name of file to be 'touch'-ed.
*/
public void demoTouch(final String fileNameToBeTouched)
{
checkNotNull(fileNameToBeTouched, "Unable to 'touch' a null filename.");
final File fileToTouch = new File(fileNameToBeTouched);
try
{
Files.touch(fileToTouch);
}
catch (IOException fileIoEx)
{
err.println(
"ERROR trying to touch file '" + fileNameToBeTouched
+ "' - " + fileIoEx.toString());
}
}
Получение содержимого файла
С простотой, напоминающей расширение GDK Groovy File.getText () , Guava’s Files.toString (File, Charset) позволяет легко получать текстовое содержимое файла.
Демонстрация Files.toString (File, Charset)
/**
* Demonstrate retrieving text contents of a specified file with Guava's
* Files.toString(File) method.
*
* @param nameOfFileToGetTextFrom Name of file from which text is to be
* retrieved.
*/
public void demoToString(final String nameOfFileToGetTextFrom)
{
checkNotNull(nameOfFileToGetTextFrom, "Unable to retrieve text from null.");
final File sourceFile = new File(nameOfFileToGetTextFrom);
try
{
final String fileContents = Files.toString(sourceFile, Charset.defaultCharset());
out.println(
"Contents of File '" + nameOfFileToGetTextFrom
+ "' are: " + fileContents);
}
catch (IOException fileIoEx)
{
err.println(
"ERROR trying to get text contents of file '"
+ nameOfFileToGetTextFrom + "' - " + fileIoEx.toString());
}
}
Создание временного каталога
Guava упрощает создание временного каталога с помощью Files.createTempDir () .
Демонстрация Files.createTempDir ()
/**
* Demonstrate Guava's Files.createTempDir() method for creating a temporary
* directory.
*/
public void demoTemporaryDirectoryCreation()
{
final File newTempDir = Files.createTempDir();
try
{
out.println(
"New temporary directory is '" + newTempDir.getCanonicalPath() + "'.");
}
catch (IOException ioEx)
{
err.println("ERROR: Unable to create temporary directory - " + ioEx.toString());
}
}
Я не привожу здесь пример кода, но стоит отметить, что Guava предоставляет удобный метод для создания нового каталога, который будет содержать все необходимые новые родительские каталоги с его методом Files.createParentDirs (File) .
Получение содержимого файла в виде строк
Есть моменты, когда наиболее удобно получить содержимое файла в виде последовательности строк, чтобы каждая строка могла быть обработана. Обычно это делается в Groovy с перегруженными версиями readLines () и eachLine () . Guava обеспечивает аналогичную функциональность Groovy File.readLines () с его методом Files.readLines (File, Charset) . Это продемонстрировано в следующем примере кода.
Демонстрация Files.readLines (File, Charset)
/**
* Demonstrate extracting lines from file.
*
* @param fileName Name of file from which lines are desired.
*/
public void demoRetrievingLinesFromFile(final String fileName)
{
final File file = new File(fileName);
try
{
final List<string> lines = Files.readLines(file, Charset.defaultCharset());
for (final String line : lines)
{
out.println(">> " + line);
}
}
catch (IOException ioEx)
{
err.println(
"ERROR trying to retrieve lines from file '"
+ fileName + "' - " + ioEx.toString());
}
}
Другой перегруженный вариант из readLines интересен тем , что он позволяет LineProcessor обратного вызова необходимо указать для завершения возвращения строк раньше , чем конец файла.
Первая строка чтения файла
Я сталкивался с многочисленными ситуациями, в которых было полезно читать только первую строку файла. Эта первая строка может сообщить моему коду, какой тип сценария выполняется, предоставить информацию о прологе XML или другие интересные обзорные данные содержимого файла. Guava позволяет легко получить только первую строку с помощью метода Files.readFirstLine (File, Charset) . Это продемонстрировано в следующем листинге кода.
Демонстрация файлов .readFirstLine (File, Charset)
/**
* Demonstrate extracting first line of file.
*
* @param fileName File from which first line is to be extracted.
*/
public void demoRetrievingFirstLineFromFile(final String fileName)
{
final File file = new File(fileName);
try
{
final String line = Files.readFirstLine(file, Charset.defaultCharset());
out.println("First line of '" + fileName + "' is '" + line + "'.");
}
catch (IOException fileIoEx)
{
err.println(
"ERROR trying to retrieve first line of file '"
+ fileName + "' - " + fileIoEx.toString());
}
}
Там намного больше
Хотя в этом посте я обсудил и продемонстрировал несколько полезных методов Files , у класса есть еще много чего предложить. Некоторые из них включают возможность добавления к существующему файлу с помощью Files.append (CharSequence, File, Charset) , получение контрольной суммы файла с помощью Files.getChecksum (File, Checksum) , получение дайджеста файла с помощью Files.getDigest (File, MessageDigest) ) , доступ к BufferedReader с помощью Files.newReader (File, Charset) , доступ к BufferedWriter с помощью Files.newWriter (File, Charset) и доступ к MappedByteBuffer, сопоставленному с базовым файлом через перегруженные методы Files.map .
Вывод
Обработка файлов в Java намного проще и удобнее с классом файлов Guava . Guava обеспечивает удобство обработки файлов в приложениях Java, которые не могут использовать удобство работы с файлами в Groovy или Java SE 7.
От http://marxsoftware.blogspot.com/2011/11/file-management-in-java-with-guavas.html