https://blog.csdn.net/zgljl2012/article/details/47267609

在Java中,上述三个类经常用于处理数据流,下面介绍一下三个类的不同之处以及各自的用法。

  • InputStream : 是所有字节输入流的超类,一般使用它的子类:FileInputStream等,它能输出字节流;
  • InputStreamReader : 是字节流与字符流之间的桥梁,能将字节流输出为字符流,并且能为字节流指定字符集,可输出一个个的字符;
  • BufferedReader : 提供通用的缓冲方式文本读取,readLine读取一个文本行, 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。

下面有三个Demo(Demo访问百度主页获取字节流然后输出)来分别说明三个类的作用:


  • InputStream
package 数据流;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL; public class Test_InputStream { /**
* 获取字节流
* @param url
* @return
*/
private String getStream(String url){
//获取字节流
InputStream in = null;
String result = "";
try {
in = new URL(url).openStream();
int tmp;
while((tmp = in.read()) != -1){
result += (char)tmp;
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//输出字节流
return result;
} public static void main(String[] args){ String URL = "http://www.baidu.com";
Test_InputStream test = new Test_InputStream();
System.out.println(test.getStream(URL)); }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

通过URL连接获取了InputStream流连接,然后通过read方法来一个字节一个字节的读取字节流并组合在一起(read方法返回-1则数据读取结束),最后以reasults返回。

输出如下:

60 33 68 79 67 84 89 80 69 32 104 116 109 108 62 60 33 45 45 83 84 65 84 ……

这就是字节流,每个数字都是一个字节(Byte,8位),所以如果读取英文的话,用字节流,然后用(char)强制转化一下就行了,但如果有中文等双字节语言或者说需要指定字符编码集的情况,就必须用到InputStreamReader将字节流转化为字符流了。


  • InputStreamReader
package 数据流;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL; public class Test_InputStreamReader { /*
* 得到字符流前需先有字节流
*/
private String getStream(String url){
try {
//得到字节流
InputStream in = new URL(url).openStream();
//将字节流转化成字符流,并指定字符集
InputStreamReader isr = new InputStreamReader(in,"UTF-8");
String results = "";
int tmp;
while((tmp = isr.read()) != -1){
results += (char)tmp;
}
return results; } catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String URL = "http://www.baidu.com";
Test_InputStreamReader test = new Test_InputStreamReader();
System.out.println(test.getStream(URL));
} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

先获取字节流,然后创建InputStreamReader将字节流转化成字符流,并指定其字符集为UTF-8,然后使用强制转化将read到的int字节转化为char型,此时已可以输出中文字符,并且可速度上看出,输出字符流比输出字节流要快。下面是结果的部分截图: 


  • BufferedReader
package 数据流;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL; public class Test_BufferedReader { /*
* 字节流——字符流——缓存输出的字符流
*/
private String getStream(String url){
try {
//得到字节流
InputStream in = new URL(url).openStream();
//将字节流转化成字符流,并指定字符集
InputStreamReader isr = new InputStreamReader(in,"UTF-8");
//将字符流以缓存的形式一行一行输出
BufferedReader bf = new BufferedReader(isr);
String results = "";
String newLine = "";
while((newLine = bf.readLine()) != null){
results += newLine+"\n";
}
return results; } catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String URL = "http://www.baidu.com";
Test_BufferedReader test = new Test_BufferedReader();
System.out.println(test.getStream(URL));
} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

获取字符流后,可直接缓存,然后从缓存区取出,这时的速度比InputStreamReader又将快上很多。输出结果同上。


  • 总结 
    在读取网络数据流的时候,可以通过先用InputStream获取字节流、InputStreamReader将字节流转化成字符流、BufferedReader将字符流以缓存形式输出的方式来快速获取网络数据流。

Java InputStream 、 InputStreamReader和BufferedReader的更多相关文章

  1. java编写socket使用bufferedReader.readLine()问题研究

    不写java代码好久,临时写个socket通讯竟然失败,郁闷之下仔细研究了下. 客户端使用BufferedReader来读取数据,在while中调用BufferedReader.readLine()函 ...

  2. 【java】io流之字节流转为字符流:java.io.OutputStreamWriter和java.io.InputStreamReader

    package 文件操作; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...

  3. 转换流读写操作 java.io.OutputStreamWriter ,java.io.InputStreamReader

    package seday07; import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStr ...

  4. Java 之 InputStreamReader 类

    InputStream 类 1.概述 转换流 java.io.InputStreamReader ,是Reader的子类,是从字节流到字符流的桥梁.  该类读取字节,并使用指定的字符集将其解码为字符. ...

  5. Java IO: InputStreamReader和OutputStreamWriter

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍InputStreamReader和OutputStreamWriter.细心的读者可 ...

  6. java InputStream

    java InputStream 当为网络数据流是,不能以read为-1作为数据结束的尾. 而用下列案例获取数据. Log.v(TAG, "==========start========== ...

  7. Java InputStream读取网络响应Response数据的方法

    Java InputStream读取数据问题 原理讲解 1. 关于InputStream.read()     在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方 ...

  8. 分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)

    原文:分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要) Java InputStream读取数据问题 ======== ...

  9. Java中InputStream 、 InputStreamReader 、 BufferedReader的区别

    1.InputStream.OutputStream 处理字节流的抽象类 InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等. OutputS ...

随机推荐

  1. startSSL 申请免费的SSL证书

    打开网址https://www.startssl.com/?app=12,选择Sign-up注册. 输入个人注册信息 需注意以下几点:(1)地址必须详细,否则你会收到这样的邮件: Please pro ...

  2. 23个Python爬虫开源项目代码,包含微信、淘宝、豆瓣、知乎、微博等

    今天为大家整理了23个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心,所有链接指向GitHub,微信不能直接打开,老规矩,可以用电脑打开. 关注公众号「Pyth ...

  3. 掌握 MySQL 这 19 个骚操作,效率至少提高3倍

    本文我们来谈谈项目中常用的MySQL优化方法,共19条,利用好这19条方法,会让你的效率提升至少3倍. 1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单 ...

  4. 架构师成长之路4.4-多维监控体系_zabbix

    点击返回架构师成长之路 点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 架构师成长之路4.4-多维监控体系_zabbix 自学Zabbix之路[第 ...

  5. hdu3516 Tree Construction (区间dp+四边形优化)

    构造方法肯定是把相邻两个点连到一起,变成一个新点,然后再把新点和别的点连到一起.... 设f[i,j]为把第i到j个点都连到一起的代价,那么答案就是f[1,n] f[i,j]=min{f[i,k]+f ...

  6. 最长公共子序列LCS(POJ1458)

    转载自:https://www.cnblogs.com/huashanqingzhu/p/7423745.html 题目链接:http://poj.org/problem?id=1458 题目大意:给 ...

  7. WEB入门之十三 jQuery选择器

    学习内容 jQuery层次选择器 jQuery属性选择器 jQuery表单选择器 jQuery过滤选择器 能力目标 熟悉jQuery各种选择器的使用场合 能熟练使用jQuery各种选择器 本章简介 上 ...

  8. Luogu 1084 NOIP2012 疫情控制 (二分,贪心,倍增)

    Luogu 1084 NOIP2012 疫情控制 (二分,贪心,倍增) Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是 ...

  9. 最最最最最基础的SQL Server

    --创建数据库(命名不允许为汉字开头.不允许为数字开头.不允许为符号开头) create database Class --执行完成进行下一步点加go go --定位数据库 use Class --创 ...

  10. merge函数:R语言,根据相同的列或ID合并不同的文件

    一般Excel就能实现根据相同的列或ID合并不同的文件,但对于大文件来说,比如几十个G的数据量,用Excel处理,不仅耗时,而且还会使电脑崩溃.R语言的优势就体现在这里了,处理大文件相当快. firs ...