`
benx
  • 浏览: 276366 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

FileInputStream和BufferedInputStream

    博客分类:
  • java
J# 
阅读更多

 

万恶的javaeye,编辑器能不能优化下,每次修改样式都变形了。

 

FileInputStream 属于数据源

BufferedInputStream 属于FileInputStream的一个装饰

 

 

BufferedInputStream 有个内部缓冲区当read时会先把缓冲区填满,然后下次读取是直接从缓冲区读取。当读取的位置大于缓冲区时会再一次加载缓冲区。

 

read()read(byte[] buf, int off, int len)处理方式一样,区别在于后者一次返回多个数据,但是同样都是先放入缓冲区,然后再读取。

private void fill() throws IOException {

       byte abyte0[] = getBufIfOpen();

       if (markpos < 0)

           pos = 0;

       else if (pos >= abyte0.length)

           if (markpos > 0) {

              int i = pos - markpos;

              System.arraycopy(abyte0, markpos, abyte0, 0, i);

              pos = i;

              markpos = 0;

           } else if (abyte0.length >= marklimit) {

              markpos = -1;

              pos = 0;

           } else {

              int j = pos * 2;

              if (j > marklimit)

                  j = marklimit;

              byte abyte1[] = new byte[j];

              System.arraycopy(abyte0, 0, abyte1, 0, pos);

              abyte0 = abyte1;

           }

       count = pos;

       int k = getInIfOpen().read(abyte0, pos, abyte0.length - pos);

       if (k > 0)

           count = k + pos;

    }

 

    public synchronized int read() throws IOException {

       if (pos >= count) {

           fill();

           if (pos >= count)

              return -1;

       }

       return getBufIfOpen()[pos++] & 255;

    }

 

至于性能问题,我们都知道文件的物理读取性能肯定要大于内存读取,FileInputStream.read()相当于一次物理读取,而BufferedInputStream .read()大部分相当于一次内存读取。

 

 

 

同理FileOutputStreamBufferedOutputStream原理也是一样,也是有个缓冲区,每次write相当于写入缓冲区,当缓冲区慢了后在物理写入文件。

private void flushBuffer()

        throws IOException

    {

        if(count > 0)

        {

            out.write(buf, 0, count);

            count = 0;

        }

    }

 

    public synchronized void write(int i)

        throws IOException

    {

        if(count >= buf.length)

            flushBuffer();

        buf[count++] = (byte)i;

    }

 

 

 

测试

 

public static void bufferTest() throws IOException{

       BufferedInputStream is = new BufferedInputStream(new FileInputStream("d:/A.exe"));

       BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("d:/B.exe"));

       byte[] buffer = new byte[100];

      

       System.out.println("buffer start "+new Date());

       int size = 0 ;

       while((size=is.read(buffer, 0, buffer.length))!=-1){

           out.write(buffer);

       }

       is.close();

       out.close();

       System.out.println("buffer end "+new Date());

    }

   

    public static void ioTest()throws IOException{

       FileInputStream is = new FileInputStream("d:/A.exe");

       FileOutputStream out = new FileOutputStream("d:/C.exe");

       byte[] buffer = new byte[100];

      

       System.out.println("io start "+new Date());

       int size = 0 ;

       while((size=is.read(buffer, 0, buffer.length))!=-1){

           out.write(buffer);

       }

       is.close();

       out.close();

       System.out.println("io end "+new Date());

    }

 

文件大概有1G,用buffer大概用了20秒,用原始方式等了1分钟还没完,直接强制终止。

分享到:
评论
2 楼 benx 2011-12-31  
xuhang1128 写道
可是如果把ioTest方法里面的缓冲区调大,比如和BufferedInputStream里面默认的缓冲区一样大, byte[] buffer = new byte[1024*8];好像速度也差不多啊?咋回事啊


BufferedInputStream的默认缓冲区是8192(4K),说明每次物理读取4K,然后FileInputStream的每次read,如果缓冲区有就从缓冲区读,没有就开始物理读,fill buffer

如果FileInputStream 的read(byte[] buffer) 的buffer大小为8192相当于每次物理读取8192,所以速度和BufferInputStream一致的,因为两个的物理读次数一致。

他们的不同点就是BufferedInputStream如果需要物理读,那么默认一次读取N个数据到buffer,然后以后的每次read(byte b)都是先从buffer读取,buffer没有了就开始物理读。
1 楼 xuhang1128 2011-12-28  
可是如果把ioTest方法里面的缓冲区调大,比如和BufferedInputStream里面默认的缓冲区一样大, byte[] buffer = new byte[1024*8];好像速度也差不多啊?咋回事啊

相关推荐

    java.io包详细解说

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

    解决android读取中文乱码 自动判断文档类型并转码

    在上面的代码中,我们首先使用 FileInputStream 和 BufferedInputStream 来读取文件,然后使用 InputStreamReader 和 BufferedReader 来读取文件的内容。通过判断文件的前三个字节,我们可以自动判断文件的编码格式...

    JavaIO流详解归纳.pdf

    例如,需要一个具有缓冲的文件输入流,则应当组合使用 FileInputStream 和 BufferedInputStream。Java 的 IO 体系分 Input/Output 和 Reader/Writer 两类,区别在于 Reader/Writer 在读写文本时能自动转换内码。 ...

    Java_IO流详解

    例如,需要一个具有缓冲的文件输入流,则应当组合使用 FileInputStream 和BufferedInputStream。 Java 的 IO 体系分 Input/Output 和 Reader/Writer 两类,区别在于 Reader/Writer 在读写文本时能自动转换内码。...

    【Socket通信学习】服务器向客户端传输多文件

    Java的FileInputStream和BufferedInputStream可以帮助我们读取文件,而Socket的getOutputStream()方法返回一个OutputStream,用于将数据发送到客户端。例如: ```java File file = new File("file_to_send.txt"); ...

    JAVA进度条源代码

    在Java中,我们可以使用FileInputStream和BufferedInputStream来读取大文件,同时更新进度条的值。例如: ```java FileInputStream fis = new FileInputStream("large_file.txt"); BufferedInputStream bis = new ...

    JAVA的MPEG播放器.rar_Java 播放器_java mpeg_java播放器_mpeg 播放_mpeg 播放器

    Java的FileInputStream和BufferedInputStream类可用于读取文件内容。 6. **线程管理**:为了实现流畅的播放体验,播放器通常会使用多个线程来处理不同的任务,如解码、渲染等。理解Java的多线程机制对实现高性能...

    JAVA 文件读取示例

    3. **使用FileInputStream和BufferedInputStream** - 对于字节流,我们可以使用`FileInputStream`来读取二进制文件,如图片或音频。同样,`BufferedInputStream`可以提高效率: ```java FileInputStream fis = ...

    Java课程设计:ktv点歌系统源码.zip

    - 音乐资源:系统可能需要读取和播放音乐文件,这涉及IO流操作,如FileInputStream和BufferedInputStream。 - 数据持久化:如果系统支持歌曲列表的保存和加载,那么可能使用了文件或XML进行数据持久化。 6. **...

    QQ+mp3(Java版)

    FileInputStream和BufferedInputStream可以用来读取文件,而音频解码可能需要用到第三方库,如JLayer或Java Sound API。 6. **对象序列化**:为了在网络间传输对象,如用户信息或者聊天消息,Java的对象序列化机制...

    JAVA,JSP做IP查询,JAVA操作qqwry,dat

    首先,我们需要打开并加载qqwry.dat文件到内存中,这可以通过Java的FileInputStream和BufferedInputStream类实现。然后,设计一个查找算法,例如二分查找,因为qqwry.dat中的IP段通常是按顺序排列的。在找到匹配的IP...

    javaprggdcs_java_java游戏_

    这可能涉及到I/O操作,如使用FileInputStream和BufferedInputStream类来高效地读取大文件。同时,还需要考虑如何有效地管理内存,避免资源浪费。 6. **地图坐标设计**: 地图坐标系统是游戏世界的基础,通常使用二...

    比较小工具程序.rar

    在Java中,FileInputStream和BufferedInputStream类常用于读取文件,而HTTP或FTP协议可能用于与服务器进行通信。 2. **文件处理规则**:程序会根据预设的规则对上传的文件进行处理。这可能包括文件的重命名、转换、...

    Java实现的视频播放程序源码

    7. **文件I/O操作**:程序需要读取视频文件,这就涉及到了Java的文件I/O操作,如使用FileInputStream和BufferedInputStream进行高效读取。 8. **音频和视频同步**:在播放过程中,确保音频和视频同步是一项挑战。...

    java重复文件查找

    Java的FileInputStream和BufferedInputStream可以用来读取文件内容,而FileChannel的transferTo()方法可以用于高效地传输大文件。比较文件内容时,可以使用Arrays.equals()方法对比字节数组,或者利用MD5或SHA哈希...

    JAVA版MP3音乐播放器+源代码(初学者)

    Java提供了FileInputStream和BufferedInputStream等类来读取文件内容,它们能够高效地处理大文件,如MP3音乐。 3. **Java音频API**:Java Sound API是Java标准库中的一个部分,用于处理音频数据。它包括了Audio...

    java编写的mp3播放器

    读取MP3文件需要使用Java的I/O流,如FileInputStream和BufferedInputStream,来高效地读取和处理文件内容。 8. **用户界面设计**: 使用JavaFX或Swing库可以创建包含播放/暂停按钮、音量控制器、播放列表等元素的...

    语言程序设计资料:第6章__Java输入与输出.ppt

    过滤器流(FilterStream)是Java I/O中的一个重要概念,它们通常用于扩展或修改已有流的行为,如BufferedInputStream和BufferedOutputStream分别增加了缓冲功能,而PrintStream则提供了格式化的输出。 6.7 对象序列...

    android选择图片或拍照图片上传到服务器(2021修改版,服务器和安卓端打包)

    通常可以使用FileInputStream和BufferedInputStream进行读取。 2. HTTP请求:Android通常使用HttpURLConnection或者第三方库如Retrofit、Volley等发送HTTP请求。这个项目可能使用了POST请求,将图片数据作为二进制流...

Global site tag (gtag.js) - Google Analytics