java基础三(异常、IO流、正则)
目录
1.异常
2.IO
3.正则表达式
一、异常
异常是编程语言用来描述当某种非预期情况发生时该如何处理的一种机制。
程序出错分为:编译错误、运行错误。
编译错误:是语法错误,通常编译器能检测发现。
运行错误:在运行期间发生,计算机是无法检测到的。
java采用面向对象的方法来处理异常。
1、抛出异常(throw):如果发生异常,则这个方法会生成代表该异常的一个对象。并停止当前执行路径。把异常对象交给JRE。
2、捕获异常(catch):JRE得到该异常后,在方法调用栈中查找。从生成异常的方法开始回溯,直到找到对应的处理异常的代码为止。
异常分类: 根类java.lang.Throwable

Error类异常是java语言本身来抛出和捕获。
Exception类异常是编程者需要抛出和捕获。
异常处理:
1、RuntimeException : 运行时异常
ArithmeticException 异常 (试图除于0)
NullPointerException 空指针异常
ClassCastException 异常 (类型转换异常)
ArrayIndexOutOfBoundsException (数组越界)
NumderFormatException (数字格式异常)
2、CheckedException : 检查时异常
所有不是运行时的异常都叫检查时异常。
如IOException、SQLException等以及用户自己定义的异常
这些异常在编译的时候就会出错
处理需要用到:try cath(捕获) throws(声明异常)
自定义异常类:
要求所定义的异常类必须是Exception的子类。并且try语句中只包含一个抛出异常语句。
public class text{ public static void main(String args[]){ try{ throw new Throwable("第一个自定义异常"); }catch(Throwable e){ e.printStackTrace(); } } }
try-catch语句匹配原则:
- 尽量用父类去捕获其所有的子类异常。
- catch子句的顺序排列应该将最特殊的排在最前面,依次逐步一般化。
finally语句:无论执行那个异常,最后一定要去执行,保证了控制流在转到其他路径以前,程序状态能被统一管理。经常用来做一些流的关闭操作。
二、IO
核心流图:

还有Closeable关闭流接口、Flushable刷新流接口、Serializable序列化接口

1、在软件角度:
输入流:一个可以读取字节序列的对象。
输出流:一个可以写入字节序列的对象。
2、在硬件角度:
输入流:是从外部设备流向中央处理器的数据流。
输出流:是从中央处理器流向外部设备的数据流。
流的分类:
1、按功能分:
节点流:直接从数据源读写数据

处理流(包装流):经过封装处理

2、按数据分
字节流:按字节进行读取数据(二进制流)
字符流:按字符进行读取数据,底层还是基于字节流操作,自动搜寻指定码表(双字节流,因为Unicode使用的是连个字节表示一个字符)
对File的操作
file文件是一个重要的非流类。
通常需要做的是对文件、文件夹的遍历。例子:
//一些File的属性知识: //状态判断:exists() 是否存在,isFile() 是否是文件, isDirectory() 是否是目录 //创建目录:mkdir() 需要确保上一级目录存在。 mkdirs() 上一级目录可以不存在 //列出下一级: list() : 列出下一级名称 lists() : 列出下一级File对象 listRoots() : 列出所有的盘符 public class text{ public static void main(String[] args) { String path = "D:\\java"; //要遍历的路径 File file = new File(path); //获取其file对象 find(file); } private static void find(File file){ File[] files = file.listFiles(); for(File f:files ){ if(f.isDirectory()) //若是目录,则递归打印该目录下的文件 find(f); //使用递归往下找 if(f.isFile()) //若是文件,直接打印 System.out.println(f); } } }
处理字符集乱码
因为不同的字符可能使用的码表不一样,如:ASCLL、UTF-8等

