I/O流总结

一,I/O流概述

I/O流简单的理解就是数据的输入与输出;那数据的的输入与输出又怎么理解呢?

首先我们知道,所有的数据在计算机中都是以二进制的形式存储的.我们看到的字节或者字符形式的文件都是计算机经过解析之后形成的.

那么数据的输入与输出简单地说,就是我们向计算机(通信设备)存数据和取数据的方式,这种方式包括两种,一种是字节形式的存取,一种是字符形式的存取.

那什么时候用字节,什么时候用字符呢?这是我们今天讨论的重点.

二,I/O流的体系(字符流)

如图:

  

 



I/O流的体系非常之庞大.但是我们从体系的顶层向下看的话,其实还是很好掌握的;

    1)我们从体系图中可以看出

    I/O流按照输入和输出来分就是:
            输入流:
                    字节输入流:InputStream
                    字符输入流:Reader
            输出流:
                    字节输出流:OutputStream
                    字符输出流:Writer
                
    2)了解的内容:
        
            当处理纯文本内容时,建议使用字符流;
            
            当处理图像,音频文件时,使用字节流;
            
三,体系解析:

    3.1 字符流操作文本文件:
    
    示例1:向计算机硬盘中写入些文字;
    
    import java.io.FileWriter;
    import java.io.IOException;
    public class FileWriterDemo {
        //因为考虑到不同系统的的换行符号不一致,所以我们直接调用系统的换行设置
        private static final String LINE_SEPARATOR = System.getProperty("line.separator");

        public static void main(String[] args) throws IOException {        
        //注意当我这里后面不加true的话,表示多次向文件添加内容是,内容无法追加,每写一次都会把上次的内容覆盖掉;
        FileWriter fw=new FileWriter("E:\\IO测试\\demo.txt",true);

        fw.write("Hello World"+LINE_SEPARATOR+"I LOVE JAVA");
                
        fw.write(LINE_SEPARATOR+"pierce");
        //注意要刷新,否则,无法写入内容(前提是流没有关闭)    
        fw.flush();
        //关闭流通道;
        fw.close();
                
        }
}

    //注意:
            关闭流,必须先刷新此流,一旦关闭后,就不能再写数据,和调用flush方法;
            假如,我在fw.close()后面,在写一个fw.write("Hello");会报错;
            
    示例二:从计算机指定文件读取数据,输出在控制台上;
    
    方式一:一次读取单个字符的方式,读取文件
    
        import java.io.FileReader;
        import java.io.IOException;

    public class FileReaderDemo {
        
        public static void main(String[] args) throws IOException {
            //创建一个要读取的文件对象
            FileReader fr=new FileReader("E:\\IO测试\\demo.txt");
            //定义一个变量,用于存储每次读到的那个字符对应的数字
            int ch=0;
            //每次读一个,读到文件末尾时,返回一个-1,表示文件已经读取完毕;
            while((ch=fr.read())!=-1){
            //将每次读到的一个字符输出
            System.out.print((char)ch);
            }
        //关闭流通道;
        fr.close();
    }
}

    方式二: 一次读取多个字符的方式,读取文件
    
    import java.io.FileReader;
    import java.io.IOException;

    public class FileReaderDemo2 {
    public static void main(String[] args) throws IOException {
        //创建一个要读取的文件对象
        FileReader fr=new FileReader("E:\\IO测试\\demo.txt");
        //创建一个字符数组,用于存储每次读到的数据
        char []ch=new char[1024];//注意这里统一使用计算机的千字节数的整数倍
        //读到文件末尾的标记;
        int len=0;
        while((len=fr.read(ch))!=-1){
            //最后一次只需读取有效数据即可
            System.out.println(new String(ch,0,len));
        }
    }
}
    
    方式三,使用高效缓冲流,向文件中写数据;
    
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;

    public class BufferWriterDemo {

        public static void main(String[] args) throws IOException {
            //目标对象
            FileWriter fw=new FileWriter("D:\\demo.txt");
            //
            BufferedWriter bw=new BufferedWriter(fw);
            
            for (int i = 0; i < 4; i++) {
                bw.write("嘻嘻");
                //BufferedWriter的自有换行操作
                bw.newLine();
                
                bw.flush();
            }
            bw.close();
        }
}
    

        方式四:使用高效率流从文件中读取数据;
        import java.io.BufferedReader;
        import java.io.FileNotFoundException;
        import java.io.FileReader;
        import java.io.IOException;

    public class BufferReaderDemo {
        public static void main(String[] args) throws IOException {
            FileReader fr=new FileReader("D:\\demo.txt");

            BufferedReader br=new BufferedReader(fr);    
            //定义一个变量,用于存储每次读到一行数据;
            String line=null;    
            //当读到文件末尾时,返回null,就结束读取操作
            while((line=br.readLine())!=null){
                System.out.println(line);
            }
        }
    }
    
    我们已经学会了上面的五中操作方法,都是单方向的操作文件;下面我们来复制一个文件到指定路径下;
    
    案例:复制文件操作:
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;

