`
gaoyu
  • 浏览: 274006 次
  • 来自: 云南大理
社区版块
存档分类
最新评论

关于BufferedInputStream和FileInputStream的区别

 
阅读更多

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();
	}
}

 

分享到:
评论

相关推荐

    jlayer-1.0.1.jar

    BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); //创建播放器对象,把文件的缓冲流传入进去 player = new Player(bufferedInputStream); ...

    BufferedInputStream 比 InputStream 性能点(实验数据报告)

    这样的设计允许BufferedInputStream直接与任何InputStream类型的对象配合使用,比如FileInputStream、JarInputStream等。通过这种方式,用户可以在不改变原有数据源的情况下,获得更好的性能。 在实际的性能测试中...

    JavaSwing后台播放音乐mp3

    play方法使用BufferedInputStream和FileInputStream类来读取mp3文件,并使用JLayer库的Player类来播放mp3文件。 使用BufferedInputStream和FileInputStream 在play方法中,使用BufferedInputStream和...

    编程语言java-io-decorator知识点.pdf

    这里的BufferedInputStream就是对FileInputStream的一个装饰,使得FileInputStream在运行时获得了缓冲功能,而不需要在编译时就确定所有可能的组合,极大地提高了代码的可扩展性和灵活性。 Decorator模式的基本结构...

    【IT十八掌徐培成】Java基础第13天-04.字节流-FileInputStream-FileOutputStream.zip

    `FileInputStream`和`FileOutputStream`是Java.io包下的核心类,它们分别代表了文件输入流和文件输出流。这两个类用于对文件进行字节级别的读写操作,适用于处理任何类型的二进制数据,如图片、音频、视频文件等。 ...

    Java中的FileInputStream 和 FileOutputStream 介绍_动力节点Java学院整理

    Java中的`FileInputStream`和`FileOutputStream`是用于处理文件输入和输出操作的基本类,它们分别继承自`InputStream`和`OutputStream`。这两个类在Java I/O系统中扮演着核心角色,提供了对文件进行字节级读写操作的...

    javaIO字节流读取文件方式总结共4页.pdf.zip

    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt")); ``` 4. ObjectInputStream和...

    BufferedOutputStream与BufferedInputStream

    在Java I/O流处理中,`BufferedOutputStream` 和 `BufferedInputStream` 是两种非常重要的类,它们分别属于字节缓冲输出流和字节缓冲输入流。这两个类都是为了提高I/O操作的效率,通过在实际操作底层流之前,先将...

    JAVA IO-(FileBuffered的InputOutputStream的基本操作)

    在Java编程语言中,IO(Input/Output)流是处理数据输入和输出的关键部分,而FileInputStream和FileOutputStream是Java IO中的基础类,用于读写文件。为了提高效率,我们通常会结合BufferedInputStream和...

    Java IO学习之缓冲输入流(BufferedInputStream)

    - 示例中首先创建了一个BufferedInputStream,关联了一个FileInputStream,用于读取名为"file.txt"的文件。 - 使用`read()`方法读取5个字节,并将它们转换为十六进制表示。 - 检查`markSupported()`,确认流支持...

    Java教程之javaIO详解

    Java IO 中的 File 类、输入流和输出流是处理输入输出操作的基本类和方法,BufferedOutputStream、BufferedInputStream、DataOutputStream 和 DataInputStream 等过滤流提供了带缓冲的读写和基本数据类型的读写功能...

    用字节流实现readline功能

    使用BufferedInputStream字节流,以及StringBuiler技术实现字节的逐行读取。即字节流的readline功能。BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream(file));

    java.io包详细解说

    以Java IO中的FileInputStream和BufferedInputStream为例,假设我们有一个FileInputStream实例,如果我们想要添加缓冲功能,可以创建一个BufferedInputStream,将FileInputStream作为参数传递给BufferedInputStream...

    java中对流的两种操作

    例如,BufferedInputStream和BufferedOutputStream可以提高读写速度,GZIPOutputStream和GZIPInputStream用于进行GZIP压缩和解压缩。 在实际操作中,我们通常会使用组合流(Chaining Streams),即一个流连接到另一...

    通过java编程得到.jpg图片16进制的数据

    2. **缓冲区(BufferedInputStream和BufferedOutputStream)**:为了提高读写效率,通常会使用`BufferedInputStream`和`BufferedOutputStream`作为包装类,它们允许一次性处理多个字节。 3. **字节与16进制转换**:...

    IO各种操作文件,字符流、字节流等

    为了提高效率,通常我们会使用带有缓冲功能的类,如BufferedInputStream和BufferedOutputStream。 在文件操作中,File类是核心,它提供了创建、删除、重命名文件和检查文件属性的方法。例如,我们可以通过File类的...

    java源码:Java二进制IO类与文件复制操作实例.rar

    这段代码首先创建了源文件和目标文件的`FileInputStream`和`FileOutputStream`对象,然后用`BufferedInputStream`和`BufferedOutputStream`包装它们。接着,我们使用一个字节数组作为缓冲区,每次从源文件读取数据,...

    安卓Android源码——IOStreamSample.rar

    在Android中,我们主要关注的是与文件操作相关的类,如FileInputStream、FileOutputStream、BufferedInputStream和BufferedOutputStream等。 二、InputStream的使用 InputStream是所有字节输入流的抽象基类,提供...

    bytestreamdemo.zip

    FileInputStream和FileOutputStream BufferedInputStream 和 BufferedOutputStream DataInputStream 和 DataOutputStream ObjectInputStream和ObjectOutputStream PrintStream PushbackInputStream

    Android IOStream实例操作源代码.rar

    Android提供了多种类型的流,包括FileInputStream和FileOutputStream,分别用于文件的读取和写入。例如,`FileInputStream fis = new FileInputStream(file);`创建一个文件输入流对象,`FileOutputStream fos = new ...

Global site tag (gtag.js) - Google Analytics