BufferedInputStream。。。。。。。BufferedReader和BufferedWriter

java中BufferedInputStream缓存为什么使IO效率高? 背景     最近在看socket编程,这里面需要用到stream进行数据的读取写入。于是代码中用到了BufferedInputStream提高读的效率。所以就一直在想为什么加上buffer就能提高效率了,加上之前面试的时候曾有面试官问到过这个问题,当时没有回答上来,并且就上网搜索了一下,发现有个文章是为什么缓存能提高io效率,这个文章中说是因为缓存可以让DMA来处理io流,后面我一直都是这么认为的,今天在网上搜索发现即使你用的是inputstream来读也会用到D 阅读详情

BufferedInputStream是套在某个其他的InputStream外,起着缓存的功能,用来改善里面那个InputStream的性能(如果可能的话),它自己不能脱离里面那个单独存在。FileInputStream是读取一个文件来作InputStream。所以你可以把BufferedInputStream套在FileInputStream外,来改善FileInputStream的性能。   

 

FileInputStream与BufferedInputStream区别:

FileInputStream是字节流,BufferedInputStream是字节缓冲流,使用BufferedInputStream读资源比FileInputStream读取资源的效率高(BufferedInputStream的read方法会读取尽可能多的字节),且FileInputStream对象的read方法会出现阻塞;

 

FileInputStream与FileReader区别:

FileInputStream是字节流,FileReader是字符流,用字节流读取中文的时候,可能会出现乱码,而用字符流则不会出现乱码,而且用字符流读取的速度比字节流要快;

 

ObjectOutputStream与ByteArrayOutputStream的区别:

ObjectOutputStream可以将java对象写入outputstream流中(序列化),然后进行持久化,此对象必须是实现了java.io.Serializable 接口;

ByteArrayOutputStream是将数据写入byte数组中;

 

了解“堵塞”的意思吧!
假设一个文件的长度是100个字节,要将之读取到内存中,再假设您每次只读取10个字节,那么读完整个文件是不是读取10次的呀?

假设老板让你完成100件事情,老板说,你每天只完成10件就可以了,难道你非得等到第十天才完成第100件事情吗?有一天您在中午下班前就完成了10件事情,下午您不妨多干一点,那么也许在第9天的时候就完成了100件事情。

同理,BufferedInputStream有可能会读取比您规定的更多的东西到内存,以减少访问IO的次数,
总之您要记住一句话,访问IO的次数越少,性能就越高,原因就在于CPU和内存的速度》》》》远大于硬盘或其他外部设备的速度。

换一个不太恰当的例子来说,您和您的朋友一起去登山,你朋友太不给力了,走一会儿就要休息,而您呢,您的体力比他要好的多,根本不需要休息,所以每当他休息的时候,您得等着他,您那时候什么也干不了,这就叫堵塞,堵塞就是说您有能力干某事,但是迫于某种原因您什么也干不了,只能干等。所以您朋友休息的次数越少,你们两个到达山顶所花费的时间就越少。CPU访问硬盘的次数越少,程序就越快。BufferedInputStream在小型文件中的性能优势无法体现出来,假设您将以个2G大小的文件从D盘完全复制到E盘,性能之优势便展露无疑!

追问
首先 谢谢您耐心的讲解。让我更深刻的了解了阻塞的概念。
但是我想了解的是,您说的这个BufferedInputStream在大型文件中的应用。如何应用。能不能以代码的形式 举个例子?
我想看看如何将2G大小的文件从D盘完全复制到E盘的 这种代码。

不知道能否给与帮助 谢谢
回答
import java.io.*;
public class SS {
	public static void main(String[] args) throws Exception {
		File f = new File("d:\\大型数据库文件.mdf");	
		FileInputStream fis = new FileInputStream(f);
		//如果下面的语句使用BufferedOutputStream来修饰则带来更好的性能现。
		FileOutputStream fos = new FileOutputStream("e:\\" + f.getName());	
		int length = 0;
		byte[] b = new byte[1024];
		while((length = fis.read(b)) != -1)
		{
			fos.write(b, 0, length);
		}
		fos.close();
		fis.close();
	}
}
BufferedReader和BufferedWriter

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值足够大。

