zoukankan      html  css  js  c++  java
  • Java 异常与IO流

    一、异常

      想想一下代码会发生什么?

    public static void main(String[] args) {
            
            int a = 10;
            int b = 0;
            System.out.println(a/b);
            System.out.println("程序结束");
        }

    我们都知道,当分母不能为0,所以程序会报错,这是非编译错误。

    1、异常的概念:

      程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。

      异常是程序中的一些错误,比如说,你的代码少了一个分号,那么运行出来的结果是提示是错误:Java lang Error ;如果你用System.out.println(11/0),那么你是因为你用了0做了除数,会抛出java.lang.Arithmetic Exception 的异常。

      异常发生时,是任程序自生自灭,立刻退出终止,还是输入错误给用户?

      Java提供了优秀的解决办法:异常处理机制。

    2、异常体系结构

      异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性的处理异常,让程序最大可能恢复正常并继续执行,且保持代码的清晰。

    3、异常的分类

      throwable类

        Error 表示JVM异常,通常很少出现,也不需要程序员去处理

        Exception

          RuntimeException 运行时异常,(非检查异常)

          IOException (检查异常,除了Error和RuntimeException之外的都是检查异常)

     

     4、异常的使用

      对于异常,我们有三种处理方法

        1、捕获异常

          try{

            //可能出现异常的代码段

          }catch(ExceptionName e){

            //对异常进行处理的代码段

          }finally{

            //不管发不发生异常,都执行该模块下的内容

          }

    示例:

        public static void main(String[] args) {
            
            int i = 10;
            int j = 0;
            
            try{        //首先程序进入try中,如果try中的代码没有出现异常,就执行try中的代码,然后打印程序结束
                System.out.println(i/j);
            }catch(ArithmeticException e){        //当try中带代码出现异常,就会执行catch中的代码,然后打印程序结束
                System.out.println("分母不能为0");
            }
            System.out.println("程序结束");
        
        }

     

    控制台打印结果:分母不能为0

            程序结束

     

        2、声明异常

          在方法中使用throws关键字声明异常

    示例:

        /**
         * 在方法上声声明一个异常
         * @param args
         * @throws ArithmeticException
         */
        public static void main(String[] args) throws ArithmeticException {
            
            System.out.println(11/0);
        }

        3、抛出异常

          try{

            //可能出现异常的代码段

          }catch(ExceptionName e){

            throw new Exception();

          }

    示例:

        /**
         * fun方法在main方法中调用,可以选择捕获异常,也可以选择继续往外抛异常
         * @param args
         * @throws Exception
         */
        public static void main(String[] args) throws Exception {    //在这里继续把异常往外抛
            fun(11,0);
        }
        
        /**
         * 在方法中声明创建一个异常,并往外抛异常
         * @param i
         * @param j
         * @throws Exception
         */
        public static void fun(int i ,int j) throws Exception{
            try{
                System.out.println(i/j);
            }catch(ArithmeticException e){
                throw new Exception("分母不能为0");
            }
            
        }

    5、多重catch块

    示例:

        public static void main(String[] args) {
            
            try {
                String[] arr = null; 
                System.out.println(arr[0]);
                FileInputStream io = new FileInputStream("");
            }catch (FileNotFoundException e){ 
                System.out.println(" 文件没找到 "); 
            }catch(NullPointerException e){
                System.out.println(" 对象为空 ");
                System. out.println(" 对象为空 "); 
            }
        }

      在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,即先子类后父类。

    6、常见的异常类型

    二、IO流

    1、File类

      File类没有指定信息怎么从文件读取或向文件存储;它描述了文件本身的属性。

      File对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。

      (1)、File类访问文件

        File f1 = new File(文件路径(是一个字符串));

        //在指向物理文件或目录时,我们路径的 要换成 / 或者 \ 

        创建文件对象————>指向物理文件或目录

    2、File类常用的方法

    public static void main(String[] args) {
            
            //创建一个文件对象
            File f1 = new File("D:/abc.txt");
            
            //判断文件是否存在    结果是boolean类型
            System.out.println(f1.exists());
            
            //判断文件是否只读    结果是boolean类型
            System.out.println(f1.canWrite());
            
            //删除文件

    f1.delete(); // 获取绝对路径下的文件 System.out.println(f1.getAbsolutePath()); // 获取绝对路径 System.out.println(f1.getAbsolutePath()); // 获取文件名 System.out.println(f1.getName()); // 获取目录路径 System.out.println(f1.getParent()); // 获取路径 System.out.println(f1.getPath()); // 判断该文件是否是目录 System.out.println(f1.isDirectory()); //判断该文件是否是文件 System.out.println(f1.isFile()); // 判断是否为隐藏文件 System.out.println(f1.isHidden()); // 获取该文件的字节数 /大小 System.out.println(f1.length()); //获取路径下的所有文件名 String [] str = f1.list(); //使用for each 打印文件名 for(String s : str){ System.out.println(s); } }

    3、  IO流

      流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或者网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。

      在整个java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Write、Reader;一个接口指的是Serializable。掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了。

      

    4、IO流体系与分类

      在JAVA中,所有流相关的内容全部在java.io包下。

      按功能分,IO流可分为:输入流和输出流

          Java程序读取数据  <——(输入流)———文件  

          Java程序输出数据————( 输出流 )———>文件

     

      按类型分,IO流可分为:字节流和字符流

        字符输入流 Reader        字符输出流  Write

        字节输入流  IuputStream          字节输出流  OutputStrean

    5、IO流划分

      这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来

                  BufferedReader

             Reader   InputStreamReader       FileReader

                  BufferedWriter

     

         字符流     

                BufferedWriter

            Writer

                OutStreamWriter         FileWriter

     流        

                    FileInputStream

            InputStream          BufferedINputStream

         字节流        

                    FlieOutputStream

             OutputStream        BufferOutputStream

     

    6、字节流与字符流

      程序中输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。

      字符流处理的单元为2个字节的Unicode字节,分别操作字符、字符数组或字符串

      字节流处理单元为1个字节,操作字节和字节数组

    如何选择字节流和字符流?

      字符流是Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲、就用字节流好点,如果是关系到中文(文本)的,用字符流好点

     

    7、文件读写步骤

      文本文件的读写

        1.使用File类打开一个文件

        2.通过字节流或字符流的子类,指定文件的位置

        3.进行读/写操作

        4.关闭输入/输出

      常用流有  FileInputStream  和  FileOutputStream ,Bufferedreader  和 BufferedWriter

      二进制文件的读写

      步骤与文本文件的读写相同,区别在于二进制文件通常使用的是DataInputStream 和 DataOutputStream读写二进制文件

     

    示例:

        public static void main(String[] args) throws IOException {
            
            //创建一个文件对象
            File f = new File("D:/abc.txt");
            
            // 输入流
            FileInputStream in = new FileInputStream(f);
            
            //输出流
            FileOutputStream out = new FileOutputStream("D:/123.txt");
            
            byte [] b = new byte[(int) f.length()];
            
            //输入
            in.read(b);
            
            //输出
            out.write(b);
            
            //先关闭out
            out.close();
            
            //在关闭in
            in.close();
            
        }

    首先,我们D盘中有一个abc.txt文件,内容是123456

    程序运行结束后,D盘会多出一个123.txt的文件,内容也是123456

    8、使用字节流读写文件

      FileInputStream : 单字节读写,字节数组读写

      FileOutputStream 

      BufueredInputStream : 使用缓冲区读取,速度比FileInputStream快

      BufferedOutputStream

    示例:

        public static void main(String[] args) throws IOException {
            
            
            //创建一个输入对象
            File fin = new File("D:/jdk api 1.8.CHM");
            
            //字节流缓冲区输入
            BufferedInputStream in = new BufferedInputStream( new FileInputStream(fin));
            
            //创建一个输出的对象
            File fout = new File("D:/jdk api 1.80.CHM");
            //输出
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fout));
            
            byte [] b = new byte[1024];
            
            while(in.read(b) !=-1){
                out.write(b);
            }
            
            //关闭流
            out.close();
            in.close();
        }

    程序执行结束,我们会发现,D盘中多了一个我们创建的 jdk api 1.80.CHM 文件

  • 相关阅读:
    zz 通过INFORMATION_SCHEMA.INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS 三个表获取事务与锁的信息
    binlog在并发状态下的记录
    关于mysql的metadata lock
    测试相关
    数组
    方法、递归算法
    顺序、选择、循环结构
    Scanner
    包机制、javadoc
    变量、常量
  • 原文地址:https://www.cnblogs.com/sloth-007/p/10658949.html
Copyright © 2011-2022 走看看