嗨,现在我有下面的方法,我用它来读取一个文件在同一目录下的类有这个方法:
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"作为一个参数,我可以但目录名称作为一个参数,然后遍历该目录内的所有文件,并对其执行相同的操作。谢谢!
如果您使用的是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);
}
这里有一个简单的例子可能会有所帮助:
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
(很难从问题中看出)。
这很简单,使用File#listFiles()
返回指定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;
}
您可以,查看列表和listFiles文档了解如何做到这一点
我们也可以使用递归来处理带有子目录的目录。这里我一个一个地删除文件,你可以调用任何其他函数来处理它。
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());
}