通常, Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader )。

BufferedReader 流能够读取文本行 , 通过向 BufferedReader 传递一个 Reader 对象, 来创建一个 BufferedReader 对象 , 之所以这样做是因为 FileReader 没有提供读取文本行的功能 .

. Demo :

通过 Bufferedreader 捕获所输入的语句 :

import java.io.*;
class BufferedReaderDemo{
  public static void main(String[] args)throws IOException { 
    BufferedReader bufferedReader =new BufferedReader(
        new InputStreamReader(System.in));
 
    System.out.print("请输入一系列文字,可包括空格:"); 
    String text =bufferedReader.readLine(); 
    System.out.println("请输入文字:"+text);
  } 
}
  
注解:

throws IOException   抛出异常

InputStreamReader 是字节流通向字符流的桥梁

二、InputStreamReader类

InputStreamReader 将字节流转换为字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。 
构造方法 : 
    InputStreamReader isr = new InputStreamReader(InputStream in);//构造一个默认编码集的InputStreamReader类 
    InputStreamReader isr = new InputStreamReader(InputStream in,String charsetName);//构造一个指定编码集的InputStreamReader类。 
    
    参数 in对象通过 InputStream in = System.in;获得。//读取键盘上的数据。 
    或者 InputStream in = new FileInputStream(String fileName);//读取文件中的数据。可以看出 FileInputStream 为InputStream的子类。 
主要方法 :int read();//读取单个字符。 
                 int read(char []cbuf);//将读取到的字符存到数组中。返回读取的字符数。

. Demo :

import java.io.*;
class InputStreamReaderDemo {
  public static void transReadNoBuf() throws IOException {
    /**
     * 没有缓冲区,只能使用read()方法。
     */
    //读取字节流
    //InputStream in = System.in;//读取键盘的输入。
    InputStream in = new FileInputStream("D:\\demo.txt");//读取文件的数据。
    //将字节流向字符流的转换。要启用从字节到字符的有效转换,
    //可以提前从底层流读取更多的字节.
    InputStreamReader isr = new InputStreamReader(in);//读取
    //综合到一句。
    //InputStreamReader isr = new InputStreamReader(
    //new FileInputStream("D:\\demo.txt"));
      
    char []cha = new char[1024];
    int len = isr.read(cha);
    System.out.println(new String(cha,0,len));
    isr.close();

  }
  public static void transReadByBuf() throws IOException {
    /**
     * 使用缓冲区 可以使用缓冲区对象的 read() 和  readLine()方法。
     */
    //读取字节流
    //InputStream in = System.in;//读取键盘上的数据
    InputStream in = new FileInputStream("D:\\demo.txt");//读取文件上的数据。
    //将字节流向字符流的转换。
    InputStreamReader isr = new InputStreamReader(in);//读取
    //创建字符流缓冲区
    BufferedReader bufr = new BufferedReader(isr);//缓冲
    //BufferedReader bufr = new BufferedReader(
    //new InputStreamReader(new FileInputStream("D:\\demo.txt")));可以综合到一句。
      /*int ch =0;
    ch = bufr.read();
    System.out.println((char)ch);
    */
    String line;
    while((line = bufr.readLine())!=null){
      System.out.println(line);
    }
    isr.close();
  }
}

三、InputStreamReader、BufferedReader真实案例(非编码集)

