目录
一、异常
异常:程序出现不正常的情况.
Throwable类, 异常的最顶层类, 所有的异常都是它儿子.
Error:表示错误, 服务器宕机, 数据库崩溃等
Exception:表示异常.
编译期异常: RuntimeException及其子类, 发生在编译期间的异常, 不处理, 程序编译通不过.运行时异常: RuntimeException及其子类,发生在运行期间的异常, 不处理, 程序也能通过编译
JVM默认处理异常的方式:
采用"抛出异常(即: throws)的方式实现, 会将异常的类型, 异常的描述信息, 以及异常出现的位置打印到控制台上并终止程序的运行.
public class Test {
public static void main(String[] args) {
try {
//问题
System.out.println(10 / 0);
//System.exit(0); //退出当前正在执行的JVM, 0表示正常退出.
} catch (Exception e) {
//出现问题后执行
e.printStackTrace();
return;
} finally {
//一般是用来释放资源的.
System.out.println("finally, 释放资源!...");
}
}
}
二、FIle类
封装的不是一个真正存在的文件,只是一个路径名。将来是要通过具体的操作把这个路径的内容转换为具体存在的。
1.构造函数
import java.io.File;
public class Test {
public static void main(String[] args) {
// File类的构造方法
//1.
File file1 = new File("E:/Study/JavaSE/1.txt");
File file2 = new File("E:\\Study\\JavaSE\\1.txt");
System.out.println(file1 + "\n" + file2);
//2.
File file3 = new File("E:/Study/JavaSE", "1.txt");
System.out.println(file3);
//3.
File file4 = new File("E:/Study/JavaSE");
File file5 = new File(file4, "1.txt");
System.out.println(file5);
}
}
2.创建方法
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
//无法判断输入路径是否合法,需要主动抛出异常
//创建文件,无文件则创建返回True,有则返回False
File file1 = new File("E:/Study/JavaSE/1.txt");
System.out.println(file1.createNewFile());
//创建单级文件夹
File file2 = new File("E:/Study/aa");
System.out.println(file2.mkdir());
//创建多级文件夹
File file3 = new File("E:/Study/bb/cc");
System.out.println(file3.mkdirs());
}
}
3.判断方法
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file1 = new File("E:/Study/aa");
System.out.println(file1.exists());
System.out.println(file1.isFile());
File dir1 = new File("E:/Study/aa");
System.out.println(dir1.isDirectory());
}
}
4.获取方法
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file1 = new File("day12\\lib");
System.out.println(file1.getAbsolutePath()); //获取绝对路径
System.out.println(file1.getPath()); //获取构造函数输入的路径
System.out.println(file1.getName()); //获取文件或文件夹名字
File file2 = new File("/");
String[] Lst = file2.list(); //获取文件夹中所有文件名
for(String i:Lst){
System.out.println(i);
}
File[] fileLst = file2.listFiles(); //获取文件夹中所有文件名
for(File i : fileLst){
System.out.println(i);
}
File file3 = new File("E:/Study/bb");
System.out.println(file3.delete()); //无法递归删除,删除文件夹必须为空
}
}
三、IO流
IO流就是用来处理设备间的数据传输问题的
字节流: 以字节为单位来操作数据,字节流能操作所有的文件类型.
字符流: 以字符为单位来操作数据,字符流只能操作纯文本文件.
1.字节输出流
FileOutputStream:普通字节输出流
BufferedOutputStream:高效字节输出流
(1) FileOutStream
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
FileOutputStream fos1 = new FileOutputStream("E:/Study/1.txt"); //文件名创建,覆盖
// FileOutputStream fos2 = new FileOutputStream(new File("E:/Study/1.txt")); //文件对象创建,覆盖
// FileOutputStream fos3 = new FileOutputStream("E:/Study/1.txt",true); //文件名创建,追加
//一次写入一字节
fos1.write(97);
fos1.write(98);
fos1.write(99);
fos1.write('\r');
fos1.write('\n');
//window操作系统: \r\n, linux: \n mac: \r
//一次写入一个字节数组
byte[] str = {97,98,99};
fos1.write(str);
fos1.write(str,1,1);
}
}
常用格式
import java.io.FileOutputStream;
public class Test {
public static void main(String[] args){
//先定义流变量,若try中未创建流对象,则finally中可以处理
FileOutputStream fos = null;
try{
fos = new FileOutputStream("E:/Study/1.txt");
}catch (Exception e){
e.printStackTrace();
}finally {
//若是未创建流对象,则不会执行,若创建了流对象则释放
try {
if (fos != null) {
fos.close();
fos = null; //GC会优先回收null对象.
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
import java.io.FileOutputStream;
class Demo implements AutoCloseable{
@Override
public void close() throws Exception {
System.out.println("看看我会不会自动调用");
}
}
public class Test {
public static void main(String[] args){
//JDK1.7的特性: try.with.resource语句, 写在try()中的对象, 会在{}中的内容执行完毕后, 自动回收.
//可简化释放资源.
//写在try()中的对象必须实现 AutoCloseable接口.
try(
FileOutputStream fos = new FileOutputStream("E:/Study/1.txt");
Demo demo = new Demo();
){
System.out.println("操作");
}catch (Exception e){
e.printStackTrace();
}
}
}
(2)BufferedOutputStream
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.BufferedOutputStream;
public class Test {
public static void main(String[] args)throws IOException {
// 字节缓冲流提供的缓冲区的大小是: 8196个字节(8KB), 所以如果我们用 普通流一次读写一个字节数组的方式拷贝文件,
// 且自定义的数组长度在 8196个字节, 那么可能会出现: 普通流一次读写一个字节数组的速度 > 高效流一次读写一个字节数组的速度
BufferedOutputStream bis = new BufferedOutputStream(new FileOutputStream("E:/Study/1.txt",true)); //文件必须存在,否则报错
bis.write("沉迷学习".getBytes());
bis.close();
}
}
2.字节输入流
FileInputStream:普通字节输入流
BufferedInputStream:高效字节输入流
(1)FileInputStream
import java.io.FileInputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args)throws IOException {
FileInputStream fis = new FileInputStream("E:/Study/1.txt"); //文件必须存在,否则报错
byte[] bys = new byte[3];
int len = 0;
while((len = fis.read(bys)) != -1){
System.out.println(new String(bys,0,len));
}
fis.close();
}
}
(2)BufferedInputStream
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args)throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:/Study/1.txt"));
byte[] bys = new byte[3];
int len = 0;
while((len = bis.read(bys)) != -1){
System.out.println(new String(bys,0,len));
}
bis.close();
}
3.字符输入输出流
1. GBK是针对于我们中国国内的码表,中文在GBK码表中占2个字节. UTF-8是国际通用码表(统一码, 万国码),中文在UTF-8码表中占3个字节.ISO-8859-1是欧洲通用码表.
2. 所有码表中文的第一个字节肯定是负数.
3. 数字, 字母, 特殊符号在所有码表都占1个字节, 都为正数.
(1)FileReader和FileWriter
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String[] args)throws IOException {
FileReader fr = new FileReader("E:/Study/1.txt");
FileWriter fw = new FileWriter("E:/Study/2.txt");
int len = 0;
while((len = fr.read()) != -1){
fw.write(len);
}
fr.close();
fw.close();
}
}
(2)BufferedRead和BufferedWrite
import java.io.*;
public class Test {
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new FileReader("E:/Study/1.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("E:/Study/2.txt",true));
String len = null;
// readLine读到换行则结束
while((len = br.readLine()) != null){
bw.write(len);
bw.newLine(); //根据系统给出换行符
}
br.close();
bw.close();
}
}
四、对象序列化
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
使用一个字节序列表示一个对象,包含:对象的类型、对象的数据和对象中存储的属性等信息字节序列 . 写到文件之后,相当于文件中持久保存了一个对象的信息.反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
1.ObjectOutputStream 序列化流
import java.io.Serializable;
// Serializable接口是标记接口,实现该接口的类可以进行序列化
public class Student implements Serializable {
private int age;
private String name;
public Student() {
}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", sum=" + sum +
'}';
}
}
import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args)throws IOException {
Student student = new Student(11,"张三");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:/Study/3.txt"));
oos.writeObject(student);
oos.close();
}
}
2.ObjectInputStream 反序列化流
import java.io.ObjectInputStream;
import java.io.FileInputStream;
public class Test {
public static void main(String[] args)throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:/Study/3.txt"));
Student student = (Student)(ois.readObject());
System.out.println(student);
ois.close();
}
}
3.序列化和反序列化的问题
当我们进行序列化操作后, 如果修改了JavaBean, 那么再进行反序列化,会抛出InvalidClassException异常,因为序列版本号不一致.
解决方式一: 重新序列化一次.
解决方式二: 给对象加一个 序列化版本号属性.
//添加进javaBean中
private static final long serialVersionUID = 1L; //序列号,变量名固定
transient int sum = 10; //transient关键词可以使变量不参与序列化