2012-11-23 72 views
9

Tôi đang thử nghiệm IOUtils. Tôi có vấn đề để chuyển đổi một InputStream vào một mảng byte:Sự khác nhau giữa String.getBytes() và 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); 
} 

stacktrace:

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)[...] 

Tôi không thấy lý do tại sao không vượt qua được bài kiểm tra. Chuyện gì thế?

Trả lời

9

Việc chỉ định mã hóa là quan trọng.

Bạn chưa cung cấp bất kỳ mã hóa nào để thư viện hoạt động và kết quả là mã hóa "mặc định" sẽ được sử dụng thay thế. Tôi đoán rằng vì một trong các mảng byte của bạn gấp hai lần kích thước của mảng kia, một mã được sử dụng là UTF-16 và một mã UTF-8/ASCII khác.

Hãy thử điều này:

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

Cảm ơn! Nhưng toByteArray không chấp nhận InputStream và String. Hai tùy chọn: 'IOUtils.toByteArray (StringReader mới (LOREM_IPSUM)," UTF-8 "); IOUtils.toByteArray (new InputStreamReader (là), "UTF-8"); ' – Falci

+0

Ah, không nhận thấy rằng bạn đang sử dụng java.io.InputStream. Bạn sẽ cần sử dụng Reader hoặc cụ thể hơn StringReader: 'byte [] actuals = org.apache.commons.io.IOUtils.toByteArray (chuỗi StringReader mới (LOREM_IPSUM)," UTF-8 "); ' –

+0

Nhận xét của tôi chỉ để làm rõ. Cám ơn bạn một lần nữa. – Falci

Các vấn đề liên quan