异常,File IO 一、异常 二、File 三、IO
- 什么是异常
- 代码编译或运行出现了不正常,报错
- 异常概述
- Java运用面向对象思想,将一些程序中可能出现的问题也封装成对应的类 而将这些类向上抽取,形成了异常体系
- 异常体系 Throwable
- Error:程序员无法处理 内存溢出:加内存条
- Exception重点关注
- 运行时异常:RuntimeException及其子类:, 处不处理可以运行,
- 编译时异常,非RuntimeException类和其子类 必须处理,不处理无法通过编译运行
- 异常处理方式
- 默认处理:一级一级往上抛出
- 例如 : 类似治病,去县级医院看病(main方法处理),看不了,找省级医院(JVM),默认处理==>在控制台打印异常信息
- 程序员手动处理
- 为什么我们自己处理异常 : 我们处理 代码可以继续往下执行,虚拟机处理直接程序停止
- 第一种方式(捕获异常)
-
例如 : try{ //try的作用是检测异常 相当于(检查是否有病) //把有可能出现错误的代码放里面 }catch(异常类型 变量名){ //catch相当于处理异常 (治病) //处理异常的代码 }
- 异常中的常见方法:
- String toString() : 异常名称+异常原因
- e.printStackTrace():和虚拟机返回的一样,就是原因和位置
- 异常中的常见方法:
- 第二种方式(抛出异常)
- 向上抛出异常,thows抛出异常 写在 方法的声明后边, 谁来调用方法谁就处理异常(要么继续抛要么自己捕获异常)
- 默认处理:一级一级往上抛出
二、File
- 概念 : 文件或目录路径名的表示形式
- 构造方法 :
- public File(String pathname) :将指定的路径名转换成一个File对象
- public File(String parent, String child) : 根据指定的父路径和文件路径创建File对象
- public File(File parent, String child) :根据指定的父路径对象和文件路径创建File对象
- File的常用功能
- 创建功能
- boolean createNewFile() : 当指定文件不存在时创建文件并返回true,否则返回false
- boolean mkdir() : 当指定文件夹不存在时创建文件夹并返回true,否则返回false
- boolean mkdirs() : 创建指定文件夹,当文件夹所在的目录不存在,则顺道一块创建了
- 注意: 此案例创建的是文件夹//File f5 = new File("c.txt");
//System.out.println(f5.mkdir());
- 删除功能
- boolean delete() :当指定的文件或文件夹存在时删除文件或者文件夹 并返回true,否则返回false
- 注意 : 删除一个文件夹,这个文件夹下面不能有其他的文件和文件夹,而且不走回收站
- 获取功能
- String getAbsolutePath() : 以String形式返回File对象所指向的绝对路径
- String getName() : 获取路径的最后一级名字,返回路径的字符串形式(文件文件夹都可以获取)
- long length() : 返回文件的字节数
- String getPath() : 返回创建File对象时给的路径
- 判断功能
- boolean exists() : 判断文件或者文件夹是否存在,如果存在则返回true,否则返回false
- boolean isDirectory() :判断File对象指向的路径是否是文件夹,如果是则返回true,否则返回false
- boolean isFile() : 判断File对象指向的路径是否是文件,如果是则返回true,否则返回false
- 创建功能
三、IO
字节流:操作的都是多媒体文件(音频,视频,图片)
Inputream:字节输入流
OuputStream:字节输出流
IO流分类
字节流(操作任意文件)
- 字节缓冲区流:(字节高效流)
- BufferedOutputStream:字节缓冲输出流
- BufferedInputStream:字节缓冲输入流
- 注意 : 为什么构造方法传递的是一个:OutputStream,而不是具体的文件或者路径呢?
字节缓冲区流仅仅提供缓冲区,而真正的底层的读写数据还得需要基本的流对象进行操作。
- 字节流读数据出现的问题
- 问题所在
- 字节流一次读取一个字节的方式读取带有汉字的文件是有问题的,因为你读取到一个字节后就转为字符在控制台输出了,而汉字是由2个字节组成的,所以这里会出问题。
- 汉字存储的规则:
- 文件复制的时候,字节流读取一个字节,写入一个字节,这个没有出现问题,是因为最终底层会根据字节做拼接,
得到汉字。 - 原因 : 左边的字节数据肯定是负数,右边的字节数据可能是负数,也可能是正数,大部分情况下是负数。
- 文件复制的时候,字节流读取一个字节,写入一个字节,这个没有出现问题,是因为最终底层会根据字节做拼接,
- 乱码产生的原因
- 针对同一个数据采用的编码和解码的编码表不一致
- String中的编码解码问题
public byte[] getBytes(String charsetName)
用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
public String(byte[] bytes, String charsetName)
通过使用指定的 charset解码指定的 byte 数组,构造一个新的 String。
- 问题所在
字符流(操作文本文件)
- 转换流其实就是一个字符流。转换流 = 字节流 + 编码表
- OutputStreamWriter 字符输出流
- 构造方法
- public OutputStreamWriter(OutputStream out) 根据默认编码把字节流的数据转换为字符流
- public OutputStreamWriter(OutputStream out,String charsetName) 根据指定编码把字节流数据转换为字符流
- 写数据方法
- public void write(int c):写一个字符
- public void write(char[] cbuf):写一个字符数组
- public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
- public void write(String str):写一个字符串
- public void write(String str,int off,int len):写一个字符串的一部分
- 构造方法
- InputStreamReader 字符输入流
- 构造方法
- public InputStreamReader(InputStream in)
- public InputStreamReader(InputStream in,String charsetName) 用指定的编码读取数据
- 读数据方法
- public int read():一次读取一个字符
- public int read(char[] cbuf):一次读取一个字符数组
- 构造方法
- 字符流的简化版
- FileWriter:用来写入字符文件的便捷类
- 父类为 OutputStreamWriter
- 构造方法:FileWriter(String fileName)
- FileReader:用来读取字符文件的便捷类
- 父类为 InputStreamReader
- 构造方法:FileReader(String fileName)
- FileWriter:用来写入字符文件的便捷类
- 字符缓冲流(高效流)