import java.io.*;
class UtilResource {
  private void initializeResource() {
    try {

      //读取文件,并且以utf-8的形式写出去
      BufferedReader bufread;
      String read;
      bufread = new BufferedReader(new InputStreamReader(ResourceHelper
          .getResourceInputStream("pinyin.txt")));
      while ((read = bufread.readLine()) != null) {
        System.out.println(read);
      }
      bufread.close();
    } catch (FileNotFoundException ex) {
      ex.printStackTrace();
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}

注:其中 pinyin.txt 放于项目的根目录下 

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
class ResourceHelper {
  /**
   * @param resourceName
   * @return 
   * @return 
   */
  static BufferedInputStream getResourceInputStream(String resourceName) {
    try {
      return new BufferedInputStream(new FileInputStream(resourceName));
    } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return null;
  }
}
  1. package ysu.hxy;  
  2. import java.util.*;  
  3. import java.io.*;  
  4.   
  5. public class BufferedReaderWriterDemo   
  6. {  
  7.     public static void main(String[] args)   
  8.     {  
  9.         try  
  10.         {  
  11.             //缓冲System.in输入流  
  12.             //System.in是位流,可以通过InputStreamReader将其转换为字符流  
  13.             BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in));  
  14.             //缓冲FileWriter  
  15.             BufferedWriter bufWriter = new BufferedWriter(new FileWriter(args[0]));  
  16.   
  17.             String input = null;  
  18.   
  19.             //每读一行进行一次写入动作  
  20.             while(!(input = bufReader.readLine()).equals("quit"))  
  21.             {  
  22.                 bufWriter.write(input);  
  23.                 //newLine()方法写入与操作系统相依的换行字符,依执行环境当时的OS来决定该输出那种换行字符  
  24.                 bufWriter.newLine();  
  25.             }  
  26.             bufReader.close();  
  27.             bufWriter.close();  
  28.         }  
  29.         catch(ArrayIndexOutOfBoundsException e)  
  30.         {  
  31.             System.out.println("没有指定文件");  
  32.         }  
  33.         catch(IOException e)  
  34.         {  
  35.             e.printStackTrace();  
  36.         }  
  37.     }  
  38. }  

