2014-07-23 44 views

回答

0

此方法調用IOUtils.contentEquals,我認爲在多線程環境中沒有任何競爭條件。

FileUtils.contentEquals()

public static boolean contentEquals(File file1, File file2) throws IOException { 
    boolean file1Exists = file1.exists(); 
    if (file1Exists != file2.exists()) { 
     return false; 
    } 

    if (!file1Exists) { 
     // two not existing files are equal 
     return true; 
    } 

    if (file1.isDirectory() || file2.isDirectory()) { 
     // don't want to compare directory contents 
     throw new IOException("Can't compare directories, only files"); 
    } 

    if (file1.length() != file2.length()) { 
     // lengths differ, cannot be equal 
     return false; 
    } 

    if (file1.getCanonicalFile().equals(file2.getCanonicalFile())) { 
     // same file 
     return true; 
    } 

    InputStream input1 = null; 
    InputStream input2 = null; 
    try { 
     input1 = new FileInputStream(file1); 
     input2 = new FileInputStream(file2); 
     return IOUtils.contentEquals(input1, input2); 

    } finally { 
     IOUtils.closeQuietly(input1); 
     IOUtils.closeQuietly(input2); 
    } 
} 

IOUtils.contentEquals()

public static boolean contentEquals(InputStream input1, InputStream input2) 
     throws IOException { 
    if (!(input1 instanceof BufferedInputStream)) { 
     input1 = new BufferedInputStream(input1); 
    } 
    if (!(input2 instanceof BufferedInputStream)) { 
     input2 = new BufferedInputStream(input2); 
    } 

    int ch = input1.read(); 
    while (EOF != ch) { 
     int ch2 = input2.read(); 
     if (ch != ch2) { 
      return false; 
     } 
     ch = input1.read(); 
    } 

    int ch2 = input2.read(); 
    return ch2 == EOF; 
} 
0

通過查看FileUtils.contentEquals的源代碼,它使用BufferedInputStream在兩個文件之間進行比較(通過將兩個文件的InputStream提供給IOUtils.contentEquals)。

由於BufferedInputStream應該是線程安全的(至少我讀過,我從來沒有嘗試過),我想FileUtils.contentEquals也應該是線程安全的。

0

這取決於你多個線程是否通過相同的參數或不同的參數。具有不同參數的多個線程應該是線程安全的,因爲爭用中沒有資源。

如果您通過多個線程傳遞相同的參數,我首先會問是否需要這樣做。但忽略它,應該沒問題,因爲該方法會創建獨立的輸入流。在這種情況下唯一可能出錯的是操作系統抱怨對同一文件的多次訪問。

+0

實際上多個線程正在解析不同的參數。 – Asanka