37.I/O流

Posted luzhanshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了37.I/O流相关的知识,希望对你有一定的参考价值。

1.概述

技术图片

 

 

 2.分类

技术图片

 

 

 3.字节流

技术图片

        /**
         * 创建字节输出流对象,下面的的语句一共做了3件事情:
         * A:调用系统功能,创建了文件
         * B:创建了字节输出流对象
         * C:让字节输出流对象指向创建好的文件
         */
        FileOutputStream outputStream = new FileOutputStream("D:\\abc\\a.txt");
        outputStream.write(97);//将指定的字节写入此文件输出流。
        outputStream.close();//void close?() 关闭此文件输出流并释放与此流相关联的任何系统资源。 

字节流写数据的3种方式

 技术图片

FileOutputStream outputStream = new FileOutputStream("D:\\abc\\a.txt");
        outputStream.write(97);//将指定的字节写入此文件输出流。
        byte []b={97,98,99,100,101};
        //getBytes?() 使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中。
        byte[] bb="qwer".getBytes();//{113,119,101,114}
        outputStream.write(b);
        outputStream.write(b,1,3);
        outputStream.close();//void close?() 关闭此文件输出流并释放与此流相关联的任何系统资源。

补充:换行和追加写入

技术图片

 

 

 FileOutputStream outputStream = new FileOutputStream("D:\\abc\\a.txt",true);
byte[] bb="qwer".getBytes();//{113,119,101,114}
for (int i=0;i<10;i++){
            outputStream.write(bb);
            outputStream.write("
".getBytes());
        }

异常处理

技术图片

        FileOutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream("D:\\abc\\a.txt",true);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            try {
                if (outputStream!=null){
                    outputStream.close();//无论什么时候都要关闭资源
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

字节流读数据

技术图片

一次读取一个字节:

        FileInputStream inputStream =null;
        byte []bbb=new byte[3];
        inputStream = new FileInputStream("D:\\abc\\a.txt");
            int  b=inputStream.read();//返回数据的下一个字节,如果达到文件的末尾,返回 -1 。
            System.out.println(b);//97
            System.out.print((char)b);//a
            //字节流读数据标准代码:
            int by;
            while ((by=inputStream.read())!=-1){
                System.out.print((char)by);
            }    

一次读取一个字符数组长度的数据:

 FileInputStream inputStream = new FileInputStream("D:\\abc\\a.txt");
        byte bb[]=new byte[4];
        int len;//每次实际读取的字节长度
        /**
         * 注意!!!,例如我们的要读取的文档内容是:abcdefghij,一共有10个字节,那么:
         * 第一次读取4个字节:abcd,此时bb[]数组被填充为:{a,b,c,d}
         * 第二次读取4个字节:efgh,此时bb[]数组被填充为:{e,f,g,h}
         * 第三次读取2个字节:ij  ,此时bb[]数组被填充为:{ij,g,h}....
         * 总结:也就是说最后一次读取如果内容长度小于定义的数组长度,那么就会出问题:最后一次读取的内容包含部分上次读取的内容!!!
         */
        while ((len=inputStream.read(bb))!=-1){
            System.out.print(new String(bb));//abcdefghijgh
        }
        /**
         * 所以我们在使用byte[]创建字符串的时候只截取实际读取长度的内容转换成字符串就可以避免发生上面的错误了:
         * String?(byte[] bytes, int offset, int length) 通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。  
         */
        byte b[]=new byte[1024];//一般都是1024或者1024倍数
        int lengh;//每次实际读取的字节长度
        while ((lengh=inputStream.read(b))!=-1){
            System.out.print(new String(b,0,len));
        }

案例:复制图片

FileOutputStream outputStream = new FileOutputStream("D:\\abc\\火灾.png");
FileInputStream inputStream = new FileInputStream("D:\\abc\\火.png");
 byte b[]=new byte[1024];//一般都是1024或者1024倍数
        int lengh;//每次实际读取的字节长度
        while ((lengh=inputStream.read(b))!=-1){
            outputStream.write(b,0,lengh);//注意,这里读取多少写出多少
        }

 

以上是关于37.I/O流的主要内容,如果未能解决你的问题,请参考以下文章

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

此应用小部件片段中所有意图 (PendingIntents) 的逻辑流

是否可以动态编译和执行 C# 代码片段?

从流输入中解析没有根元素的 XML 片段列表

16个必备的JavaScript代码片段

条件片段和导航重用