2017-04-23 122 views
1

我正在尝试为一个单词的方法编写junit测试。 我有问题,该方法是返回符号,而不是depadded字。将DataInputStream设置为字符串值

我的测试方法是

@Test 
public void testReadString() throws IOException 
{ 
    String testString = "******test"; 

    InputStream stream = new ByteArrayInputStream(testString.getBytes(StandardCharsets.UTF_8)); 
    DataInputStream dis = new DataInputStream(stream); 

    String word = readString(dis, 10); 

    assertEquals("test", word); 
} 

的方法是测试是

public static String readString(DataInputStream dis, int size) throws IOException 
{ 

    byte[] makeBytes = new byte[size * 2];// 2 bytes per char 
    dis.read(makeBytes); // read size characters (including padding) 
    return depad(makeBytes); 
} 

public static String depad(byte[] read) 
{ 
    //word = word.replace("*", ""); 
    StringBuilder word = new StringBuilder(); 
    for (int i = 0; i < read.length; i += 2) 
    { 
     char c = (char) (((read[i] & 0x00FF) << 8) + (read[i + 1] & 0x00FF)); 

     if (c != '*') 
     { 
      word.append(c); 
     } 
    } 
    return word.toString(); 
} 

当我运行测试,我得到的错误是 测试预期失败[测试]但[⨪ ⨪⨪瑥獴]

+0

上午我从评论等正确的结论,你是读入文件到一个字节数组,治疗为UTF-8编码的文本和你它的一部分想要删除它并将剩余的文本作为字符串?如果是这样,你能解释一下吗?你确定它是UTF-8吗? –

回答

1
InputStream stream = new ByteArrayInputStream(testString.getBytes(StandardCharsets.UTF_8)); 

... 

char c = (char) (((read[i] & 0x00FF) << 8) + (read[i + 1] & 0x00FF)); 

您的代码需要一个UCS-2编码字符串,但你喂它一个UTF-8编码的字符串。在UCS-2中,每个字符恰好是两个字节。 UTF-8是一种可变长度编码,其中ASCII字符是一个字节,其他字符是两个或更多。

注意,UCS-2是一个非常简单的和过时的编码。它只能编码第一个64K Unicode字符。它在现代Unicode应用程序中被UTF-16所取代。 According to the Unicode Consortium

现在UCS-2应该被视为过时。它不再引用10646或Unicode标准中的编码形式。

无论如何,处理字节数组的原因是什么?如果你想操纵字符数据,你应该使用字符串,而不是字节。字符串使您不必担心编码。

+0

谢谢,这是一个任务的一部分,我们必须能够使用字节数组填充和删除单词到文件。否则,我会使用ObjectOutPutStream保存到文件 –

0

有两种类型的I/O类:

  1. 字节流:它们被用来读取的字节。

您可以找到很多类,如:ByteArrayInputStream和DataInputStream。

  1. 字符流:它们用于读取人类可读的文本。

您可以找到许多类:StringReader和InputStreamReader。你可以很容易地找到这个类,因为他们使用sufix Writer或Reader。

我建议使用StringReader这样的:

new StringReader("******test"); 
相关问题