Java I / O在路径中的每个文件上运行

时间:2012-04-02 11:59:32

标签: java filesystems read-write

我有一个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>

我可以成功提取&amp;操纵正确的字符串,我正在尝试将该过程合并到自动化解决方案中。因为这是我第一次进入文件i / o,但是我对下一步做什么有点模糊。

在一个完美的世界中,给定一条路径,我想逐步浏览路径中的每个* .html文件。我似乎无法找到一个类/方法来做到这一点。 newInputStreamnewOutpuStream为我提供了文件访问权限,但我需要提供一个路径&amp;文件参数。 FileVisitor接口出现,仅交互文件属性并执行删除/复制/重命名类型功能。

是否有一个soemthing将这些组合成一个单独的函数,它将遍历路径中的每个文件,打开它并允许我逐行解析,然后关闭文件并移动到下一个重复?

我的另一个想法是创建一个文件名数组,然后将该数组提供给newInputStream的文件名参数。

连连呢?

4 个答案:

答案 0 :(得分:1)

如果使用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;
}

答案 1 :(得分:1)

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");
    }
}

这至少是基本的想法。异常处理在你身上(;

答案 2 :(得分:1)

你需要html解析器 - http://htmlparser.sourceforge.net/。然后链接每个文档,它将执行您想要做的事情。

答案 3 :(得分:1)

它可能看起来有点违反直觉,但java中的File对象也代表目录

您可以通过执行以下操作来检查它是否是目录:

file.isDirectory()

如果是,您可以列出所有文件并相应地处理它们:

for(File f : file.listFiles()){
   handle(f);
}