Проверьте, существует ли файл, соответствующий шаблону - PullRequest
1 голос
/ 14 ноября 2011

Как я могу проверить, существует ли файл на основе частичного имени файла в Java?

В моем случае файл должен создаваться один раз в день с именем вида DATE_TIMESTAMP.xml и с этого моментадолжен быть добавлен к.

Например: 2011-14-11_1734289.xml

Таким образом, если существует файл, имя которого начинается с 2011-14-11 (а сегодня - 2011-14-11), этот файл должен бытьдобавлено, в противном случае должен быть создан новый.

Может ли File.exist() быть передано регулярное выражение?Какие библиотеки предоставляют такую ​​функциональность?

Ответы [ 5 ]

3 голосов
/ 14 ноября 2011

Сначала убедитесь, что у вас есть объект File, указывающий на каталог, где может потребоваться создание этого файла. После этого вы можете вызвать listFiles (фильтр FilenameFilter) для него. Если он возвращает массив, который не имеет длины 0, это означает, что существует по крайней мере один файл с частичным совпадением имени. Вы можете дополнительно использовать это для обнаружения неправильных ситуаций (например, массив длиной больше 1 означает, что в этой части имени слишком много файлов).

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

В качестве альтернативы, вы можете использовать listFiles(FileFilter filter) с реализацией FileFilter вместо FilenameFilter, если могут быть каталоги с датами в их именах. Получение одного экземпляра File для проверки вместо File для каталога плюс имя файла может упростить эту задачу, используя метод isDirectory() из File.

0 голосов
/ 26 июня 2014

Есть несколько жизнеспособных способов решить, что вы хотите сделать, в зависимости от ваших точных требований.

  1. Использование Files.newDirectoryStream(Path, String)

    Утилиты Java 7 nio включают в себя метод, который позволяет фильтровать глобусы, что позволит вам сопоставлять частичные имена файлов точно так, как вы просили.Классы Files и Path немного концептуально отличаются от унаследованного класса File, но они гораздо более устойчивы и мощны.Если вы используете Java 7+, я бы рекомендовал использовать Path s в новом коде.Проверка существования выглядела бы примерно так:

    try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "2011-14-11*")) {
      Iterator<Path> streamIter = stream.iterator();
      if(streamIter.hasNext()) {
        System.out.println("File exists: "+streamIter.next());
        if(streamIter.hasNext()) {
          throw new IllegalStateException("Multiple filenames matched the glob!");
        }
      } else {
        System.out.println("File does not exist");
      }
    }
    

    Вышеприведенный шаблон все еще несколько подвержен ошибкам, и нам действительно нужно определить метод, который возвращает объект Path и скрывает поведение при поиске файла.,Обратите внимание:

    public Path getDatedFile(String date) {
      try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, date+"*")) {
        Iterator<Path> streamIter = stream.iterator();
        if(streamIter.hasNext()) {
          Path file = streamIter.next();
          if(streamIter.hasNext()) {
            throw new IllegalStateException("Multiple filenames matched the glob!");
          }
          return file;
        } else {
          Path file = dir.resolve(date+"_"+getTimestamp()+".xml");
          Files.createFile(file); // or write some sort of header here
          return file;
        }
      }
    }
    

    Использование этого метода означает, что весь ваш код может просто вызывать этот метод, и все вызывающие абоненты могут доверять существованию файла.Обратите внимание, что вы можете реализовать эквивалентный метод, используя File, если вы не используете Java 7.

  2. Избегайте этой схемы именования

    Действительно, хотя, у вас проблемы, потому что вы не знаете фактического имени файла, с которым он был создан (если он уже существует).Почему вам нужно использовать схему именования, которую вы не можете предсказать?Поскольку вам нужен ровно один файл в день, что не так с DATE.xml?Использование этой более сложной схемы именования открывает для вас все виды ошибок и дополнительной сложности, поскольку каждый фрагмент кода, работающий с файлом, теперь должен вручную проверять похожих имен файлов, а не просто если файлс известным именем существует.На первый взгляд кажется, что TIMESTAMP просто записывает, когда файл был создан - почему бы не поместить эти данные в сам файл?Например:

    2011-14-11.xml:
      <root created="1734289">
        ...
    
0 голосов
/ 14 ноября 2011

Использование filereader или bufferedreader сделает свое дело. Оба из них проверяли исключения, поэтому вам придется поместить их в блок try catch. В блоке catch вы можете создать файл, если перехвачены соответственно FileNotFoundException или IOException.

0 голосов
/ 14 ноября 2011

Вы можете использовать класс File и его методы:

  1. существует ()
  2. createNewFile ()

У него также есть другие методы, которые могут быть полезны.

Обновление

Возможно, вы захотите использовать метод listFiles().

Возвращает: Массив абстрактных путей, обозначающих файлы и каталоги в каталоге, обозначенном этим абстрактным путем. Массив будет пустым, если каталог пуст.

0 голосов
/ 14 ноября 2011

Если вы откроете имя файла, который хотите записать, Java создаст его, если он не существует, и добавит, если он существует (если только вы специально не отметите перезапись, в этом случае он будет перезаписан).* Таким образом, открытие простого FileWriter или FileOutputStream сделает свое дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...