Статьи

Управление файлами в Java с классом файлов Guava

И 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