将DataInputStream设置为String Value

时间:2017-04-23 18:02:52

标签: java junit datainputstream

我正在尝试为一个隐藏单词的方法编写一个junit测试。 我遇到的问题是该方法返回符号而不是重新添加的单词。

我的测试方法是

    @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();
}

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

2 个答案:

答案 0 :(得分: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标准中的编码形式。

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

答案 1 :(得分:0)

有两种I / O类:

  1. Byte Streams:它们用于读取字节。
  2. 你可以找到很多类:ByteArrayInputStream和DataInputStream。

    1. 角色流:它们用于阅读人类可读的文本。
    2. 你可以找到很多类,如:StringReader和InputStreamReader。您可以轻松找到这些类,因为它们使用sufix Writer或Reader。

      我建议像这样使用StringReader:

      new StringReader("******test");