public class BufferedTest_CopyFile {
        public static void main(String[] args) throws IOException {
            
            FileReader fr=new FileReader("D:\\demo.txt");
            
            BufferedReader br=new BufferedReader(fr);
            
            FileWriter fw=new FileWriter("E:\\T.txt");
            
            BufferedWriter bw=new BufferedWriter(fw);
            
            String line=null;
            //读一行写一行
            while((line=br.readLine())!=null){
                bw.write(line);
                bw.newLine();
                bw.flush();
                
            }
            //当然,我们也可以一个字节,一个字节的读,或者每次读一个数组长度的方式去读取文件;
            /*
            *  单字符读取的1方式;
            *    int ch=0;
            *    while((ch=br.read())!=-1){
            *    bw.write(ch);
            *    }
            */
            //读
            /*    char []char=new char[1024*4];
            *    int len;
            *    while((len=br.read(char))!=-1){
            *    bw.write(char,0,len);
            *    bw.flush();
            *    }
            */
            bw.close();
            br.close();
            
    读取文件时,I/O流异常的处理方式:

    import java.io.FileWriter;
    import java.io.IOException;

    public class IOExceptionDemo {
        private static final String LINE_SEPARATOR = System.getProperty("line.separator");
        public static void main(String[] args) {
            FileWriter fw =null;//在try外面声明引用型变量,再处理异常时再初始化变量;
            try {
                fw = new FileWriter("E:\\IO测试\\demo.txt",true);
                
                fw.write("Hello World"+LINE_SEPARATOR+"I LOVE JAVA");
                
                fw.write(LINE_SEPARATOR+"pierce");
                
                fw.flush();        
                    
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                    if(fw!=null)//如果写入过程中,出现意外,也要关闭流通道;
                    try {
                        fw.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        throw new RuntimeException("关闭失败..");
                    }
                }    
    }
}
            
    //下面我们看下一个有趣的流:LineNumberReader,它可以拿到每一行文字对应的行号:
     //跟踪行号的缓冲字符输入流
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.LineNumberReader;

    public class LineNumberReaderDemo {
        public static void main(String[] args) throws IOException {
            FileReader fr=new FileReader("D:\\d.txt");
            
            LineNumberReader inr=new LineNumberReader(fr);
            
            String line=null;
            
            while((line=inr.readLine())!=null){
                
                System.out.println(inr.getLineNumber()+":"+line);
            }
            inr.close();
    }
}
    3.2)转换流操作:

        import java.io.BufferedReader;
        import java.io.BufferedWriter;
        import java.io.IOException;
        import java.io.InputStreamReader;
        import java.io.OutputStreamWriter;

        public class TransStreamDemo2 {
            public static void main(String[] args) throws IOException {
                //字节流
                //InputStream in=System.in;
                //字节转换为字符的桥梁,转换流;
                //InputStreamReader isr=new InputStreamReader(in);
                
                //字符流;
                //BufferedReader br=new BufferedReader(isr);
                    
                //OutputStream out=System.out;
                
                //OutputStreamWriter osw=new OutputStreamWriter(out);
                
                //BufferedWriter bw=new BufferedWriter(osw);
                
                BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
                BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
                //    BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\insert.txt")));    
                String line=null;
                while((line=br.readLine())!=null){            
                    if("over".equals(line))                
                        break;        
                    bw.write(line.toUpperCase());
                    bw.newLine();
                    bw.flush();
                }
    }
}
            
            /*
             * 如果操作文本需要明确具体的编码,必须要转换流
             *
             * */
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;


    public class TransStreamDemo4 {
        public static void main(String[] args) throws Exception {
                readText2();
        }
        
        
        
