2013-01-18 79 views
1

嗨,現在我有以下的方法,我用在一個相同的目錄類的時刻,有這個方法來讀取一個文件:通過Java中的目錄遍歷

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」作爲參數,而是可以將目錄名稱作爲參數,然後遍歷該目錄中的所有文件並對其執行相同的操作。謝謝!

+0

什麼會使返回類型?每個文件的'region'也是一樣的嗎? –

+0

我已經完成文件操作已經有一段時間了,但我相信有一種方法可以設置您正在使用的filePath(而不是默認目錄)。那麼這只是一個遍歷該地點的所有事情的問題。我會查看是否可以找到有用的javadocs – turbo

+0

Region對象每次都是相同的。 –

回答

2

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

具體來說,看看Listing a Directory's Contents部分。

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); 
} 
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(難以從問題中得知)。

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()); 
} 
0

這是相當簡單的,使用它會返回在指定的文件中的文件,它必須是一個目錄的列表File#listFiles()。要確保文件是目錄,只需使用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; 
    }