2012-11-23 30 views
9

我正在測試IOUtils。我有問題,一個InputStream轉換成字節數組:String.getBytes()和IOUtils.toByteArray()之間的區別?

private static final String LOREM_IPSUM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; 

@Test 
public void testInputStreamToByteArray() throws IOException { 

    byte[] expecteds = LOREM_IPSUM.getBytes(); 
    byte[] actuals = org.apache.commons.io.IOUtils.toByteArray(new StringInputStream(LOREM_IPSUM)); 

    assertArrayEquals(expecteds, actuals); 
} 

堆棧跟蹤:

java.lang.AssertionError: array lengths differed, expected.length=56 actual.length=112 
    at org.junit.Assert.fail(Assert.java:91) 
    at org.junit.internal.ComparisonCriteria.assertArraysAreSameLength(ComparisonCriteria.java:72) 
    at org.junit.internal.ComparisonCriteria.arrayEquals(ComparisonCriteria.java:36) 
    at org.junit.Assert.internalArrayEquals(Assert.java:414) 
    at org.junit.Assert.assertArrayEquals(Assert.java:200) 
    at org.junit.Assert.assertArrayEquals(Assert.java:213) 
    at [...].testInputStreamToByteArray(HttpsTest.java:20)[...] 

我不明白爲什麼不通過測試。哪裏不對?

回答

9

指定編碼很重要。

您還沒有提供任何編碼來處理庫,因此將使用「默認」編碼。我猜測,因爲你的一個字節數組的大小是另一個的兩倍,所以使用的編碼是UTF-16和另一個UTF-8/ASCII。

試試這個:

public void testInputStreamToByteArray() throws IOException { 

    byte[] expecteds = LOREM_IPSUM.getBytes("UTF-8"); 
    byte[] actuals = org.apache.commons.io.IOUtils.toByteArray(new StringReader(LOREM_IPSUM), "UTF-8"); 

    assertArrayEquals(expecteds, actuals); 
} 
+0

謝謝!但是toByteArray不接受InputStream和String。兩個選項: 'IOUtils.toByteArray(new StringReader(LOREM_IPSUM),「UTF-8」); IOUtils.toByteArray(新的InputStreamReader(是),「UTF-8」);' – Falci

+0

啊,沒有注意到你在使用java.io.InputStream。你需要使用一個閱讀器,或者更具體的StringReader: 'byte [] actuals = org.apache.commons.io.IOUtils.toByteArray(new StringReader(LOREM_IPSUM),「UTF-8」);' –

+0

我的評論只是爲了澄清。再次感謝你。 – Falci