`
noble510520
  • 浏览: 56920 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

初识字节流+实现缓冲字节流

 
阅读更多

java中的IO流可以分为两种:字符流和字节流
字符流,顾名思义,就是对字符进行操作,只能操作文本文件
字节流,就是对字节进行操作,然而所有文件都是由字节组成的,可以字节流可以操作一切文件
字符流中的两个大类:Reader和Writer
详情可见 http://blog.csdn.net/noble510520/article/details/50083555 简单的Writer和Reader
字节流中也同样有两个大类:InputStream和OutputStream
又“读进来,写出去”,所以InputStream对应着Reader,OutputStream对应着Writer
字节流和字符流有很多相像的地方,区别就是字节流操作字节,字符流操作字符


OutputStream

OutputStream的主要方法

构造方法

以FileOutputStream为例
FileOutputStream(String file)
FileOutputStream(File file)
FileOutputStream(String file,boolean append)
FileOutputStream(File file,boolean appeand)
后面两种方法用于判断是否需要续写,前面两个方法是直接覆盖文件

write(int charnum)
write(byte[] array)
write(byet[] array,int off,int len)写出array中角标从off开始的len个元素

刷新

flush()
close()


InputStream

构造方法

照惯例,以FileInputStream为例
FileInputStream(String filename)
FileInputStream(File filename)
如果filename.exists==false||filename.isFile()==false的话,那么会抛出FileNotFoundException

read():int
read(byte[] array):int
与Reader类一样,如果到了文件末尾,返回-1
这里有个特别好用的方法,可以用来知道文件的大小
available():int; 返回文件的字节数
这时就可以用这个方法来定义array的大小,那么就可以一次性读完了

关流

flush()


缓冲技术

缓冲技术就是把信息分批处理,再一起丢出去,这样处理速度会快很多!!
下面实现一下缓冲技术

实现BufferedInputStream

package mypackage;
import java.util.*;
import java.io.*;
public class MyBufferedInputStream {
    private InputStream input;
    private int index=0;
    private byte[] array;
    private int len=0;  
    //默认分配一个100b的缓冲空间
    public MyBufferedInputStream(FileInputStream input){this(input,1024*100);}
    public MyBufferedInputStream(FileInputStream input,int size){
        this.input=input;
        array=new byte[size];
        }
    public int read()throws IOException{
        if(len==0){
            index=0;
            if((len=input.read(array))==-1){return -1;}
            }
        len--;
        return (array[index++]&255);//防止出现读到11111111此时错误的返回了-1
        }
    //重载read
    public int read(byte[] bytes)throws IOException{
        int i;
        int index=0;
        while((i=read())!=-1){
            bytes[index]=(byte)i;
            }
        return index+1;
        }
    public void close()throws IOException{input.close();}
    }

实现BufferedOutputStream

package mypackage;
import java.util.*;
import java.io.*;
public class MyBufferedOutputStream{
    private OutputStream output;
    //默认分配一个100b的缓冲空间
    public MyBufferedOutputStream(FileOutputStream output)throws IOException{this(output,1024*100);}
    public MyBufferedOutputStream(FileOutputStream output,int size)throws IOException{
        this.output=output;
        buf=new byte[size];
        }
    //建一个输入,让写进来的数据先存在里面,最后再一起放出去
    protected byte[] buf;
    private int index=0;
        public void write(byte[] bytes)throws IOException{
            for(int i=0;i<bytes.length;){
                buf[index++]=bytes[i++];
                if(index==buf.length){
                    index=0;
                    output.write(buf);
                    this.flush();
                    buf=new byte[buf.length];
                    }
                }
            }
    //重载write
    public void write(int bytes)throws IOException{
        if(index<buf.length){buf[index++]=(byte)bytes;}
        else{
            output.write(buf);
            output.flush();
            buf=new byte[buf.length];
            index=0;
            buf[index++]=(byte)bytes;
                }
            }
    public void close()throws IOException{output.flush();output.close();}
    public void flush()throws IOException{output.flush();}
    }

下面复制一个11.1M的MP3格式测试一下效果

import java.io.*;
import mypackage.*;
class Test{
    public static void main(String[] agrs)throws IOException{
        long begin=System.currentTimeMillis();
        FileInputStream fi=new FileInputStream("D:\\CloudMusic\\薛之谦 - 一半.mp3");
        FileOutputStream fo=new FileOutputStream("D:\\CloudMusic\\一半1.mp3");
        MyBufferedInputStream bi=new MyBufferedInputStream(fi);
        MyBufferedOutputStream bo=new MyBufferedOutputStream(fo);
        int bytes;
        byte[] array=new byte[1024*100];
        while((bytes=fi.read(array))!=-1){
            bo.write(array);
            }
        bo.close();
        bi.close();
        long end=System.currentTimeMillis();
        System.out.println("复制所用时间:"+(end-begin)+"毫秒");
        }
    }

下面是结果

C:\Users\钟绍威\Desktop>java Test
复制所用时间:183毫秒

用Java自带的BufferedInputStream和BufferedOutputStream试试

import java.io.*;
class Demo{
    public static void main(String[] args)throws IOException{
        long begin=System.currentTimeMillis();
        FileInputStream fi=new FileInputStream("D:\\CloudMusic\\薛之谦 - 一半.mp3");
        FileOutputStream fo=new FileOutputStream("D:\\CloudMusic\\一半1.mp3");
        BufferedInputStream bi=new BufferedInputStream(fi);
        BufferedOutputStream bo=new BufferedOutputStream(fo);
        byte[] a=new byte[1024*8];
        for(int i;(i=bi.read(a))!=-1;){
            bo.write(a);
            }

        bo.close();
        bi.close();
        long end=System.currentTimeMillis();
        System.out.println("复制所用时间:"+(end-begin)+"毫秒");
        }
    }

下面是结果

C:\Users\钟绍威\Desktop>java Demo
复制所用时间:117毫秒

Tips:用write(byte[])会比write(int)快得多多
输入的缓冲就是先把数据存在数组中,从数组中一个个读到控制台
输出的缓冲就是把数据存到数组中,再一起写到OutputStream中的缓冲区,最后在刷新

刚刚用这个复制一个11.1M的MP3花了0.6秒,和系统的时间差不多↖(^ω^)↗!!


错误的返回了-1

如果扫描到了11111111那么此时将byte->int是-1,如果这样的话,程序就会终止不会进行

为什么read()返回的是Int型而不是byte型呢??

1int=4byte
那么11111111转为Int就是11111111 11111111 11111111 11111111 还是等于-1
所以为了防止出现这个情况,就只保留后面八位,前面用0去补
于是乎11111111&255

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    人教版二年级(上册)汉字+笔顺+识字带拼音+练习word版.doc

    人教版二年级(上册)汉字+笔顺+识字带拼音+练习word版.doc

    麦田识字(儿童识字软件)

    《麦田识字:儿童识字软件的教育创新与应用》 在当今信息化时代,儿童教育也与时俱进,融入了更多的科技元素。"麦田识字"是一款专为儿童设计的识字软件,它以生动活泼的方式,帮助孩子们轻松掌握汉字,开启他们的...

    0-5岁幼儿认字识字教育开发系统,java展示幼儿园小朋友学习方案代码.docx

    在当今社会,早教的重要性日益凸显,特别是在0-5岁这一关键成长阶段,幼儿大脑发育迅速,学习能力超群,因此这一时期对于幼儿认字识字的教育开发尤为重要。一款名为“0-5岁幼儿认字识字教育开发系统”的软件,以Java...

    2018新人教版一年级语文下册生字拼音注音练习(识字+生字)大全.docx

    2018新人教版一年级语文下册生字拼音注音练习(识字+生字)大全.docx

    直映认字识字卡片.doc

    《直映认字识字卡片.doc》是一份旨在帮助用户快速学习和记忆汉字的系统化学习资源文档。这份文档不仅包含了丰富的字词内容,还涵盖了汉字认字、学习策略、教育心理学、教学资源以及汉字应用等多个方面的知识,为我们...

    基于Python实现识字软件(源码+exe程序).rar

    《基于Python实现识字软件的深度解析》 Python作为一种强大且易学的编程语言,广泛应用于各个领域,包括教育软件的开发。本压缩包提供的"基于Python实现识字软件(源码+exe程序)"就是一个典型的例子,它揭示了如何...

    悟空识字儿童识字工具

    "悟空识字"的设计初衷是为了让孩子能够多认字,并轻松愉快地完成这一学习过程。通过科学的教学方法,比如分阶段教学、字形分析和字义解释,儿童可以逐步构建起汉字的基本知识框架。而应用中可能采用的将汉字拆分成部...

    截图识字工具(简单好用的OCR识字工具)

    “识字工具”和“OCR识字”进一步强调了它的主要功能,即通过OCR技术实现文字识别。 压缩包内的“天若OCR文字识别.exe”是该软件的可执行文件,用户可以通过运行这个程序来启动和使用软件。而“天若OCR文字识别.txt...

    毕设论文--能智型幼儿识字网站的设计与实现.doc

    《智能型幼儿识字网站的设计与实现》 在当今信息化社会,互联网技术的快速发展为儿童教育带来了新的机遇。本文主要探讨了如何设计并实现一个针对幼儿的智能识字网站,旨在利用科技手段提升幼儿的汉字学习效果。这篇...

    部编版 (五四制)一年级上册语文 识字加油站+我的发现(教案).doc

    而通过具体的评价任务,教师可以有效地检验学生对新知识的掌握程度,及时调整教学方法,确保教学目标得以实现。 整个教学过程,教师始终注重引导学生感受汉字的美感和文化内涵,通过各种方式让学生在学习中体验到...

    ssm基于Java的幼儿早教系统软件的设计与实现.zip

    详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结。 包括程序毕设程序源代码一份,数据库一份,完美运行。配置环境里面有...

    悟空识字软件 孙悟空识字 孙悟空识字

    悟空识字软件 通过动漫 故事 让孩子引发学习兴趣 不断提高识字能力

    熊猫识字幼儿识字软件

    熊猫识字幼儿识字软件是一款可以帮助幼儿进行识字辨认的强大软件,下载使用熊猫识字免费版可以让您体验到最方便最便捷的识字体验,马上下载熊猫识字破解版进行操作使用吧。

    Delphi汉字识字软件完整版..rar

    总的来说,使用Delphi开发汉字识字软件,不仅可以发挥其高效开发的优势,还能借助丰富的组件和库实现各种教育功能,为孩子们提供寓教于乐的学习体验。通过深入理解和灵活运用Delphi,我们可以创造出更多高质量的教育...

    悟空识字,幼儿识字软件

    在中国的传统教育理念中,识字是基础教育的基石,而对于3至8岁的儿童来说,这一阶段是学习汉字的黄金时期。在这个阶段,儿童的学习能力与模仿能力都处于飞速发展的阶段,因此,选择合适的教育工具至关重要。此时,一...

    双捷识字写字宝软件v1.3.5中文官方安装版

    双捷识字写字宝软件是一款非常好用且功能强大的儿童识字写字软件,双捷识字写字软件填补了该类儿童识字软件仅能在电视或者电脑上演示的空白,软件功能丰富,可以支持...让孩子科学识字,从识字第一天起就规范认字、规范

    VB 多媒体识字卡

    8. **教学策略**:多媒体识字卡不仅要技术实现,还需要结合有效的教学方法,如记忆曲线理论、分组学习、游戏化学习等,以提高学习效果。 9. **错误处理**:良好的错误处理机制可以提高软件的稳定性和用户体验。在VB...

    易语言源码识字连连看.rar

    在这款“识字连连看”源码中,我们可以看到易语言如何用于实现游戏逻辑和用户界面交互。 1. **事件驱动编程**:易语言采用事件驱动模型,即程序运行依赖于用户的操作或系统事件。例如,在连连看游戏中,点击、匹配...

    看图识字小程序源码.zip

    2. **图片识别技术**:为了实现看图识字的功能,小程序可能集成了图像识别技术,例如OCR(Optical Character Recognition),这种技术可以将图像中的文字提取出来,转化为可编辑的文字数据。常见的OCR服务提供商有...

    智能型幼儿识字网站的设计与实现毕业论文.doc

    智能型幼儿识字网站的设计与实现毕业论文.doc

Global site tag (gtag.js) - Google Analytics