Java I / O работает с каждым файлом в пути - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть справочная система HTML, которую нужно преобразовать в SharePoint.Два наиболее трудоемких проекта - изменить ссылки на документы и собрать метаданные.Однако мне повезло, потому что эти данные легко доступны.Каждый файл является HTML-документом, упрощенно как показано ниже:

 <body>
   <!--- Metadata follows
   Procedure Name: my document
   Procedure Number: xxxxx
   Use: freeform text explaining when procdure is used
   Revision Date: xx/xx/xx
   By: responsible party for revision
   <!--- end metadata

   <h1>Procedure Name<\h1>
   <p>procedure background and narrative, with links, as needed, to other documents at \\documentation-server\path\document-name.html
 <\body>

Я могу успешно извлекать нужные строки и манипулировать ими, и я пытаюсь включить этот процесс в автоматизированное решение.Так как это мое первое занятие в области файлового ввода-вывода, я не совсем понимаю, что делать дальше.

В идеальном мире, учитывая путь, я бы хотел пройти каждый *.HTML-файл в пути.Я не могу найти класс / метод для этого.newInputStream и newOutpuStream дают мне доступ к файлу, но мне нужно указать путь и параметр файла.Интерфейс FileVisitor появляется только для взаимодействия атрибутов файла и выполнения функций типа удаления / копирования / переименования.

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

Моя другая мысль состояла в том, чтобы создать массив имен файлов, а затем передать егомассив в параметр имени файла newInputStream.

Предложения?

Ответы [ 4 ]

1 голос
/ 02 апреля 2012

Это может показаться немного нелогичным, но объект File в java также представляет Каталоги .

Вы можете проверить, является ли это каталогом, выполнив:

file.isDirectory()

Если это так, вы можете перечислить все файлы и обработать их соответствующим образом:

for(File f : file.listFiles()){
   handle(f);
}
1 голос
/ 02 апреля 2012
java.io.File file = new File("yourPath");
if(file.isDirectory())
    for(File f : file.listFiles(new YourFileFilter()))
       doYourReading(new FileInputStream(f));

И:

class YourFileFilter extends java.io.FileFilter{
    public boolean accept(File pathname) {
          return pathname.getName().toLowerCase().endsWith(".html");
    }
}

Это основная идея, по крайней мере.Обработка исключений на вас (;

1 голос
/ 02 апреля 2012

Вам нужен html-парсер - http://htmlparser.sourceforge.net/. Затем свяжите каждый документ, и он будет делать то, что вы хотите.

1 голос
/ 02 апреля 2012

Если вы используете Java 7, интерфейс FileVisitor позволяет очень легко обходить дерево файлов.См., Например, Java Tutorial .

. Вы можете переопределить метод visitFile, чтобы сделать с файлом то, что вам нужно, например (не проверено):

@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
    if (attr.isRegularFile() && file.getFileName().toString().endsWith(".html")) {
        Charset charset = Charset.forName("UTF-16");
        try (BufferedReader reader = Files.newBufferedReader(file, charset)) {
           String line;
           while ((line = reader.readLine()) != null) {
               System.out.println(line); //do what you need to do here
            }
         } catch (IOException x) {
             //Print / log the errror
         }
    }
    return CONTINUE;
}
...