1、文件编码:
需要编码为字节数组再进行处理。集成有3个方法。
getBytes()、getBytes(Charest charest)、getBytes(String charestName)
都转换为字节数组:char[ ]
2、文件解码:
解码可以使用字符串解码。new String( datas, start, end, code);
datas:需要解码的内容。
start :开始解码的位置。 end : 结束解码的位置。
code : 需要解码成的编码格式。
注意:有时候解码中。会出现乱码的情况。
因为: 字节数不够、字符集不统一。
知道IO流的四大抽象类
InputStream 、OutputStream、Reader、Writer
IO操作的标准步骤
创建源、选择流、操作、释放(关闭流)
例子1(查看abc.txt中的内容):
//1、创建源 File src = new File("abc.txt"); //2、选择流 InputStream stream = null; try { stream = new FileInputStream(src); //3、操作(读取) int temp; while((temp=stream.read())!=-1) { //不等于-1 控制索引 System.out.println((char)temp); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { //4、释放 if(stream != null) { stream.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
例子2 (两个文件之间的拷贝):
如果拷贝的是图片则需要写 : new byte[stream.available()];
//其实就是从一个文件中进行读操作。然后在另外一个文件中进行写操作。
public static void copy(String inputting,String outting) { //1、创建源 File src = new File(inputting);//拷贝的文件 File out = new File(outting);//拷贝到的文件 //2、选择流 InputStream stream = null;//输入流 OutputStream outs = null;//输出流 try { stream = new FileInputStream(src); outs = new FileOutputStream(out); //3、操作(分段读取) byte[] flush = new byte[1024]; //new byte[stream.available()]; int len = -1; while((len=stream.read(flush)) != -1) { //这里就是可以进行读取文件了 //接下来是写入到需要拷贝到的文件中。 outs.write(flush); outs.flush(); //都需要flush一下。 } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { //4、释放 //需要分别关闭 if(outs != null) { outs.close(); } if(stream != null) { //先打开后关闭 stream.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
文件字节流的选择
1、FileInputStream:通过字节方式读取文件,适合所有内容(图像,视频)
如果是全字符:推荐使用FileReader
2、FileOutputStream:通过字节方式写出或追加数据。适合所有内容(图像,视频)
如果是全字符: 推荐使用FileWriter
FileReader、FileWriter 是属于文件字符流的。

内存操作流(字符、字节数组流)
1、字节数组流:
相当于电脑上的另外一块内存,或者是远程服务器上的内存、或者网络上的一块内存。
不需要关系流。
和其他流不同的是:
1、创建的是字节数组。 byte[ ] src = 内容.getBytes();
2、释放的资源可以不处理。(不需要关闭流也可以)
两个:ByteArrayInputStream、ByteArrayOutputStream
因为图片是特殊的。不能直接通过java出入到字节数组中。这时候需要使用“综合对象流”

操作步骤:

2、字符数据流: CharArrayReader字符数组输入流与CharArrayWriter字符数组输出流
3、字符串流:StringReader 与 StringWriter
数据处理流(缓冲流)
使用缓冲流,直接在其他流前面加。可以提高性能。
如:new BufferedOutputStream(new FileOutputStream(dest))

1、字节缓冲流:BufferedInputStream 、BufferedOutputStream
2、字符缓冲流:BufferedReader、BufferedWriter
数据流、对象流、打印流
1、数据流:DateInputStream、DateOutputStream、
保留了原来的数据、数据类型。操作基本数据类型、字符串
2、对象流:ObjectInputStream、ObjectOutputStream
不是所有的对象都可以用。需要使用serializable接口。才可以使用
3、打印流:PrintStream。平常用的System.out.print也是打印流
三、正则表达式
描述某种匹配检索规则的字符串。用来指定字符串模式的。将java.util.regex包以及java.net.URL类相结合,可用于网络上的字符输入流的模式字符串搜索上。
1、Pattern类:包中有一个模式(Pattern)类,将正则表达式字符串编译成模式对象来进行快速模式匹配。
Pattern pattern = Pattern.compile(String expression,int flags);
expression是正则表达式,flags是表达式字符的某些属性。
2、Matcher类:包中有另外一个匹配器类。
Matcher matcher = pattern.macther(input); //进行模式串的匹配。
其里面还有很多属性。可以查找API文档进行使用。

浙公网安备 33010602011771号