Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使InputStream的子类读取255个以上的Unicode字符,从而读取这些字符并创建字节数组而不溢出?_Java_Arrays_Unicode_Inputstream - Fatal编程技术网

Java 如何使InputStream的子类读取255个以上的Unicode字符,从而读取这些字符并创建字节数组而不溢出?

Java 如何使InputStream的子类读取255个以上的Unicode字符,从而读取这些字符并创建字节数组而不溢出?,java,arrays,unicode,inputstream,Java,Arrays,Unicode,Inputstream,我在一个网站学习平台上学习Java,他们有这个单元测试框架,他们用自己版本的输入/输出流替换System.out和System.in,以检查并将数据注入程序进行测试。在做这个站点的一些练习时,有一个练习提供了捷克语文本,第一个测试用例用一个带有以下字符的单词测试了我的输出:ř 嗯,我没有通过测试,因为我的输入将ř替换为Y 为了理解原因,我意识到ř具有Unicode值\u0159,Y具有Unicode值\u0059。以二进制表示,以两个字节表示它们对应: ř 0000 0001 0101 1001

我在一个网站学习平台上学习Java,他们有这个单元测试框架,他们用自己版本的输入/输出流替换System.out和System.in,以检查并将数据注入程序进行测试。在做这个站点的一些练习时,有一个练习提供了捷克语文本,第一个测试用例用一个带有以下字符的单词测试了我的输出:
ř

嗯,我没有通过测试,因为我的输入将
ř
替换为
Y

为了理解原因,我意识到
ř
具有Unicode值
\u0159
Y
具有Unicode值
\u0059
。以二进制表示,以两个字节表示它们对应:

ř 0000 0001 0101 1001
Y 0000 0000 0101 1001
你能发现问题吗?我马上就发现了。最重要的字节在测试框架的内部某处丢失了

经过一番挖掘,我发现这个类扩展了
InputStream
,它们用来替换System.in,并具有以下
read()

@覆盖
公共整数读取(字节[]b,整数关闭,整数长度)引发IOException{
如果(len==0){
返回0;
}
int c=read();
如果(c==-1){
返回-1;
}
b[关]=(字节)c;
int i=1;
试一试{
对于(;i
结果是行
intc=read()获取输入字符串的下一个字符的整数值。
好的,char
ř
具有超过255的十进制值
345
,因此最重要的字节丢失,并且上面的方法用丢失数据的字符填充
字节[]b
缓冲区

在经历了这么长时间的语境化之后(对不起,我正在尽可能地澄清),我问:

为了正确地将输入文本中的所有
c
转换为字节数组,可以对InputStream的这个子类做些什么

我试过这个,但对我来说似乎很俗气,因为这并不是真正读取任何一个字节一个字节的输入。我不知道。这看起来很骗人,也不通用:

@覆盖
公共整数读取(字节[]b,整数关闭,整数长度)引发IOException{
如果(len==0){
返回0;
}
int c=read();
如果(c==-1){
返回-1;
}
b[关]=(字节)c;
b[off+1]=(字节)(c>>8);
int i=2;
试一试{
对于(;i>8);
}
}捕获(忽略IOException){
}
返回i;
}
这将返回一个正确的数组,表示输入中存在的所有字节,但是,生成的字节数组不会被解释为框架其余部分的两个字节组

我真的超出了Java的能力来指出这个问题,因为我只是一个初学者,我已经用尽了所有的工具来找到解决这个问题的方法

抱歉发了这么长的邮件


干杯

为什么要获取字节数组?如果您确实想正确读取Unicode字符串,请使用
InputStreamReader
。一旦你有了一个字符串,你就可以使用
String.getBytes(Charset)
轻松地将它转换成字节…我真的不知道为什么。。。我只是想热修复这个框架错误。。。我想我可以试着让这个类改为扩展InputStreamReader。@jurez InputStreamReader将InputStream作为构造函数参数,但它不扩展InputStream,因此替换默认系统没有好处。在…中,为什么要替换System.in?你想实现什么?你能澄清一下你在这里想做什么吗
InputStream
是一个字节流(二进制数据)-它不知道Unicode或字符。如果您从InputStream中取出错误的字符,问题不在于该流,而在于如何使用它。在简要介绍了您正在克隆的测试框架之后,似乎在字符和字节的处理方面存在严重错误