1

嗨,现在我有以下方法,我正在使用以下方法一次读取一个文件,该文件与具有此方法的类位于同一目录中:

private byte[][] getDoubleByteArrayOfFile(String fileName, Region region)
    throws IOException
{
    BufferedImage image = ImageIO.read(getClass().getResource(fileName));
    byte[][] alphaInputData =
        new byte[region.getInputXAxisLength()][region.getInputYAxisLength()];
    for (int x = 0; x < alphaInputData.length; x++)
    {
        for (int y = 0; y < alphaInputData[x].length; y++)
        {
            int color = image.getRGB(x, y);
            alphaInputData[x][y] = (byte)(color >> 23);
        }
    }
    return alphaInputData;
}

我想知道如何才能做到这一点,而不是将“fileName”作为参数,而是将目录名作为参数,然后遍历该目录中的所有文件并对其执行相同的操作。谢谢!

4

5 回答 5

2

如果您使用的是 Java 7,那么您需要查看NIO.2

具体来说,请查看列出目录的内容部分。

Path dir = Paths.get("/directory/path");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
    for (Path file: stream) {
        getDoubleByteArrayOfFile(file.getFileName(), someRegion);
    }
} catch (IOException | DirectoryIteratorException x) {
    // IOException can never be thrown by the iteration.
    // In this snippet, it can only be thrown by newDirectoryStream.
    System.err.println(x);
}
于 2013-01-18T20:34:37.070 回答
1

比较简单,使用File#listFiles()which 返回指定 File 中的文件列表,该文件必须是目录。要确保 File 是一个目录,只需使用File#isDirectory(). 问题出现在您决定如何返回字节缓冲区的地方。由于该方法返回 2d 缓冲区,因此有必要使用 3d 字节缓冲区数组,或者在这种情况下,我认为 List 是最佳选择,因为相关目录中将存在未知数量的文件。



    private List getDoubleByteArrayOfDirectory(String directory, Region region) throws IOException {
      File directoryFile = new File(directory);

      if(!directoryFile.isDirectory()) {
        throw new IllegalArgumentException("path must be a directory");
      }

      List results = new ArrayList();

      for(File temp : directoryFile.listFiles()) {
        if(temp.isDirectory()) {
          results.addAll(getDoubleByteArrayOfDirectory(temp.getPath(), region));
        }else {
          results.add(getDoubleByteArrayOfFile(temp.getPath(), region));
        }
      }
      return results;
    }

于 2013-01-18T20:43:16.240 回答
1

这是一个可能有帮助的简单示例:

private ArrayList<byte[][]> getDoubleByteArrayOfDirectory(String dirName,
    Region region) throws IOException {
       ArrayList<byte[][]> results = new ArrayList<byte[][]>();
       File directory = new File(dirName);
       if (!directory.isDirectory()) return null //or handle however you wish
       for (File file : directory.listFiles()) {
           results.add(getDoubleByteArrayOfFile(file.getName()), region);
       }  
       return results;
}

不完全符合您的要求,因为它包装了您的旧方法而不是重写它,但我发现这种方式更简洁,并且让您可以选择仍然处理单个文件。请务必根据您的实际要求调整返回类型以及如何处理region(很难从问题中分辨出来)。

于 2013-01-18T20:35:49.773 回答
0

我们也可以使用递归来处理带有子目录的目录。这里我一个一个地删除文件,你可以调用任何其他函数来处理它。

public static void recursiveProcess(File file) {
    //to end the recursive loop
    if (!file.exists())
        return;

    //if directory, go inside and call recursively
    if (file.isDirectory()) {
        for (File f : file.listFiles()) {
            //call recursively
            recursiveProcess(f);
        }
    }
    //call processing function, for example here I am deleting
    file.delete();
    System.out.println("Deleted (Processed) file/folder: "+file.getAbsolutePath());
}
于 2013-01-18T20:38:24.963 回答
0

您可以查看list 和 listFiles文档以了解如何执行此操作。

于 2013-01-18T20:28:07.490 回答