IO


IO_异常_字符串_父类


一、前言

1、将数据永久保存到硬盘上


二、IO流的使用步骤

1、声明文件源

2、声明流关联源

3、使用流

4、关闭流


IO_异常_字符串_父类_02


三、字节流

InputStream所有字节输入流的父类FileInputStream

1、读取方法

aint read() 每次读一个字节

bint read(byte[] bs)将读取的内容放到字节数组中,返回读取的个数


IO_异常_字符串_父类_03


OutputStream所有字节输出流的父类FileOutputStream

1、写入方法

awrite(int b);将一个字节写入文件

bwrite(byte[] bs);将一个字节数组写入文件,如果有中文,会自动进行组合(gbk是一个汉字两个字节, utf-8是一个汉字三个字节)


IO_异常_字符串_System_04


IO_异常_字符串_System_05


四、字符流

1、Reader FileReader

int read(); 读取一个字符


IO_异常_字符串_System_06


将文件内容读到字符数组中


IO_异常_字符串_System_07




2、Writer FileWriter

FileWriter(file);默认覆盖写

FileWriter(file,true)第二个参数为true,则是追加写


IO_异常_字符串_写入文件_08


五、例子

1、文件拷贝


IO_异常_字符串_写入文件_09


2、模拟员工入职和获得所有员工

员工入职


IO_异常_字符串_System_10


IO_异常_字符串_父类_11


获得所有员工


IO_异常_字符串_写入文件_12


IO_异常_字符串_System_13



六、流的分类

1、方向

输入流输出流

2、操作单位

字节流字符流

3、是否文件源关联节点流 FileInputStream处理流 BufferedReader


七、处理流

1、缓冲流

BufferedReader

每次可以读一行

BufferedWriter

生成新行员工入职


IO_异常_字符串_父类_14


IO_异常_字符串_父类_15


获得所有员工


IO_异常_字符串_写入文件_16


IO_异常_字符串_System_17


2、转换流

InputStreamReader

IO_异常_字符串_System_18

InputStreamReader(InputStream in,String charsetName); 字节流对象和字符集名称(gbk|utf-8|...











//

//

//

//

//

//

//


FileInputStream input = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(input, "utf-8"); char[] bs = new char[(int) file.length()];

reader.read(bs); input.close();

String str = new String(bs); System.out.println(str);







}

FileInputStream input = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(input, "utf-8"); BufferedReader br = new BufferedReader(reader); System.out.println(br.readLine());

br.close();

}





八、对象流

1、ObjectOutputStream


IO_异常_字符串_父类_19


IO_异常_字符串_System_20


Emp类型需要实现序列化接口


IO_异常_字符串_写入文件_21


2ObjectInputStream


IO_异常_字符串_父类_22


IO_异常_字符串_父类_23



九、改写项目

1、修改实体类

确保可以序列化(对象写入文件)和反序列化(从文件中读出对象


IO_异常_字符串_父类_24


2、编写工具类

负责将list写入文件和将list从文件中读取


IO_异常_字符串_父类_25


IO_异常_字符串_System_26


3、编写新版本DAO实现类增删改都要先获得所有员工的集合增删改的操作是对集合的操作

最终需要将修改后的集合写入文件,才完成数据的更新操作。


IO_异常_字符串_父类_27


IO_异常_字符串_System_28



IO_异常_字符串_System_29

4、修改界面类


IO_异常_字符串_写入文件_30



十、File

1、常用方法


IO_异常_字符串_父类_31


2、递归


IO_异常_字符串_父类_32


IO_异常_字符串_父类_33



IO_异常_字符串_写入文件_34



3、递归的应用


IO_异常_字符串_写入文件_35


IO_异常_字符串_System_36

if() {

System.out.println(file2.getAbsolutePath());

}

}

}


public static void showDirByNameLike(File file,String like) { File[] files = file.listFiles();

for (File file2 : files) { if(file2.isDirectory()) {

showDirBySuffix(file2, like);

}

String name = file2.getName();

/*

  1. String
  2. endsWith();
  3. name.contains(like);判断name中是否包含like
  4. xyzabcuabcvw "abc"
  5. name.indexOf(like);找出likename中第一次出现的位置(索引
  6. name.lastIndexOf(like);找出likename中最后一次出现的位置(索引

*/

if(name.lastIndexOf(like)!=-1) { System.out.println(file2.getAbsolutePath());

}

}

}


public static void showDirBySuffix(File file,String suffix) { File[] files = file.listFiles();

for (File file2 : files) { if(file2.isDirectory()) {

showDirBySuffix(file2, suffix);

}

String name = file2.getName(); if(name.endsWith(suffix)) {

System.out.println(file2.getAbsolutePath());

}

}

}