        private static void readText2() throws Exception, IOException {
            InputStreamReader fr=new InputStreamReader(
                    new FileInputStream("D:\\u8_1.txt"), "UTF-8");
            char []ch=new char[10];
            int len=fr.read(ch);
                String str=new String(ch,0,len);
                System.out.println(str);
                fr.close();
            
        }



        private static void readText3() throws Exception {
            FileReader fr=new FileReader("D:\\u8_1.txt");
            char []ch=new char[10];
            int len=fr.read(ch);
                String str=new String(ch,0,len);
                System.out.println(str);
                fr.close();
            
            
        }



        private static void writeText3() throws IOException, FileNotFoundException {
        OutputStreamWriter osw=new OutputStreamWriter(
                new FileOutputStream("D:\\u8_1.txt"), "UTF-8");
                                    osw.write("小明");
                                    osw.flush();
                                    osw.close();
        }



        private static void writeText2() throws  Exception {
            OutputStreamWriter fw=new OutputStreamWriter(
                    new FileOutputStream("D:\\gbk_1.txt"), "GBK");
            
                                fw.write("小明");
                                fw.flush();
                                fw.close();
        }



        private static void writeText() throws IOException {
            // TODO Auto-generated method stub
            FileWriter fw=new FileWriter("D:\\gbk_1.txt");
            //FileWriter其实就是转换流制订了本机默认编码表的体现,可以更好的操作文本;
            
            /*
             * 如果操作文本需要明确具体的编码,必须要转换流
             *
             * */
            
            fw.write("小明");
            fw.flush();
            fw.close();
        }
}        
            
    流的操作规律;
        自所以要弄清楚这个规律,是因为流的对象太多,开发时不知道用那个对象合适;

        想知道开发时用到哪些对象,只要通过四个明确即可;
        1,明确源和目的地;(汇)

            源:InputStream  Reader;
            目的: OutputStream Writer

        2,明确数据是否是纯文本数据;

            源:是:纯文本:Reader
               否: InputStream
            目的: 是纯文本:Writer
               否: OutputStream

        到这里就可以明确需求中具体要使用那个体系;

        3,明确具体设备;

            源设备:
                硬盘:File
                键盘:System.in
                内存:数组
                网络:Socket流

            目的设备:
                硬盘:File
                键盘:System.in
                内存:数组
                网络:Socket流
        4,是否需要其他额外功能.

            1,是否需要高效(缓冲区);
                是:buffer

        需求:

        1,复制一个文件:
            1,明确源和目的:
                源:InputStream  Reader;
                目的:outputStream  Writer;
            2,是否为纯文本:
                是:Reader;
                目的:Writer;
            3,明确设备:
                源:
                硬盘:File
                目的:
                硬盘:File
            FileReader fr=new FileReader("a.txt");
            FileWriter fw=new FileWriter("b.txt");

            4,是否需要额外功能,
            需要:
            BufferedReader br=new BufferedReader(new FileReader("a.txt"));
            BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));

        需求:读取键盘录入信息,并写入到一个文件中;

        1,明确源和目的.
            源:InputStream Reader;
            目的:OutputStream Writer;
        2,是否是纯文本:
            是;
            源:Reader
            目的:Writer;
        3,明确设备;
            源:
                键盘:System.in
            目的:


                硬盘:File
            InputStream in=System.in;
            FileWriter fw=new FileWriter("b.txt");
            这样做可以实现,但是麻烦,将读取的字节转换成字符串,再有字符流操作;
        4,需要额外功能吗?
            需要;转换;
            InputStreamReader isr=new InputStreamReader(new InputStreamReader(System.in));
            

        需求3;将一个文本文件数据显示在控制台上;
        1,明确源和目的.
            源:InputStream Reader;
            目的:OutputStream Writer;
        2,是否是纯文本:
            是;
            源:Reader
            目的:Writer;
        3,明确设备;
            源:
                硬盘:File
            目的:
                控制台:System.out

        FileReader fr=new FileReader("a.txt");
        OutputStream out=System.out;

        4,需要额外功能吗?
            需要;转换;
            FileReader fr=new FileReader("b.txt");
            OutputStreamWriter osw=new OutputStreamWriter(System.out);

            需要高效:
            BufferedReader br=new BufferedReader(new FileReader("b.txt"));
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));

        ==================================================================
        4,读取键盘录入数据显示在控制台上;
        1,明确源和目的.
            源:InputStream Reader;
            目的:OutputStream Writer;
        2,是否是纯文本:
            是;
            源:Reader
            目的:Writer;
        3,明确设备;
            源:
                键盘:System.in
            目的:
                控制台:System.out

            inputStream in=System.in;
            OutputStream out=System.out;

        4,额外功能?
        需要;
            需要转化,因为都是字节流,但是操作的确实文本数据.
            所以使用字符流操作起来更为便捷;

            InputStreamReader isr=new InputStreamReader(System.in);
            OutputStreamWriter osw=new OutputStreamWriter(System.out);

            为了高效,
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(Sstem.out);
        //本人刚入门菜鸟一枚,这些都是自己整理的资料,感觉I/O流体系太过于庞大,学了一些最常用的流操作方法,其他的流操作日后有时间在整理

  //以供大家参阅

