0

我正在编写一个简单的 AJAX 应用程序,它从 JSP 上的表单中获取输入,然后使用 JSON 将数据传递给 servlet。在 servlet 中,我有以下快速而肮脏的代码:

    char[] charBuffer = new char[500];
    String[] names;
    String[] values = new String[20];
    int amountRead;

    JSONObject jsonObject1;
    JSONObject jsonObject2;

    PrintWriter out = response.getWriter();
    BufferedReader in = request.getReader();

    amountRead = in.read(charBuffer);

    charBuffer[amountRead]='\0';
    String invalue = new String( charBuffer, 0, amountRead);

然后是一个try对 JSON 对象执行一些操作的块。基本上,作为练习,我试图来回传递相同的表单数据并显示它。

这就是问题所在:当然,在这个快速而肮脏的代码中,不能保证您从请求中获得完整的消息。知道如果到达流的末尾,read()方法BufferedReader将返回-1,我尝试进行以下添加:

    while( in.read() != -1 ) {
         amountRead = in.read(charBuffer); 
    }

然而,一旦我实现了这个,我的输出就是空白的。我什么也得不到。即使在尝试使用调试器逐步完成它之后,我也不完全确定为什么该while循环没有达到预期的效果。

我敢肯定这是一件简单而愚蠢的事情。有人可以指出我的方式的错误吗?与往常一样,提前致谢。

4

2 回答 2

1

如果您没有获得 EOS,您正在读取一个字符然后将其丢弃。在 Java 中读取流的正确方法是这样的:

while ((count = in.read(buffer)) > 0)
{
   out.write(buffer, 0, count);
   // or
   String s = new String(buffer, 0, count);
   // or whatever else you want.
}

您也不需要插入尾随空字符。那是C主义。您已经通过指定计数来限制字符串,因此甚至从未见过空字符。

于 2013-02-11T22:55:57.310 回答
1

BufferedReader.readLine()方法一次只读取一行,每次读取都会阻塞,直到数据可用。当到达流的末尾时,它将返回 null。

所以在一个while循环中你可以使用

String line;
BuffererReader br = request.getReader();
while ((line = br.readLine()) != null) { 
    //process the line here
}

您还可以使用类似的库Gson,它可以为您反序列化 Java 类Reader

于 2013-02-11T23:00:15.250 回答