黑马程序员-笔记-09-IO字节流

来源:互联网 发布:js定义字符串数组 编辑:程序博客网 时间:2024/05/23 01:09

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

 java字节流:InputStream,OutputStream
字符流在处理文本时,更加迅速,但是处理一些二进制数据时,则会造成内容的错误。这是需要使用等到字节流。来操作。 
一个例子列举字节流的使用。 

public class Play27 {/*** 字节流:InputStream OutputStream*/public static void main(String[] args) throws IOException {     //writeFile();     //readFile();    long start = System.currentTimeMillis();    copyImage();    long end = System.currentTimeMillis();    System.out.println(end - start);}public static void readFile() throws IOException {    FileInputStream fis = new FileInputStream("test.txt");    int num = fis.available();// 获得文件的字节数。    System.out.println(num);     // int ch =0;//注意字节流为什么返回值不是字节,而是int型    // while((ch=fis.read())!=-1){//一次只读取一个字节的方法。    // System.out.println((char)ch);    // }    //byte[] buf = new byte[num];// 定义一个缓冲区,大小刚好等于文件大小,不用循环。    //fis.read(buf);    //System.out.println(new String(buf));     byte[] buf = new byte[3];//定义一个缓冲区。    int length =0;    while((length=fis.read(buf))!=1)//一次将缓冲区读满。如读完则返回空。    System.out.println(new String(buf,0,length));    fis.close();}public static void writeFile() throws IOException {    File file = new File("test.txt");    System.out.println(file.getAbsolutePath());    FileOutputStream fos = new FileOutputStream(file);    fos.write("test,中国".getBytes());// 字节流不用刷新。需要将String转换为字节数组。    fos.close();}    //使用字节流实现图片的复制。public static void copyImage() {    FileOutputStream fos = null;    FileInputStream fis = null;    try {        fos = new FileOutputStream("test001.jpg");        fis = new FileInputStream("test.jpg");        byte[] buf = new byte[3];        int num = 0;        while ((num = fis.read(buf)) != -1) {         System.out.println(new String(buf,0,num));        fos.write(buf, 0, num);        }    } catch (Exception e) {    } finally {            if (fos != null) {            try {            fos.close();            } catch (Exception e) {            } finally {                    if (fis != null) {                            try {                                    fis.close();                                    } catch (Exception e) {                                }                        }                    }                }            }}    //java带缓冲的字节流, 其功能不再赘述。public static void copyImageBuf() throws IOException{FileOutputStreamfos = new FileOutputStream("test1.jpg");FileInputStream fis = new FileInputStream("笑尿1.jpg");BufferedInputStream bis = new BufferedInputStream(fis);BufferedOutputStream bos = new BufferedOutputStream(fos);int b = 0;while((b=bis.read())!=-1){bos.write((char)b);}bis.close();bos.close();}} /** *  * 装饰类完成BufferedInputStream * 缓冲功能是如何实现的。 */class MyBufferedInput{    private InputStream input;    private int num,count;    private byte[] buf = new byte[1024];    public int myRead() throws IOException{        if(count==0){            num=0;            count = input.read(buf);            if(count<0)                return -1;            byte b = buf[num];            count -- ;            num++;            return b&255;//为什么返回值要返回b&255,/** b为byte型,因为最后要返回一个-1来判断,是否将文件读到最后,所以返回int型。* 这样就有一个问题:* 如果文件中恰好有一个字节的二进制:11111111,这个值转换成int恰好是-1,这样其实* 并没有读到文件的末尾,系统就返回-1,导致最后判断失败。* 避免这个问题,就需要让返回值在返回的时候,byte-->int,在前面的位置上补为禁止的时候,不补一,而是补零* 这样他的返回值就是255,从而可以避免,b&255就是这个操作。* * 从byte-->int,是将八位二进制转换为三十二位的过程,那么这样岂不是把文件变大了,的确,但是,OutputStream* 的write方法,有一个自动取最后八位的做法,所以,并没有影响。*/        }else if(count >0){                    byte b = buf[num];//带缓冲的流,一次独处一定数目的字节,你每次去读的时候,他是缓冲部分取出来,降低了每次读出的时间。                    count -- ;                    num++;                    return b&255;            }    return -1;    }}


原创粉丝点击