-2

对于这里有经验的人来说,这应该是一个简单的问题。我是 Java 初学者,所以我已经尝试解决这个问题几个小时了。我正在通过实际工作学习Java,我已经阅读了有关数组和内存分配的内容,但可能我仍然不明白。

我正在编写这个方法,它基本上采用源文本,例如“bla bla bla search entry bla bla bla”,并且应该通过返回类似“bla bla bla {font=red}search entry{/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();
            }
4

2 回答 2

0

问题是,而不是

baIn.read(buffer, posB, posE-posB);

我应该用

baIn.read(buffer, 0, posE-posB); 

尽管文档中写了什么,看起来第二个参数必须始终为 0 。

于 2012-02-16T04:39:50.213 回答
0

如果这一行:

   baIn.read(buffer, posB, posE-posB);

抛出一个边界异常,它告诉你你的索引计算出错了。换句话说,索引posBthroughposE - 1并不都在buffer.


对于这里有经验的人来说,这应该是一个简单的问题。

你会感到惊讶。这很难,因为:

  • 你的代码很乱而且难以阅读,
  • 你的代码逻辑很丑陋,充满了莫名其妙的硬连线常量,
  • 您的代码不完整并且包含明显的编译错误,并且
  • 您对您正在尝试做的事情的描述很难阅读/理解

简而言之,这是可怕的。

所以作为一个有经验的程序员,我建议你把它扔掉,然后从头开始重写。(如果我必须对它进行代码审查,我会直接拒绝它,因为它明显无法维护,无论它是否“有效”。)

如果这太难以忍受,您需要学习使用调试器。

最后一条建议是,Java 中的字节抨击文本数据是疯狂的。将其视为基于字符的,您可以使用一整套功能强大且(如果使用合理的话)高效的类库,从 String / StringBuilder 开始,一直到扫描仪、格式化程序和正则表达式。

于 2012-02-10T07:51:32.173 回答