对于这里经验丰富的人来说,这应该是一个简单的问题。我是Java初学者,所以我已经尝试解决这个问题几个小时了。 我正在通过实际工作来学习Java,我已经阅读了关于数组和内存分配的内容,但可能我仍然不明白。
我正在编写这种基本上采用源文本的方法,例如“bla bla bla搜索条目bla bla bla”并且应该通过返回类似“bla bla bla {font = red}搜索条目{/ font} bla bla bla”的字符串突出显示搜索条目。 如果源文本是英文的,没有问题,函数的前半部分(我没有包含它)效果很好。 但是如果源文本是双字节编码的,我必须使用ByteArrayInputStream和ByteArrayOutputStream来做同样的事情。
以下是代码:
sDebug=new String(retVal, "UTF-8");
final String sHtml1="<font color='green'><b>";
final String sHtml2="</b></font>";
ByteArrayOutputStream baOut=new ByteArrayOutputStream();
//retVal contains source text
ByteArrayInputStream baIn=new ByteArrayInputStream(retVal); );
try
{
//posB - where search entry begins in retVal
posB=Integer.valueOf(srchArray[j+2]);
//posE - where search entry ends in retVal
posE=posB+Integer.valueOf(srchArray[j+3]);
byte[] buffer=new byte[posB];
//read from beginning till posB
baIn.read(buffer, 0, posB);
sDebug=new String(buffer, "UTF-8");
baOut.write(buffer);
baOut.write(sHtml1.getBytes("UTF-8") );
sDebug=new String(baOut.toByteArray(), "UTF-8");
buffer=new byte[posE-posB];
//*************************************************
//*********THIS IS WHERE IT THROWS EXCEPTION:******
baIn.read(buffer, posB, posE-posB);
baOut.write(buffer);
sDebug=new String(baOut.toByteArray(), "UTF-8");
baOut.write(sHtml2.getBytes("UTF-8"));
sDebug=new String(baOut.toByteArray(), "UTF-8");
buffer=new byte[retVal.length-posE];
baIn.read(buffer, posE, retVal.length-posE);
baOut.write(buffer);
sDebug=new String(baOut.toByteArray(), "UTF-8");
retVal=baOut.toByteArray();
sDebug=new String(baOut.toByteArray(), "UTF-8");
//sDebug=baOut.toString("UTF-8");
}
catch(Exception e)
{
String err="Error: " + e.getMessage();
Toast.makeText(Central.context, err, Toast.LENGTH_LONG).show();
}
答案 0 :(得分:0)
如果这一行:
baIn.read(buffer, posB, posE-posB);
抛出一个边界异常,它告诉你你的索引计算出错了。换句话说,索引posB
到posE - 1
并非都在buffer
范围内。
你会感到惊讶。这很难,因为:对于有经验的人来说,这应该是一个简单的问题。
总之它太可怕了。
因此,作为一名经验丰富的程序员,我会建议您放弃它并从头开始重写它。 (如果我不得不对其进行编码检查,我会完全拒绝它,因为它是否“无效”。)
如果这太难以承受,您需要学会使用调试器。
最后一条建议是Java中的字节抨击文本数据是疯狂的。将它视为基于字符的,您可以使用一整套功能强大的(如果使用的是合理的)高效类库,从String / StringBuilder开始,然后向上移动到扫描程序,格式化程序和正则表达式。
答案 1 :(得分:0)
问题在于,而不是
baIn.read(buffer, posB, posE-posB);
我应该用
baIn.read(buffer, 0, posE-posB);
看起来第二个参数必须始终为0,尽管doc中写了什么。