Scanner类提供了一个构造函数,它将InputStream作为参数
所以我创建了一个HttpResponse对象,并使用此类的getEntity()方法获取HttpEntity,然后在实体上调用getContent()以获取InputStream对象。所以我试图使用Scanner读取返回的InputStream对象,但它失败了。 我尝试使用HttpGet请求连接到我的Android应用程序中的数据库时遇到此问题,我有一个本地托管的php脚本,它执行一些查询到mySQL数据库并回应结果
P.S 使用下面的语句为我提供了从数据库中获取的结果,没有任何问题
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
但我只是好奇为什么扫描仪无法工作,我想成为一名优秀的开发人员,所以每当遇到这样的问题时,我都会尝试理解问题的原因。
这是我的AsyncTask的代码片段
package com.example.helloworld;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.TextView;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URL;
import java.util.Scanner;
public class SignIn extends AsyncTask<String,Void,String> {
private TextView roleField;
private Context context;
private int byGetOrPost= 0;
public SignIn(Context context,TextView roleField,int flag)
{
this.context=context;
this.roleField = roleField;
byGetOrPost = flag;
}
@Override
protected String doInBackground(String... params)
{
if(byGetOrPost == 0)
{
try
{
String username = params[0];
String password=params[1];
String link = "http://10.0.2.2/myandroidapp/create.php?username="+username+"&password="+password;
URL url = new URL(link);
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(link));
HttpResponse response = client.execute(request);
Scanner in = new Scanner(response.getEntity().getContent());
//BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line ="";
while((line=in.nextLine())!=null)
{
sb.append(line);
}
in.close();
return sb.toString();
}
catch (Exception e)
{
e.printStackTrace();
return new String("Exception: " + e.getMessage());
}
}
else
{
try
{
return null;
}
catch (Exception e)
{
return new String("Exception: " + e.getMessage());
}
}
}
@Override
protected void onPostExecute(String result)
{
this.roleField.setText(result);
}
}
当我使用Scanner对象时,抛出NoSuchElement异常。这是堆栈跟踪
08-23 10:54:05.460 2188-2207/com.example.helloworld W/System.err﹕ java.util.NoSuchElementException
08-23 10:54:05.460 2188-2207/com.example.helloworld W/System.err﹕ at java.util.Scanner.nextLine(Scanner.java:1363)
08-23 10:54:05.460 2188-2207/com.example.helloworld W/System.err﹕ at com.example.helloworld.SignIn.doInBackground(SignIn.java:54)
08-23 10:54:05.460 2188-2207/com.example.helloworld W/System.err﹕ at com.example.helloworld.SignIn.doInBackground(SignIn.java:20)
08-23 10:54:05.460 2188-2207/com.example.helloworld W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:292)
08-23 10:54:05.460 2188-2207/com.example.helloworld W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-23 10:54:05.460 2188-2207/com.example.helloworld W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-23 10:54:05.460 2188-2207/com.example.helloworld W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-23 10:54:05.460 2188-2207/com.example.helloworld W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-23 10:54:05.460 2188-2207/com.example.helloworld W/System.err﹕ at java.lang.Thread.run(Thread.java:818)
当我摆脱扫描仪并使用BufferedReader时,它可以工作。在while循环中的当然,我改变了#34; in.nextLine()&#34; to&#34; in.readLine()&#34;当我使用BufferedReader读取内容时。它返回从数据库中提取的正确结果
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
我的问题是为什么
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
工作但是
Scanner in = new Scanner(response.getEntity().getContent());
不起作用?
提前致谢
答案 0 :(得分:0)
BufferedReader和Scanner的工作方式不同。
BufferedReader.readLine()
返回下一行,如果没有下一行,则返回null。
Scanner.nextLine()
返回下一行,如果没有则抛出异常。在调用nextLine()
之前,您应该通过调用hasNextLine()
来检查是否有下一行。
记录在案。阅读javadoc。