И 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