IO

IO_异常_字符串_System

一、前言

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

二、IO流的使用步骤

1、声明文件源

2、声明流关联源

3、使用流

4、关闭流

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

三、字节流

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

1、读取方法

aint read() 每次读一个字节

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

IO_异常_字符串_System_03

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

1、写入方法

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

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

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

IO_异常_字符串_System_05

四、字符流

1、Reader FileReader

int read(); 读取一个字符

IO_异常_字符串_父类_06

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

IO_异常_字符串_父类_07

2、Writer FileWriter

FileWriter(file);默认覆盖写

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

IO_异常_字符串_父类_08

五、例子

1、文件拷贝

IO_异常_字符串_System_09

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

员工入职

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

IO_异常_字符串_System_11

获得所有员工

IO_异常_字符串_System_12

IO_异常_字符串_父类_13

六、流的分类

1、方向

输入流输出流

2、操作单位

字节流字符流

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

七、处理流

1、缓冲流

BufferedReader

每次可以读一行

BufferedWriter

生成新行员工入职

IO_异常_字符串_父类_14

IO_异常_字符串_父类_15

获得所有员工

IO_异常_字符串_System_16

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

2、转换流

InputStreamReader

IO_异常_字符串_父类_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_异常_字符串_System_19

IO_异常_字符串_父类_20

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

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

2ObjectInputStream

IO_异常_字符串_System_22

IO_异常_字符串_父类_23

九、改写项目

1、修改实体类

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

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

2、编写工具类

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

IO_异常_字符串_System_25

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

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

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

IO_异常_字符串_System_27

IO_异常_字符串_父类_28

IO_异常_字符串_父类_29

4、修改界面类

IO_异常_字符串_父类_30

十、File

1、常用方法

IO_异常_字符串_System_31

2、递归

IO_异常_字符串_父类_32

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

IO_异常_字符串_父类_34

3、递归的应用

IO_异常_字符串_System_35

IO_异常_字符串_写入文件_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);找出like在name中第一次出现的位置(索引)
  6. name.lastIndexOf(like);找出like在name中最后一次出现的位置(索引)

*/

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_异常_字符串_写入文件_38

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

b、算术异常

ArithmeticException

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

IO_异常_字符串_父类_40

c、数组索引越界异常

IO_异常_字符串_System_41

IO_异常_字符串_System_42

d、空指针异常

对象是null

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

IO_异常_字符串_父类_43

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

e、字符串索引越界异常

IO_异常_字符串_System_45

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

f、日期转换异常

IO_异常_字符串_父类_47

IO_异常_字符串_System_48

三、异常处理

1、try

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

2、catch

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

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

1个:Exception,统一处理

IO_异常_字符串_父类_49

IO_异常_字符串_父类_50

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

e.printStackTrace();打印异常栈

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

IO_异常_字符串_父类_52

可以将任意异常统一处理

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

3、finally

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

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

IO_异常_字符串_父类_54

IO_异常_字符串_System_55

4trycatchfinally有三种组合

IO_异常_字符串_父类_56

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

IO_异常_字符串_System_58

IO_异常_字符串_System_59

5throw主动抛出(自首)

IO_异常_字符串_System_60

IO_异常_字符串_System_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_异常_字符串_写入文件_68

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

IO_异常_字符串_父类_69

字符串

IO_异常_字符串_父类_70

一、不可变字符串

1String

IO_异常_字符串_System_71

底层:

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

IO_异常_字符串_System_72

方法:

IO_异常_字符串_父类_73

IO_异常_字符串_System_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、区别

String和StringBuilder:

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