使用Java中的BufferedReader读取整个char流

时间:2013-02-11 22:44:41

标签: java servlets bufferedreader

我正在编写一个简单的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循环没有达到预期的效果。

我确信这是一件简单而愚蠢的事。有人可以如此友善地指出我的方式的错误吗?一如既往,提前谢谢。

2 个答案:

答案 0 :(得分: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-ism。您已经通过指定计数来绑定字符串,因此甚至看不到空字符。

答案 1 :(得分:1)

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

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

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

您还可以使用Gson这样的库,deserialise a Java class from a Reader可以为您提供。