Java - чтение нескольких файлов Excel в папке [дубликат]

В этом случае метод setTimeout() определенно не подходит. Нет гарантии, что экземпляр облачной функции все еще будет работать через 8 часов.

Google еще не предоставляет планировщик для облачных функций, и лучше всего было бы создать очередь расписания какого-либо типа , Когда объект создается, добавьте задачу в очередь, чтобы удалить ее через 8 часов. Периодически (каждую минуту, скажем) запускается задание cron с помощью службы cron, которая запускает облачную функцию HTTPS, которая считывает очередь, чтобы увидеть, есть ли какие-либо объекты, которые будут действовать.

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

134
задан james.garriss 6 January 2016 в 14:27
поделиться

8 ответов

Вы можете использовать File#isDirectory() , чтобы проверить, является ли данный файл (путь) каталогом. Если это true, вы снова вызываете тот же метод с его результатом File#listFiles() .

public static void main(String... args) {
    File[] files = new File("C:/").listFiles();
    showFiles(files);
}

public static void showFiles(File[] files) {
    for (File file : files) {
        if (file.isDirectory()) {
            System.out.println("Directory: " + file.getName());
            showFiles(file.listFiles()); // Calls same method again.
        } else {
            System.out.println("File: " + file.getName());
        }
    }
}

Обратите внимание, что это чувствительно к StackOverflowError .

], когда дерево глубже, чем может стека JVM. Вместо этого вы можете использовать итеративный подход или хвостовую рекурсию , но это другой предмет;)

176
ответ дан BalusC 22 August 2018 в 10:54
поделиться
  • 1
    спасибо Балусу, любая идея о том, насколько глубоко это может быть как общее предположение? – James 1 July 2010 в 03:56
  • 2
    Зависит от настроек вашей JVM-памяти. Но вообще-то вроде нескольких тысяч. Если вы считаете, что можете когда-либо работать в такой директории, то не используйте рекурсию. – Mike Baranczak 1 July 2010 в 05:06
  • 3
    Это восприимчиво к NullPointerException, когда файловая система изменяется между вызовом isDirectory и listFiles, как это может произойти, если System.out.println блокирует или вам просто просто не повезло. Проверка того, что выход listFiles не равен нулю, разрешит это условие гонки. – Mike Samuel 20 April 2014 в 19:00
  • 4
    @BoratSagdiyev, не используя старые API-интерфейсы Java, но если вы находитесь на современной JVM, то java.nio.file.DirectoryStream позволяет вам перебирать каталог и может быть реализовано с небольшим объемом памяти но единственный способ сказать наверняка - следить за использованием памяти на определенной платформе. – Mike Samuel 5 October 2014 в 04:14
  • 5
    & Quot; С: \\ & Quot; папка - не лучший выбор примера) – Vyacheslav 25 September 2015 в 12:45

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

2
ответ дан duffymo 22 August 2018 в 10:54
поделиться

Использование org.apache.commons.io.FileUtils

File file = new File("F:/Lines");       
Collection<File> files = FileUtils.listFiles(file, null, true);     
for(File file2 : files){
    System.out.println(file2.getName());            
} 

Используйте false, если вы не хотите файлы из подкаталогов.

6
ответ дан gturri 22 August 2018 в 10:54
поделиться

Как уже отмечалось, это проблема рекурсии. В частности, вы можете посмотреть

listFiles() 

В java File API здесь . Он возвращает массив всех файлов в каталоге. Использование этого вместе с

isDirectory()

для того, чтобы увидеть, нужно ли вам повторить, является хорошим началом.

2
ответ дан Jan Nielsen 22 August 2018 в 10:54
поделиться

Проверьте класс FileUtils в Apache Commons - в частности iterateFiles :

Позволяет итерацию по файлам в данной директории (и, необязательно, его подкаталоги).

27
ответ дан Pang 22 August 2018 в 10:54
поделиться
  • 1
    Этот API не является действительно потоковым (если вам небезразлично использование mem), он сначала генерирует коллекцию, а только возвращает итератор по нему: return listFiles (directory, fileFilter, dirFilter) .iterator (); – Gili Nachum 29 November 2013 в 18:28
  • 2
    Хороший вариант для Java 1.6. – David I. 19 March 2015 в 21:36

Чтобы добавить с ответом @msandiford, как и в большинстве случаев, когда идет дерево файлов, вы можете захотеть выполнить функцию как каталог или какой-либо конкретный файл. Если u неохотно использует потоки. Можно переопределить следующие методы:

Files.walkFileTree(Paths.get(Krawl.INDEXPATH), EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
    new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
                throws IOException {
                // Do someting before directory visit
                return FileVisitResult.CONTINUE;
        }
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                throws IOException {
                // Do something when a file is visited
                return FileVisitResult.CONTINUE;
        }
        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException exc)
                throws IOException {
                // Do Something after directory visit 
                return FileVisitResult.CONTINUE;
        }
});
0
ответ дан Raghu DV 22 August 2018 в 10:54
поделиться

Если вы используете Java 1.7, вы можете использовать java.nio.file.Files.walkFileTree(...) .

Например:

public class WalkFileTreeExample {

  public static void main(String[] args) {
    Path p = Paths.get("/usr");
    FileVisitor<Path> fv = new SimpleFileVisitor<Path>() {
      @Override
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
          throws IOException {
        System.out.println(file);
        return FileVisitResult.CONTINUE;
      }
    };

    try {
      Files.walkFileTree(p, fv);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

Если вы используете Java 8 , вы можете использовать интерфейс потока с помощью java.nio.file.Files.walk(...) :

public class WalkFileTreeExample {

  public static void main(String[] args) {
    try (Stream<Path> paths = Files.walk(Paths.get("/usr"))) {
      paths.forEach(System.out::println);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}
70
ответ дан smac89 22 August 2018 в 10:54
поделиться
  • 1
    есть ли способ, с помощью которого потоки помещают контрольную точку при прохождении нового каталога и выполнении функции? – Raghu DV 26 December 2017 в 16:03

Для Java 7+ существует также https://docs.oracle.com/javase/7/docs/api/java/nio/file/DirectoryStream.html

Пример, взятый из Javadoc:

List<Path> listSourceFiles(Path dir) throws IOException {
   List<Path> result = new ArrayList<>();
   try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{c,h,cpp,hpp,java}")) {
       for (Path entry: stream) {
           result.add(entry);
       }
   } catch (DirectoryIteratorException ex) {
       // I/O error encounted during the iteration, the cause is an IOException
       throw ex.getCause();
   }
   return result;
}
7
ответ дан Wim Deblauwe 22 August 2018 в 10:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: