2017-10-28 116 views
2

首先我創建簽名(字節[]簽名)假。然後我將這個簽名寫入文件。我從這個文件讀取簽名並給它另一個變量(byte [] signatureCopy)。但是當我比較這兩個變量時,它返回false。我該如何解決它?陣列等於返回相同的字節數組

但是,當我打印屏幕,它的外觀一樣。

System.out.println (new String (signature)); 
System.out.println (new String (signatureCopy)); 

代碼:

byte[] signature = this.signature(data);   
    FileUtil.writeRegistryFileSigned(path, signature); 
    byte[] signatureCopy = FileUtil.readSignatureInRegistryFile(path); 
    System.out.println(Arrays.equals(signature, signatureCopy)); //FALSE 

功能;

public static byte[] readSignatureInRegistryFile(String filePath){ 
    byte[] data = null; 
    try { 
     data = Files.readAllBytes(Paths.get(filePath)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return data;   
} 


public static void writeRegistryFileSigned(String filePath, byte[] signature) { 
    File fileRegistry = new File(filePath); 
    try { 
     fileRegistry.createNewFile(); 
    } catch (IOException e1) { 

    } 
    try (FileWriter fw = new FileWriter(fileRegistry, true); 
      BufferedWriter bw = new BufferedWriter(fw); 
      PrintWriter out = new PrintWriter(bw)) {    
     out.println(new String(signature)); 

    } catch (IOException e) { 
    } 

} 
+2

請勿使用Writer寫入二進制數據。使用OutputStream。新字符串(簽名)是一種有損操作,因爲字節數組不代表使用默認字符集編碼的字符,並且println()會添加EOL字符。 –

+0

謝謝。 OutputStream工作。爲什麼Writer不工作,OutputStream的作品。你可以解釋嗎? – cezaalp

+1

我已經擁有。重新閱讀我的評論。 –

回答

5

您正在使用println編寫,它將向字符串添加CR-LF或LF。

readAllBytes真的會讀取所有字節,包括CR-LF或LF。

因此,陣列不同,雖然印刷的字符串看起來是一樣的。 (雖然,你應該注意額外的換行符。)

另外:如果你將字節轉換爲字符串,一些編碼生效,這可能會或可能不會產生你想要什麼。如果您的簽名應該是一個字節數組,請不要將其轉換爲字符串進行打印,而應以十六進制格式將字節值打印爲數字值。

+0

很好地解釋。我還想知道爲什麼它不打印「真實」。 – Razib