BufferReader字符输入流,Scanner扫描类,通过这两个类对InputStream进行包装就可以进行读取数据了。但这两个类都有各自的优缺点,下面来介绍下:
使用BufferReader,我们通常使用它的readerLine()方法,该方法是一个阻塞方法,当没有数据读取时,就一直会阻塞在那不返回null,造成EOFException异常。
(1) 读取返回null的情况:当数据读取完后并不会一定返回null,只有当数据流发生异常、服务器另一端被close时才会返回null,才能读取结束。
(2) 正常读取数据:当数据读取到BufferReader的默认上限8192个字符时、遇到"/r"、"/n"、"/r/n"时才会返回,我们才获取到了读取的数据。
StringBuilderbuilder = new StringBuilder();
try {
URLConnection conn =arg0[0].openConnection();// 创建网络连接对象
BufferedReader reader=newBufferedReader(new InputStreamReader(
conn.getInputStream(),"UTF-8"));
// reader.readLine()就造成阻塞了
while((line=reader.readLine())!=null){
builder.append(line+"/n");
hasRead++;
publishProgress(hasRead);//通知进度刷新
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return builder.toString();
}
上述网络获取数据BufferReader读取数据就可能造成java.io.EOFException异常,就是数据中不包含/n、/r造成的阻塞。
1. 读入的数据要注意有/r或/n或/r/n
2. 没有数据时会阻塞,在数据流异常或断开时才会返回null
3. 使用socket之类的数据流时,要避免使用readLine(),以免为了等待一个换行或回车符而一直阻塞
读取数据还可以使用Scanner,但Scanner只要遇到空格键,Tab键,Enter键,就会返回下一个输入,若我们的数据中包含空格等,则不会被输出出来。此时就要使用bufferReader了。
StringBuilder builder = new StringBuilder();
try {
URLConnectionconn = arg0[0].openConnection();// 创建网络连接对象
Scannerreader = new Scanner(new InputStreamReader(
conn.getInputStream(),"UTF-8"));
String line= null;
while(reader.hasNext()) {
builder.append(reader.next());
}
reader.close();
} catch(IOException e) {
e.printStackTrace();
}
return builder.toString();
}
这样就可以读取数据了。