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

我运行测试时遇到的错误是测试失败的预期[测试],但为[⨪⨪⨪]

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字符是一个字节,其他字符是两个或更多。

  • 请参阅:Wikipedia上Unicode编码的比较

请注意,UCS-2是一个非常简单且过时的编码。它只能编码前64K Unicode字符。在现代Unicode应用中,它已被UTF-16取代。根据Unicode联盟:

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

无论如何,使用字节阵列的原因是什么?如果您想操纵字符数据,则应使用字符串而不是字节来工作。字符串使您不必担心编码。

有两种I/O类:

  1. 字节流:它们用于读取字节。

您可以找到很多类,例如:bytearrayinputstream和datainputstream。

  1. 字符流:它们用于阅读可读文本。

您可以找到很多类,例如:StringReader和InputStreamReader。您可以很容易地找到此类,因为他们使用Sufix Writter或Reader。

我建议使用这样的字符串阅读器:

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

相关内容

  • 没有找到相关文章

最新更新