一、异常机制和File类
(一)、异常机制
1、概念
异常就是在Java语言中主要指程序执行中发生的不正常情况。java.lang.Throwable类是Java语言中错误(Error)和异常(Exception)的超类。
(1)其中Error类主要用于描述Java虚拟机无法解决的严重错误,通常无法编码解决,如:JVM挂掉了等。
(2)其中Exception类主要用于描述因编程错误或偶然外在因素导致的轻微错误,通常可以编码解决,如:0作为除数等。
2、异常的分类
java.lang.Exception类是所有异常的超类,主要分为以下两种:
(1)RuntimeException - 运行时异常,也叫作非检测性异常,其中RuntimeException类的主要子类:
ArithmeticException类 - 算术异常
ArrayIndexOutOfBoundsException类 - 数组下标越界异常
NullPointerException - 空指针异常
ClassCastException - 类型转换异常
NumberFormatException - 数字格式异常
(2)IOException和其它异常 - 其它异常,也叫作检测性异常,所谓检测性异常就是指在编译阶段都能被编译器检测出来的异常。
注意:
当程序执行过程中发生异常但又没有手动处理时,则由Java虚拟机采用默认方式处理异常,而默认
处理方式就是:打印异常的名称、异常发生的原因、异常发生的位置以及终止程序。
3、异常的捕获
执行流程:
try {
编写可能发生异常的代码;
}catch(Exception ex) {
编写针对该类异常的处理代码;
}finally {
编写无论是否发生异常都要执行的代码;
}
注:a.当需要编写多个catch分支时,切记小类型应该放在大类型的前面;
b.懒人的写法:
catch(Exception e) {}
c.finally通常用于进行善后处理,如:关闭已经打开的文件等。
public calss ExceptionTest{
public static void main(String[] args) {
//最终返回值为2
try{
int[] arr = new int[5];
System.out.println(arr[5]);
return 0;
}catch(ArrayIndexOutOfBoundsException e){
e.printStackTrace();
return 1;
}finally{
return 2;
}
}
}
4、异常的抛出
访问权限 返回值类型 方法名称(形参列表) throws 异常类型1,异常类型2,…{ 方法体; }
如: public void show() throws IOException{}
(二)、File类
1、java.io.File类主要用于描述文件或目录路径的抽象表示信息,可以获取文件或目录的特征信息,如:大小等。
2、常用的方法
方法声明 | 功能概述 |
---|---|
File(String pathname) | 根据参数指定的路径名来构造对象 |
File(String parent, String child) | 根据参数指定的父路径和子路径信息构造对象 |
File(File parent, String child) | 根据参数指定的父抽象路径和子路径信息构造对象 |
boolean exists() | 测试此抽象路径名表示的文件或目录是否存在 |
String getName() | 用于获取文件的名称 |
long length() | 返回由此抽象路径名表示的文件的长度 |
long lastModified() | 用于获取文件的最后一次修改时间 |
String getAbsolutePath() | 用于获取绝对路径信息 |
boolean delete() | 用于删除文件,当删除目录时要求是空目录 |
boolean createNewFile() | 用于创建新的空文件 |
boolean mkdir() | 用于创建目录 |
boolean mkdirs() | 用于创建多级目录 |
File[] listFiles() | 获取该目录下的所有内容 |
boolean isFile() | 判断是否为文件 |
boolean isDirectory() | 判断是否为目录 |
File[] listFiles(FileFilter filter) | 获取目录下满足筛选器的所有内容 |
3、
public calss FileTest{
public static void main(String[] args) throws IOException{
File file = new File("d:/a.txt");
if(file.exists()){
System.out.println("文件的名称为"+file.getName());
System.out.println("文件的长度为"+file.length());
//得到的时间是long型的毫秒数
System.out.println("文件的最后一次修改时间为"+file.lastModified());
System.out.println("文件的绝对路径为"+file.getAbsolutePath());
//绝对路径:根目录开始的路径信息:如以d:/ c:/开始的
//相对路径:以当前目录所在位置开始的路径信息,如../
System.out.println(file.delete()?"文件删除成功":"文件删除失败");
}else{
System.out.println(file.createNewFile()?"文件创建成功":"文件创建失败");
}
System.out.println("--------------------------");
//获取指定目录以及子目录中的内容并打印
File[] fileArrays = file.listFiles();
//遍历数组
for(File f : fileArrays){
String name = f.getName();
//判断是否为文件,若是则直接打印文件名称
if(f.isFile()){
System.out.println(name);
}
//判断是否是目录,若是则将目录名称用【】括起来
if(f.isDirectory()){
System.out.println("【"+name+"】");
//用递归可以获取子目录中的文件,将这个循环方法抽成一个方法
}
}
}
}
二、IO流
(一)、IO流的概念及分类
1、Io流:IO就是Input和Output的简写,也就是输入和输出的含义。IO流就是指读写数据时像流水一样从一端流到另外一端,因此得名为“流"。
2、Io流的基本分类
- 按照读写数据的基本单位不同,分为 字节流 和 字符流。
其中字节流主要指以字节为单位进行数据读写的流,可以读写任意类型的文件。
其中字符流主要指以字符(2个字节)为单位进行数据读写的流,只能读写文本文件,内容只能为文字,不能是图片,音频,视频等,因为像一个汉字占两个字节,用字节流只能一次读半个汉字,翻译出来容易乱码。 - 按照读写数据的方向不同,分为 输入流 和 输出流(站在程序的角度)。
其中输入流主要指从文件中读取数据内容输入到程序中,也就是读文件。
其中输出流主要指将程序中的数据内容输出到文件中,也就是写文件。 - 按照流的角色不同分为节点流和处理流。
其中节点流主要指直接和输入输出源对接的流。
其中处理流主要指需要建立在节点流的基础之上的流。
(二)、 FileWriter类——字符输出流
1、java.io.FileWriter类主要用于将文本内容写入到文本文件。
2、常用方法
方法声明 | 功能介绍 |
---|---|
FileWriter(String fileName) | 根据参数指定的文件名构造对象 |
FileWriter(String fileName, booleanappend) | 以追加的方式根据参数指定的文件名来构造对象 |
void write(int c) | 写入单个字符 |
void write(char[] cbuf, int off, int len) | 将指定字符数组中从偏移量off开始的len个字符写入此文件输出流 |
void write(char[] cbuf) | 将cbuf.length个字符从指定字符数组写入此文件输出流中 |
void flush() | 刷新流 |
void close() | 关闭流对象并释放有关的资源 |
public calss FileWriterTest{
public static void main(String[] args) throws IOException{
FileWriter fw = null;
try{
//1、构造FileWriter类型的对象与d:/a.txt文件关联
//若文件不存在会自动创建空文件
//若文件存在,该流会自动清空文件中的原有内容
//FileWriter fw = new FileWriter("d:/a.txt");
//以追加的方式根据参数指定的文件名来构造对象,不会清空原有内容
fw = new FileWriter("d:/a.txt",true);
//2、通过流对象写入单个字符,从上到下执行,每当写入一个字符则文件中的读写位置向后移一位
fw.write("a");
//将字符数组写入,可部分写入也可全部写入
char[] cArr = new char[]{'h','m','d'};
//fw.write(cArr,0,1); //部分写入
fw.write(cArr); //全部写入
System.out.println("写入数据成功"); //ahmd
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fw != null){
//3、关闭流对象并释放有关资源
fw.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
(三)、 FileReader类——字符输入流
1、java.io.FileReader类主要用于从文本文件读取文本数据内容。
2、常用方法
方法声明 | 功能介绍 |
---|---|
FileReader(StringfileName) | 根据参数指定的文件名构造对象 |
int read() | 读取单个字符的数据并返回,返回-1表示读取到末尾 |
int read(char[] cbuf, intoffset, int length) | 从输入流中将最多len个字符的数据读入一个字符数组中,返回读取到的字符个数,返回-1表示读取到末尾 |
int read(char[] cbuf) | 从此输入流中将最多 cbuf.length 个字符的数据读入字符数组中,返回读取到的字符个数,返回-1表示读取到末尾 |
void close() | 关闭流对象并释放有关的资源 |
public calss FileReaderTest{
public static void main(String[] args) throws IOException{
FileReader fr = null;
try{
//1、构造FileReader类型的对象与d:/a.txt文件关联
fr = new FileReader("d:/a.txt");
/**
//2、读取单个字符内容
int res = 0;
//等于-1表示读取到了末尾
while(res = fr.read() != -1){
System.out.println("读取数据为" + (char)res);
}
**/
//读取数据到数组
char[] cArr = new char[5];
int res = fr.read(cArr);
System.out.println("获取字符的个数" + res);
for(char cv : cArr){
System.out.println("读取数据为" + cv);
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fr != null){
//3、关闭流对象并释放有关资源
fr .close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
拷贝文件到另外一个文件(文件字符流的拷贝)
public calss FileCopyTest{
public static void main(String[] args) throws IOException{
FileReader fr = null;
FileWriter fw = null;
try{
//1、构造FileReader类型的对象与d:/a.txt文件关联
fr = new FileReader("d:/a.txt");
//构造FileWriter类型的对象与d:/b.txt文件关联
fw = new FileWriter("d:/b.txt");
int res = 0;
//等于-1表示读取到了末尾
while(res = fr.read() != -1){
fw.write(res);
}
System.out.println("拷贝文件成功");
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fr != null || fw != null ){
//3、关闭流对象并释放有关资源
//先创建的后关闭,后创建的先关闭
fw .close();
fr .close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
(四)、 FileOutputStream类——字节输出流
1、java.io.FileOutputStream类主要用于将图像数据之类的原始字节流写入到输出流中。
2、常用的方法
方法声明 | 功能介绍 |
---|---|
FileOutputStream(String name) | 根据参数指定的文件名来构造对象 |
FileOutputStream(String name,boolean append) | 以追加的方式根据参数指定的文件名来构造对象 |
void write(int b) | 将指定字节写入此文件输出流 |
void write(byte[] b, int off, int len) | 将指定字节数组中从偏移量off开始的len个字节写入此文件输出流 |
void write(byte[] b) | 将 b.length 个字节从指定字节数组写入此文件输出流中 |
void flush() | 刷新此输出流并强制写出任何缓冲的输出字节 |
void close() | 关闭流对象并释放有关的资源 |
(五)、FileInputStream类——字节输入流
1、java.io.FileInputStream类主要用于从输入流中以字节流的方式读取图像数据等。
2、** 文件字节输出流的文件拷贝(图片拷贝)**
public calss FileInputStreamTest{
public static void main(String[] args) throws IOException{
FileInputStream fis = null;
FileOutputStream fos = null;
try{
//1、构造FileReader类型的对象与d:/01 IO流框架图.png文件关联
fis = new FileInputStream("d:/01 IO流框架图.png");
//构造FileWriter类型的对象与d:/IO流框架图.png文件关联
fos = new FileOutputStream("d:/IO流框架图.png");
int res = 0;
//等于-1表示读取到了末尾
while(res = fis.read() != -1){
fos.write(res);
}
System.out.println("拷贝文件成功");
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fis != null || fos!= null ){
//3、关闭流对象并释放有关资源
//先创建的后关闭,后创建的先关闭
fos .close();
fis.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
(六)、BufferedOutputStream类——缓冲字节输出流
1、java.io.BufferedOutputStream类主要用于描述缓冲输出流,此时不用为写入的每个字节调用底层系统。较少磁盘io的接触次数。
2、
方法声明 | 功能介绍 |
---|---|
BufferedOutputStream(OutputStream out) | 根据参数指定的引用来构造对象 |
BufferedOutputStream(OutputStream out, int size) | 根据参数指定的引用和缓冲区大来构造对象 |
void write(int b) | 写入单个字节 |
void write(byte[] b, int off, int len) | 写入字节数组中的一部分数据 |
void write(byte[] b) | 写入参数指定的整个字节数组 |
void flush() | 刷新流 |
void close() | 关闭流对象并释放有关的资源 |
(七)、BufferedInputStream类——缓冲字节输入流
1、java.io.BufferedInputStream类主要用于描述缓冲输入流。
2、
方法声明 | 功能介绍 |
---|---|
BufferedInputStream(InputStream in) | 根据参数指定的引用构造对象 |
BufferedInputStream(InputStream in, int size) | 根据参数指定的引用和缓冲区大小构造对象 |
int read() | 读取单个字节 |
int read(byte[] b, int off, int len) | 读取len个字节 |
int read(byte[] b) | 读取b.length个字节 |
void close() | 关闭流对象并释放有关的资源 |
用缓冲区拷贝文件:
public calss BufferedStreamTest{
public static void main(String[] args) throws IOException{
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try{
//1、构造BufferedInputStream类型的对象与d:/01 IO流框架图.mp4文件关联
bis = new BufferedInputStream(new FileInputStream("d:/01 IO流框架图.mp4"));
//构造BufferedOutputStream类型的对象与d:/IO流框架图.mp4文件关联
bos = new BufferedOutputStream(new FileOutputStream("d:/IO流框架图.mp4"));
byte[] bArr = new Byte[1024]
int res = 0;
//等于-1表示读取到了末尾
while(res = fis.read(bArr) != -1){
bos.write(bArr,0,res);
}
System.out.println("拷贝文件成功");
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(bis != null || bos!= null ){
//3、关闭流对象并释放有关资源
//先创建的后关闭,后创建的先关闭
bos .close();
bis.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
(八)、 BufferedWriter类——缓冲区字符输出流
1、java.io.BufferedWriter类主要用于写入单个字符、字符数组以及字符串到输出流中。
2、常用方法
方法声明 | 功能介绍 |
---|---|
BufferedWriter(Writer out) | 根据参数指定的引用来构造对象 |
BufferedWriter(Writer out, int sz) | 根据参数指定的引用和缓冲区大小来构造对象 |
void write(int c) | 写入单个字符到输出流中 |
void write(char[] cbuf, int off, int len) | 将字符数组cbuf中从下标off开始的len个字符写入输出流中 |
void write(char[] cbuf) | 将字符串数组cbuf中所有内容写入输出流中 |
void write(String s, int off, int len) | 将参数s中下标从off开始的len个字符写入输出流中 |
void write(String str) | 将参数指定的字符串内容写入输出流中 |
void newLine() | 用于写入行分隔符到输出流中 |
void flush() | 刷新流 |
void close() | 关闭流对象并释放有关的资源 |
(九)、 BufferedReader类——缓冲区字符输入流
1、java.io.BufferedReader类用于从输入流中读取单个字符、字符数组以及字符串。
2、文件拷贝:
public calss BufferedStringCopyTest{
public static void main(String[] args) throws IOException{
BufferedReader br = null;
BufferedWriter bw = null;
try{
//1、构造BufferedReader类型的对象与d:/a.txt文件关联
br = new BufferedReader(new FileReader("d:/a.txt"));
//构造BufferedWriter类型的对象与d:/b.txt文件关联
bw = new BufferedWriter(new FileWriter("d:/b.txt"));
String str = null;
//等于null表示读取到了末尾
while(str = br.readLine(bArr) != null){
bw.write(str);
}
System.out.println("拷贝文件成功");
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(br != null || bw!= null ){
//3、关闭流对象并释放有关资源
//先创建的后关闭,后创建的先关闭
bw .close();
br.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
(十)、PrintStream类——打印流
1、java.io.PrintStream类主要用于更加方便地打印各种数据内容。
2、常用的方法
方法声明 | 功能介绍 |
---|---|
PrintStream(OutputStream out) | 根据参数指定的引用来构造对象 |
void print(String s) | 用于将参数指定的字符串内容打印出来 |
void println(String x) | 用于打印字符串后并终止该行 |
void flush() | 刷新流 |
void close() | 用于关闭输出流并释放有关的资源 |
(十一)、 PrintWriter类——打印流
1、java.io.OutputStreamWriter类主要用于实现从字符流到字节流的转换。