IO-4(BufferedInputStreamBufferedInputStreamBufferedReaderBufferedWriter 1.BufferedInputStream 字节缓冲输入流 从文件中读取数据 1.1 读数据步骤 创建数据流对象 将基本流包装秤高效流 读数据 关闭流 import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; public class Test{ ... 阅读详情

相关推荐

Power BI应用案例:淘宝用户行为分析实战

一、案例背景 基于千万级的淘宝用户的使用记录,对淘宝用户的行为进行分析,具体指标包括:日PV、日UV、小时PV、小时UV、不同用户行为的PV、用户购买次数分布、用户购买频次分布、活跃用户消费情况等。通过本案例,可以基本看看Power BI都能分析达到怎么样的效果。 二、数据来源及结构 阿里天池官方发布的1万用户在2014年双十二期间的行为记录,数据量达1200万+。 数据下载地址:...

灰哥数据智能的专栏 1万+

关于BufferedInputStreamFileInputStream的区别

BufferedInputStream是套在某个其他的InputStream外,起着缓存的功能,用来改善里面那个InputStream的性能(如果可能的话),它自己不能脱离里面那个单独存在。FileInputStream是读取一个文件来作InputStream。所以你可以把BufferedInputStream套在FileInputStream外,来改善FileInputStream的性能。 ...

stbrief的专栏 691

从T型结到Wilkinson:5分钟搞懂功分器选型指南(附最新射频测试数据对比)

本文通过对比T型结、电阻型Wilkinson三种功分器的核心原理与实测数据,提供了清晰的射频功分器选型指南。文章结合最新的2.4GHz ISM频段测试数据,分析了插入损耗、回波损耗端口隔离度等关键指标,并针对窄带物联网、射频测试及合成系统等不同应用场景,给出了具体的选型建议实战提醒,帮助工程师根据系统需求做出最优决策。

bush的博客 266

java-IO InputStreamReader的区别使用

1、InputStreamReader的区别? InputStream是表示字节输入流的所有类的超类 Reader是用于读取字符流的抽象类 InputStream提供的是字节流的读取,而非文本读取,这是Reader类的根本区别。 即用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。 字节流用于操作文件数据,网络传输等场景,而字符流适用...

未的博客 3915

InputStreamReader区别

InputStream,OutputStream前者为字节输入流,后者为字节输出流。ReaderWriter前者为字符输入流,后者为字符输出流。 四个均为抽象类。fileInputStream是InputStream的实现类fileReader是Reader的实现类 字节流读取单位为一个字节,字符流读取单位为一个字符所以读取汉字的时候,如果用字节流就会导致读...

ddak56357的博客 366

BufferedInputStream的read方法原理

原文地址:http://www.software8.co/wzjs/java/1770.html BufferedInputStream是一个带有缓冲区的输入流,通常使用它可以提高我们的读取效率,现在我们看下BufferedInputStream的实现原理:  BufferedInputStream内部有一个缓冲区,默认大小为8M,每次调用read方法的时候,它首先尝试从缓冲区里读取数据,若读

yinbucheng的博客 1万+

BufferedInputStream、BufferedOutputStream、BufferedReaderBufferedWriter的总结

缓冲流: 字节缓冲流: 字节输入缓冲流:BufferedInputStream 字节输出缓冲流:BufferedOutputStream 字符缓冲流: 字符输入缓冲流:BufferedReader 字符输出缓冲流:BufferedWriter 缓冲流特点是快,因为内部有一个缓冲区,可以提高效率。缓冲流本身并不具备读...

bll1992的博客 2599

java 中的缓冲流(处理流)BufferedReaderBufferedWriterBufferedInputStream、BufferedOutputStream

介绍了节点流与处理流,详细的讲解了处理流,BufferedReader、BufferedOutputStream等......

weixin_74200123的博客 1327

IO流(七):缓冲流---BufferedInputStream、BufferedOutputStream、BufferedReaderBufferedWriter

本片文章主要讲解缓冲流---字节缓冲输入流(BufferedInputStream)字节缓冲输出流(BufferedOutputStream)、字符缓冲输入流(BufferedReader)字符缓冲输出流(BufferedWriter)。概念 + 代码演示 + 注意事项

rainingCSDN的博客 2054

缓冲流( BufferedInputStream , BufferedOutputStream ,BufferedReaderBufferedWriter

一、缓冲流 缓冲流是前面四种常用输入、输出流的增强版。

Alla 819

Java中的缓冲流的使用BufferedInputStream 、BufferedOutputStream 、 BufferedReaderBufferedWriter

1.缓冲流涉及到的类: BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter 2.作用: 3.典型代码 3.1 使用BufferedInputStreamBufferedOutputStream: @Test public void testBufferedInputOutputStream(){ BufferedInputStream bis = null; BufferedOutputStre

qq_45554909的博客 322

Java 缓冲流深度解析:从原理到性能优化(BufferedInputStream/BufferedOutputStream/BufferedReader/BufferedWriter

摘要:Java缓冲流通过内存缓冲区减少IO操作次数,显著提升性能。字节缓冲流(BufferedInputStream/OutputStream)适合二进制数据,字符缓冲流(BufferedReader/Writer)提供readLine()等文本处理方法。实验表明,缓冲流比普通流快10-20倍,8KB-64KB缓冲区效果最佳。使用时需注意正确关闭流、及时刷新缓冲区指定字符编码。缓冲流是优化IO性能的关键技术,合理使用可大幅提升程序效率。

qq_40303030的博客 1213

java第十三课(BufferedOutputStream,BufferedInputStream,BufferedReader,BufferedWriter)

Java中的缓冲流是为了提高IO操作的性能而设计的。在处理输入输出时,缓冲流利用内部缓冲区来减少实际的IO操作次数,从而提高读写数据的效率。其中BufferedInputStream是字节缓冲输入流BufferedOutputStream是字节缓冲输出流BufferedReader是字符缓冲输入流Bufferedwriter是字符缓冲输出流。

2302_78076476的博客 635

缓冲流(BufferedInputStream,BufferedOutputStream\BufferedReaderBufferedWriter

缓冲流的原理 昨天学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,就像穿上铠甲的武士一样,相当于是对基本流对象的一种增强。 缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类: 字节...

Valentino112358的博客 474

java基础之缓存流(BufferedInputStream,BufferedOutputStream,BufferedReaderBufferedWriter

字节缓存流 他们的功能字节流一样,只不过他们的效率比字节流的效率高。用法也都一样。 下面用一个小例子来说明他们的用法 BufferedInputStream         BufferedOutputStream package cn.bzu.look.dao; import java.io....

奋斗的哼哼 465

Java的IO流--BufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStream

这里我们只介绍BufferedReader(带有缓冲区的Reader),它是一个包装流,包装流对应一个节点流。何为包装流节点流?我们给出一张图: 上面的为正常没有包装流的时候,FileReader也叫作节点流,BufferReader叫做包装刘,也就是作一个缓冲,等BufferedReader满了过后再传输(未满也可以传输)。我们继续补充我们的结构图: 我们来看看BufferedReader

MindMrWang的blog 1572

JAVA 缓冲流 BufferedInputStream-BufferedOutputStream-BufferedReader-BufferedWriter

1. 概述 缓冲流,也叫高效流,缓冲流是相比字节流、字符流具有更高读写性能的操作流,其中包括: 字节缓冲流:BufferedInputStream,BufferedOutputStream 字符缓冲流:BufferedReaderBufferedWriter 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。 2....

weixin_43838446的博客 462

Java BufferedInputStream类 、BufferedOutputStream类、BufferedReader类、BufferedWriter类(带缓存的输入/输出流)

 BufferedInputStream类  与 BufferedOutputStream类1、BufferedInputStream类可以对任何的InputStream类进行带缓存区的包装以达到性能的优化。   BufferedInputStream类的两种构造方法:(1)BufferedInputStream(InputStream in)    //创建了一个带有32个字节的缓存流(2)Bu...

Hern(宋兆恒) 1606

java基础 ---- BufferedOutputStream类,BufferedInputStream类,BufferedWriter类,BufferedReader

缓冲流的理解概述: 缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类:字节缓冲流:BufferedInputStream,BufferedOutputStream字符缓冲流BufferedReaderBufferedWriter 缓冲流的读写方法与基本基本的FileXxx 流的方法一样,但是数据传输效率更高。基本原理是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。 缓冲流的使用概述: 缓..

m0_46523928的博客 713

java io包BufferedWriter/BufferedReader/BufferedInputStream应用

在txt中写入随机数并读出来 import java.io.*; import java.math.*; public class TestBufferStream2 { public static void main(String args[]){ try { BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\logs2.txt")); BufferedReader

weixin_45817660的博客 242

全国31个省份2000-2022第一产业第二产业第三产业增加值占GDP比重

全国31个省份2000-2022第一产业第二产业第三产业增加值占GDP比重含计算结果、参考资料数据来源:基于中国统计年鉴、各地公布数据整理计算数据期间:2000-2022数据范围:全国31个省份主要指标:指标测度数据范围数据年份参考文献一产值占比第一产业增加值/地区生产总值31省2000-2022[1]钞小静,任保平.中国经济增长质量的时序变化与地区差异分析[J].经济研究,2011,46(04):26-40. [2]干春晖,郑若谷,余典范.中国产业结构变迁对经济增长波动的影响[J].经济研究,2011,46(05):4-16+31.二产值占比第二产业增加值/地区生产总值三产值占比第三产业增加值/地区生产总值年份 省市 第一产业增加值(亿元) 第二产业增加值(亿元) 第三产业增加值(亿元) GDP(亿元) 第一产业/GDP 第二产业/GDP 第三产业/GDP

上一篇: 安卓小记
下一篇: xcode清理
yuixxxaaa
博客等级 码龄10年 0粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值