Java学习笔记--异常处理、File类、IO流介绍

异常处理

  • 格式:
try {
    可能出现问题的代码;
}catch(异常类名 变量名) {//catch语句可以有多个,子类异常放前面,父类异常放后面
    针对问题的处理;
}finally {
    释放资源;
}
  • jdk7新特性
try {
    可能出现问题的代码;
}catch(异常类名1 | 异常类名2 | ... 变量名) {//这种方式只能多个异常处于平级关系
    针对问题的处理;
}
  • 异常分为编译期间异常和运行期间异常,所有属于RuntimeException的子类都是运行期间异常,其余一场都是编译期间异常。而需要通过try…catch语句处理的异常通常都是编译期间异常。
  • 另外一种处理异常的方式是抛出异常
    1. 在方法的括号后面加上throws 异常类名1, 异常类名2…
    2. 在方法的内部通过throw后面跟上new出来的异常对象来主动抛异常
  • finally语句体中的语句一定会执行,即便try或者catch中存在return,它们会在return前一刻执行完成,然后再回到return语句。
  • 自定义异常需要继承Exception类,带参构造方法中的参数表示错误提示信息。
public class MyException extends Exception {
	public MyException() {
	}

	public MyException(String message) {
		super(message);
	}
}
  • 异常注意事项:
    1. 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
    2. 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常。
    3. 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws。

File类

  • 创建一个File对象:
File file = new File("E:\\demo\\a.txt");
File file2 = new File("E:\\demo", "a.txt");
File file3 = new File("e:\\demo");
File file4 = new File(file3, "a.txt");
//file、file2和file4是等效的
  • 一些常用的方法:
public boolean canRead()//判断文件是否可读
public boolean createNewFile() throws IOException//创建文件
public boolean mkdir()//创建文件夹
public boolean mkdirs()//创建嵌套文件夹
public boolean delete()//删除文件或文件夹
public String getAbsolutePath()//输出绝对路径
public String getName()//文件或文件夹的名称
public boolean isDirectory()//判断是否是文件夹
public boolean isFile()//判断是否是文件
public long length()//输出文件大小,单位为字节
public boolean renameTo(File dest)//效果等同于Linux下的mv命令,包含重命名和剪切双重含义
public String[] list()//返回文件夹下所有文件和文件夹的名称数组
public File[] listFiles()//返回文件夹下所有文件和文件夹的File对象数组
  • 高级方法:
    • public String[] list(FilenameFilter filter):返回所有满足条件的文件或文件夹名称数组。FilenameFilter是一个接口,所以传入的参数必须是其子类对象,并且需要重写其中的accept方法,用来逐个判断文件或者文件夹是否满足要求。当然,传入的filter参数可以不另外创建类,而是直接用匿名内部类的方式创建子类对象。

IO流

  • 分类
    • 按照流向可以分为输入流和输出流。
    • 按照数据类型可以分为字节流可字符流。
    • 所以组合起来总共有四种流:字节输入流、字节输出流、字符输入流、字符输出流。
    • 分别对应的抽象基类时:InputStream, OutputStream, Reader, Writer。
  • 使用IO流读写数据,最后一定要调用close()方法,这样就能让流对象变成垃圾,可以被垃圾回收器回收;第二点就是通知系统去释放跟该文件有关的资源。
  • 使用FileInputStream和FileOutputStream读写数据的方式如下:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("e:\\movie.avi");
        FileOutputStream fos = new FileOutputStream("movie.avi");
        byte[] b = new byte[1024];//一次最多读取的量
        int len = 0;//记录一次实际读取的量
        while((len = fis.read(b))!=-1){//以byte数组的方式读取
                fos.write(b,0,len);//以byte数组的方式写入
        }
        fis.close();
        fos.close();
    }
}
  • BufferedOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以将字节写入基础输出流,而不必为写入的每个字节调用底层系统。提高了读写效率。使用时只需要用该类对输出流进行包装即可。使用BufferedOutputStream和BufferedInputStream的协数据的方式如下:
import java.io.*;

public class TestDemo {
    public static void main(String[] args) throws IOException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("movie.avi"));
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("e:\\movie.avi"));
        byte[] b = new byte[1024];
        int len = 0;
        while((len = bis.read(b))!=-1){
                bos.write(b,0,len);
        }
        bis.close();
        bos.close();
    }
}
  • 前面讲到的四个类都属于字节流,而读写文本文件还有一类流叫做字符流:Reader, Writer
  • 使用方法与字节流大致相同:
import java.io.*;

public class TestDemo {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//字符转换流
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"));
        //下面这两个类是上面类的简化版本,属于其子类
        //FileReader isr = new FileReader("a.txt");
        //FileWriter osw = new FileWriter("b.txt");
        //下面这两个类是提供高效读写的缓冲流        
        //BufferedReader isr = new BufferedReader(new FileReader("a.txt"));
        //BufferedWriter osw = new BufferedWriter(new FileWriter("b.txt"));
        char[] ch = new char[1024];
        int len = 0;
        while ((len = isr.read(ch))!=-1){
            osw.write(ch,0,len);
            osw.flush();
        }
        isr.close();
        osw.close();
    }
}
  • 下面利用缓冲流的特殊方法来完成文件内容的复制:
  • public String readLine()throws IOException通过下列字符之一即可认为某行已终止:换行 (’\n’)、回车 (’\r’) 或回车后直接跟着换行。返回包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null。
import java.io.*;

public class TestDemo {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
        String line = null;
        while ((line = br.readLine())!=null){
            bw.write(line);
            bw.newLine();//插入一个由系统决定的换行符
            bw.flush();
        }
        br.close();
        bw.close();
    }
}
  • DataInputStream和DataOutputStream是读写基本数据类型的输入输出流,它们的读写方法中除了能够是字节数组,还可以是Java中的任意基本数据类型。保存在文件中的数据类型不是字符串形式,所以不可读;但他们保存了原有的数据类型,使用输入流读入时依然是原来的数据类型。
  • PrintWriter是打印输出流,能够将任意数据类型打印在文本文件中。调用的方法不再是write()而是print()或println()。打印流将其他数据类型以字符串的形式保存下来,已经不再是以前的数据类型,这一点需要与前面两个流进行区分。
  • 随机访问流RandomAccessFile可以同时具备读和写的功能,且支持各种数据类型;还能够获取文件指针和设置文件指针来从中间任意位置进行读写。
  • 合并流SequenceInputStream能够将多个InputStream合并为一个,按照顺序挨个文件读取。
  • ObjectOutputStream和ObjectInputStream称为序列化流和反序列化流。能够实现对象的序列化和反序列化,对象要具备被序列化的能力,必须实现Serializable接口。在成员变量前面加上transient关键字就能够防止其被序列化。
Properties类
  • 该类是Hashtable类的子类,它也实现了Map接口,具有基本的与Map类相同的功能,但是它限制了键和值的类型必须为字符串形式。
  • 该类有一些特殊的方法:
public String getProperty(String key)//根据键来找值
public Object setProperty(String key,String value)//添加键值对,实质上调用了Hashtable的put方法
public Set<String> stringPropertyNames()//得到键的集合,实际上调用了Hashtable的keySet方法。
  • 与IO流结合的两个方法:
//读取文件中的键值对,加载到Properties对象中,以Map形式保存
public synchronized void load(Reader reader) throws IOException
//将Properties对象中的键值对以能够被正确读取的方式写入文件当中,第二个参数是Properties对象描述信息
public void store(Writer writer, String comments) throws IOException
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值