1

こんにちは今、私はこのメソッドを持つクラスと同じディレクトリで一度に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()ディレクトリである必要がある指定された File 内のファイルのリストを返すを使用すると、かなり単純です。File がディレクトリであることを確認するには、単純にFile#isDirectory(). 問題は、バイト バッファーを返す方法を決定する場所で発生します。このメソッドは 2 次元バッファーを返すため、3 次元バイトのバッファー配列を使用する必要があります。または、この場合、問題のディレクトリに不明な数のファイルが存在するため、リストが最良の選択のように思えます。



    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

再帰を使用して、サブディレクトリを持つディレクトリも処理できます。ここでは、ファイルを 1 つずつ削除しています。他の関数を呼び出して処理できます。

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 に答える