转载于:https://www.cnblogs.com/pierceming/p/8711857.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机显示原理

▌一&#xff0e;接口LCD1602是很多单片机爱好者较早接触的字符型液晶显示器&#xff0c;它的主控芯片是HD44780或者其它兼容芯片。与此相仿的是LCD12864液晶显示器&#xff0c;它是一种图形点阵显示器&#xff0c;能显示的内容比LCD1602要丰富得多&#xff0c;除了普通字符外&…

Overview of ISA and TMG Networking and ISA Networking Case Study (Part 2)

老方说&#xff1a;此篇文章摘自ISASERVER.ORG网站&#xff0c;出自Thomas Shinder达人之手。严重建议ISA爱好者看看。Published: Dec 16, 2008 Updated: Jan 21, 2009 Author: Thomas Shinder In our last article . ISA and TMG firewall networking, I talked about how I…

WIN10 vagrant和virtualbox虚拟机和一键搭建lnmp环境配置thinkphp虚拟主机

版本:win10系统  virtualbox:5.1.26  vagrant :1.9.7  centos 7.0  xshell/git 首先下载好对应版本的软件 配置vagrant和virtualbox 一.把虚拟机加载到box容器中 vagrant box add CentOs7.0 D:\soft\Vagrantfile\package.boxCentOs7.0 是给虚拟机起的名字 D:\soft\Vagr…

Linux 驱动开发 | 驱动世界里的宏伟建筑

哈喽&#xff0c;我是老吴。是否每一个上进的人都会觉得自己还可以再努力一点&#xff1f;事情到了最后&#xff0c;只要没达成目的&#xff0c;总能把失败的原因归为 "没有再努力一点"。但是&#xff0c;对努力的最大错误认知就是&#xff1a;时间越长&#xff0c;过…

【乡音】海安话四级考试

海安话四级考试海安话国家四级考试试卷-------------启用前★绝密------------&#xff08;中国标准话语言研究中心命题&#xff09; 准考证号___________ 姓名_____________ 座位号___________ 一、选择题&#xff08;共五题&#xf…

POJ1179 Polygon 【例题精讲】

题意&#xff1a;多边形游戏是一个单人玩的游戏&#xff0c;开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值&#xff0c;每条边被赋予一个运算符“”或“*”。所有边依次用整数从1到n编号游戏第1步&#xff0c;将一条边删除随后n-1步按以下方式操作(1)选择一条边…

学模拟电路的神器everycircuit

之前转的几篇文章&#xff0c;大家对里面的软件非常感兴趣&#xff0c;所以就给你们找来了&#xff0c;这是一个仿真软件。▌官网https://everycircuit.com/▌视频介绍&#xff0c;视频是老外的比如&#xff0c;你想仿真一个555定时器▌手机上也可以用&#xff0c;可以在我刚才…

我也想再上个学

关注我的同学应该知道&#xff0c;我不止在一次告诉大家读书是可以让大家能有更多的机会的&#xff0c;有时候自己也想什么时候再深造一下&#xff0c;等楠哥不那么需要我了&#xff0c;我也不用那么努力赚钱了&#xff0c;再去读读书&#xff0c;在学校里面打打篮球&#xff0…

使用GenerateDriverDiskISO无需软驱安装WINDOWS操作系统

转自&#xff1a;[url]http://bbs.wuyou.com/viewthread.php?tid121630&extra&page1[/url]附件中有详细文章内容及GenerateDriverDiskISO.RAR下载作者: lookskyoo 时间: 2008-3-5 11:19 标题: &#xff3b;chenhall找到最好的解决方案&#xff3d;自认为最好的…

