我正在编写一个简单的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
循环没有达到预期的效果。
我确信这是一件简单而愚蠢的事。有人可以如此友善地指出我的方式的错误吗?一如既往,提前谢谢。
答案 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
可以为您提供。