public static void showDir(File file) {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm"); File[] files = file.listFiles();

for (File file2 : files) {

Date date = new Date(file2.lastModified()); String format = sdf.format(date); System.out.println(file2.getName()+

(file2.getName().length()==10?"\t":"\t\t")+format+"\t"+(file2.isFile()?"文件":"文件

")+"\t"+(file2.length()/1024==0?"1kb":file2.length()/1024+"kb"));

if(file2.isDirectory()) { showDir(file2);

}

}

}


}


异常

IO_异常_字符串_System_37


一、前言:

1、为什么要有异常处理一旦出现异常,程序就终止了2、解决方案:

就是进行异常处理


二、异常

1、概念

代码在执行,出现了问题,程序就终止了

2、常见的异常

a、输入不匹配异常

InputMismatchException


IO_异常_字符串_System_38



上面代码输入非数字,出现异常,22222就不输出了,原因是程序终止在异常出现的位置

b、算术异常

ArithmeticException


IO_异常_字符串_System_39


IO_异常_字符串_写入文件_40


c、数组索引越界异常


IO_异常_字符串_父类_41

IO_异常_字符串_System_42





d、空指针异常

对象是null

没有在堆开辟空间(属性和方法都没有),无法访问


IO_异常_字符串_System_43

IO_异常_字符串_父类_44



e、字符串索引越界异常


IO_异常_字符串_父类_45


IO_异常_字符串_System_46


f、日期转换异常


IO_异常_字符串_父类_47

IO_异常_字符串_System_48




三、异常处理

1、try

将可能出现异常的整体代码包含在try块中,如果这块代码出现异常,try块中剩下的代码就不再执行了。

2、catch

try块出现的异常进行捕获处理(输出异常信息)。可以有

任意个:每种异常分别处理

1个:Exception,统一处理


IO_异常_字符串_父类_49


IO_异常_字符串_System_50


IO_异常_字符串_System_51注意:异常的详细信息还需要打印出来,供程序员分析出现异常的原因

e.printStackTrace();打印异常栈

子类异常的catch块要在父类异常catch块的前面


IO_异常_字符串_父类_52


可以将任意异常统一处理


IO_异常_字符串_父类_53


3、finally

在项目中有些代码是必须执行的,没有finally块,无法确保代码一定能执行到。

功能:不管有没有异常,有没有返回,finally块的代码是一定会执行,一般资源关闭的代码。


IO_异常_字符串_写入文件_54


IO_异常_字符串_父类_55



4trycatchfinally有三种组合


IO_异常_字符串_写入文件_56

IO_异常_字符串_System_57

IO_异常_字符串_System_58

IO_异常_字符串_父类_59





5throw主动抛出(自首


IO_异常_字符串_写入文件_60


IO_异常_字符串_写入文件_61


抛出的异常返回给调用save方法的地方,如果这个代码被try所包含,会运行catch进行处理。

6throws向上抛出

在方法中主动抛出一个编译时异常,当前方法不想处理,向上抛出给调用处进行处理。实现类中方法抛出的异常应小于等于父类该方法抛出的异常


IO_异常_字符串_System_62

IO_异常_字符串_父类_63




IO_异常_字符串_System_64





四、异常的层级

Throwable

Error 不处

Exception 异常


五、异常的分类

1、编译时异常

继承Exception,不是RuntimeException,就是编译时异常。

编写时,该方法向上抛出异常,方法上要声明throws。调用该方法的地方会编译报错,强制(提醒)我要进行处理


IO_异常_字符串_写入文件_65


提醒用户对这里进行异常处理

要么继续向上抛出,

谁调用谁处理,如果是main方法向上抛出,jvm进行处理,打印异常栈并终止程序


IO_异常_字符串_父类_66


要么trycatch


IO_异常_字符串_写入文件_67



2、运行时异常

RuntimeException

在编写时不会报错,没有强制必须处理


六、自定义异常

1、步骤

a、新建异常类继承一个异常类

b、生成有参构造方法,可以存入异常的信息

c、将传入的异常信息通过父类的构造方法super(String message),将信息存入detailMessage属性。


IO_异常_字符串_System_68


d、可以在需要处理时候进行单独捕获,可以通过getMessage()获得异常的信息


IO_异常_字符串_写入文件_69


字符串

IO_异常_字符串_父类_70


一、不可变字符串

1String


IO_异常_字符串_父类_71


底层:

是一个常量的字符数组,一旦初始化数组,所对应的数组不能修改


IO_异常_字符串_父类_72


方法:


IO_异常_字符串_写入文件_73


IO_异常_字符串_父类_74


二、可变字符串

1StringBuilder

insert(int offset,Object object); replace(int start,int end,String str); append(Object obj);

2StringBuffer


IO_异常_字符串_写入文件_75








StringBuilderstrB=newStringBuilder("abc");

strB.append("aaa");

strB.replace(1,3,"xx");

strB.insert(1,"ABC");

System.out.println(strB);

//


Stringstr="";

//


StringBuilderstrB=newStringBuilder();

//


longl=System.currentTimeMillis();

//


for(inti=1;i<100000;i++){

//


strB.append(i);

//


}

//


longl2=System.currentTimeMillis();

//


System.out.println(l2-l);

//


StringBufferstrB=newStringBuffer();

//


strB.append(b);

//


strB.insert(offset,b)

//


strB.replace(start,end,str);



}

}





IO_异常_字符串_写入文件_76

3、区别

StringStringBuilder

String为不可变字符串,StringBuilder是可变字符串频繁的拼接操作使用StringBuilder效率更高。StringBuilderStringBuffer StringbuIlder:线程不安全,并发效率高StringBuffer:线程安全,并发效率低