ESP32搞的NES游戏掌机

本文转自立创开源硬件平台作者&#xff1a;micespring原文链接&#xff1a;https://oshwhub.com/micespring/esp32-nesemu▌简介一个基于ESP32制作的开源游戏掌机&#xff0c;可以运行标准的NES&#xff08;日版为FC&#xff09;游戏&#xff0c;支持单声道音频。让你随时回味儿…

Matplotlib从文件绘图时Y轴坐标不正确

问题描述&#xff1a; 从文件中读取X坐标和Y坐标&#xff0c;绘制折线图&#xff0c;代码和结果如下&#xff1a; import matplotlib.pyplot as plt import matplotlib.animation as animation from matplotlib import stylestyle.use(dark_background)fig plt.figure()graph_…

全球最囧的爱情测试.....

据说这是全球最准的爱情测试&#xff1a;http://love.xf001.com/?uid224632 。。。。。。。。。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。…

回答嵌入式初学者的一些问题

如图&#xff0c;最近类似的提问很多&#xff0c;上周末&#xff0c;刚打球回来&#xff0c;跟一起刚工作的同学聊了一个晚上。要知道&#xff0c;一个晚上的时间我可以做很多事情&#xff0c;可以玩好多局王者荣耀&#xff0c;可以看很多论坛的资料。但是我愿意花费时间在他身…

什么是RAC定位?

笔者因为工作原因&#xff0c;接触到一种叫做RAC的定位产品&#xff0c;该定位产品不同于一般的定位模组&#xff0c;它产品外表看起来很像一个GPS定位天线&#xff0c;通过一个4芯线缆&#xff08;供电串口通信&#xff09;直接和其它MCU/CPU 相连接&#xff0c;输出定位信息。…

15个有趣的555电路,没事可以自己做一做

NE555几乎是一个非常常见的一个芯片&#xff0c;在很多的电器里都能看到它的身影&#xff0c;本文为大家总结了一些有趣的NE555电路。013*3*3光立方02激光射线03金属探测器04音乐盒05电子转盘06舵机测试器07反应计时器08高压发生器09触摸开关10交通信号灯11电视信号干扰器12自行…

使用ABAP和JavaScript代码生成PDF文件的几种方式

ABAP 方法1&#xff1a;使用ABAP Adobe Lifecycle Enterprise Service 详细步骤参考我的博客Convert word document into PDF via Adobe Livecycle Enterprise service 方法2&#xff1a;使用ABAP Webdynpro里的InteravtiveForm控件 Adobe Form Template 详细步骤参考我的博客…

Configuration Manager 纯模式所需的 PKI 证书的分步部署示例

Configuration Manager 纯模式所需的 PKI 证书的分步部署示例&#xff1a;Windows Server 2008 证书颁发机构此分步示例部署使用 Windows Server 2008 证书颁发机构 (CA)&#xff0c;提供一些过程以指导您完成创建和部署 Configuration Manager 2007 在纯模式下操作所需的公钥基…

周琦能和范志毅比高下?

在最新的直播中&#xff0c;徐静雨就专门谈到了周琦与范志毅的对比&#xff0c;他先是举例乒乓球界的张继科与篮球界的姚明对比&#xff0c;张继科在乒乓球界的成就要远高于姚明&#xff0c;但是姚明的影响力却是张继科无法比较的。而在篮球界与足球界的对比中&#xff0c;他明…

[原创]C/C++语言中,如何在main.c或main.cpp中调用另一个.c文件

C/C语言中&#xff0c;如何在main.cpp中调用另一个.c文件主要有5种思路&#xff1a; 1、在VS2012 IDE中&#xff0c;将被引用的.c文件后缀名全部修改为.h&#xff0c;然后通过IDE的解决方案资源管理器中鼠标右键单击“头文件”-"添加"-“现有项”&#xff0c;选中修改…

[零基础学JAVA]Java SE应用部分-35.JAVA类集之四

JAVA按以下重要顺序 面向对象 类集框架 JDBC 文件编程本季目标主要讲解以下的内容&#xff1a; Collection List Set Map Iterator ListIteator Enumeration for…each语句&#xff08;JDK 1.5的新特性&#xff09; Comparable接口 二叉树1、类集结构&#xff08…