Java se:IO流,异常
程序员文章站
2022-06-09 20:07:20
...
异常
Throwable
|--Error 严重问题,我们不处理。
|--Exception
|--RuntimeException 运行期异常,我们需要修正代码
|--非RuntimeException 编译期异常,必须处理的,否则程序编译不通过
- 处理方案:
try…catch…finally //自己编写处理代码,后面的程序可以继续执行
throws //把自己处理不了的,在方法上声明,告诉调用者,这里有问题,后面的程序不能继续执行 - throw:
在方法体中,后面跟的是异常对象名,并且只能是一个
throw抛出的是一个异常对象,说明这里肯定有一个异常产生了 - throws:
在方法声明上,后面跟的是异常的类名,可以是多个
throws是声明方法有异常,是一种可能性,这个异常并不一定会产生 - finally:
被finally控制的语句一定会执行
特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
作用:释放资源(IO流和数据库中会用到) - 如果在catch里面有return,finally会执行,,在return前执行(准确来说应该是中间)
public class Demo {
public static void main(String[] args) {
System.out.println(getInt());
}
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;
/*
* return a在程序执行到这一步的时候,这里不是return a而是return 30;这个返回路径就形成了。
* 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
* 再次回到以前的返回路径,继续走return 30;
* return a;->finally;->return 30;
*/
} finally {
a = 40;
//return a;如果这样结果就是40了。
}
return 0;//万一没有异常时,程序必须要一个返回值
}
}
- 自定义异常:
继承自Exception或者RuntimeException,只需要提供无参构造和一个带参构造即可 - 注意:
- 父的方法有异常抛出,子的重写方法在抛出异常的时候必须要小于等于父的异常
- 父抛出多个异常,子重写父时,只能抛出 相同的异常 或 父异常的子异常 ,子不能抛出父没有的异常
- 重写方法没有异常抛出,子方法不可抛出异常,如果子有异常,只能try,不能throws
File类
- IO流操作中大部分都是对文件的操作,所以Java就提供了File类供我们来操作文件
- 构造方法
A:File file = new File(“e:\demo\a.txt”);
B:File file = new File(“e:\demo”,“a.txt”);
C:File file = new File(“e:\demo”); File file2 = new File(file,“a.txt”);
仅仅是一个路径的表示,不代码具体的事物一定是存在的。 - 绝对路径:路径以盘符开始 c:\\a.txt
相对路径:路径不以盘符开始 a.txt - 成员方法:
- 创建功能:
public boolean createNewFile()
public boolean mkdir()
public boolean mkdirs() - 删除功能:
public boolean delete()
注意:Java删除不走回收站。要删除一个文件夹,则该文件夹不能包含文件或文件夹 - 重命名功能:
public boolean renameTo(File dest) - 判断功能:
public boolean isDirectory()
public boolean isFile()
public boolean exists()
public boolean canRead()
public boolean canWrite()
public boolean isHidden() - 基本获取功能:
public String getAbsolutePath()
public String getPath()
public String getName()
public long length() //获取长度,字节数
public long lastModified() //最后一次修改时间,毫秒值 - 高级获取功能:
public String[] list() //指定目录下所有文件或文件夹的名称数组
public File[] listFiles() //指定目录下所有文件或文件夹的File数组
- 创建功能:
IO流
- IO用于在设备间进行数据传输的操作
- 分类:
- 流向
输入流 读取数据(程序为参照物)
输出流 写出数据 - 数据类型
字节流:
字节输入流
字节输出流
字符流:(记事本能打开的内容使用该流)
字符输入流
字符输出流
- 流向
- 字节流的抽象基类:
InputStream ,OutputStream。
字符流的抽象基类:
Reader , Writer。
字节流
字节流写数据FileOutputStream
-
字节流写数据的方式:
public void write(int b)
public void write(byte[] b)
public void write(byte[] b,int off,int len) -
操作步骤:
a:创建字节输出流对象
b:调用write()方法
c:释放资源
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("hello".getBytes();
fos.close();
字节流读取数据FileInputStream
- 操作步骤:
a:创建字节输入流对象
b:调用read()方法
c:释放资源
FileInputStream fis = new FileInputStream("fos.txt");
//方式1 一次读取一个字节
int by = 0;
while((by=fis.read())!=-1) {
System.out.print((char)by);
}
//方式2 一次读取一个字节数组,提高了操作效率
byte[] bys = new byte[1024];
int len = 0;
while((len = fis.read(bys))!=-1){
System.out.println(new String(bys,0,len));
}
fis.close();
字节缓冲输出流BufferedOutputStream
字节缓冲输入流BufferedInputStream
- 创建对象:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bos.txt"));
字符流/转换流
- 字节流操作中文数据不是特别的方便,所以就出现了转换流。转换流的作用就是把字节流转换字符流来使用。
- 转换流其实是一个字符流
字符流 = 字节流 + 编码表 - 字符流
- Reader
- InputStreamReader
- FileReader
- BufferedReader
- InputStreamReader
- Writer
- OutputStreamWriter
- FileWriter
- BufferedWriter
- OutputStreamWriter
- Reader
字符输出流 OutputStreamWriter/子类FileWriter
- 构造方法:
OutputStreamWriter(OutputStream os):默认编码,GBK
OutputStreamWriter(OutputStream os,String charsetName):指定编码。 - OutputStreamWriter写数据方法:
public void write(int c)
public void write(char[] cbuf)
public void write(char[] cbuf,int off,int len)
public void write(String str)
public void write(String str,int off,int len)
字符输入流 InputStreamReader/子类FileReader
- 构造方法:
InputStreamReader(InputStream is):默认编码,GBK
InputStreamReader(InputStream is,String charsetName):指定编码 - InputStreamWriter读数据方法:
public int read()
public int read(char[] cbuf)
字符缓冲输出流BufferedWriter
- 特殊功能:
void newLine();
字符缓冲输入流BufferedReader
- 创建对象:
BufferedReader br = new BufferedReader(new FileReader("bw.txt"));
- 特殊功能:
String readLine();
其他流
操作基本数据类型的流
DataInputStream
DataOutputStream
内存操作流
- 操作字节数组
ByteArrayInputStream
ByteArrayOutputStream - 操作字符数组
CharArrayReader
CharArrayWrite - 操作字符串
StringReader
StringWriter
打印流
- 字节打印流,字符打印流
- 特点:
只操作目的地,不操作数据源
可以操作任意类型的数据
如果启用了自动刷新,在调用println()方法的时候,能够换行并刷新
可以直接操作文件 - 启动自动刷新
PrintWriter pw = new PrintWriter(new FileWriter(“pw2.txt”), true);
这个时候不仅仅自动刷新了,还实现了数据的换行。
等价于:
bw.write();
bw.newLine();
bw.flush();
标准输入输出流
- System类下面有这样的两个字段
in 标准输入流
out 标准输出流
随机访问流
RandomAccessFile
- 可以按照文件指针的位置写数据和读数据
合并流
SequenceInputStream(InputStream s1, InputStream s2)
- 把多个输入流的数据写到一个输出流中。
序列化流
可以把对象写入文本文件或者在网络中传输
- 序列化流
ObjectOutputStream
反序列化流
ObjectInputStream - 实现序列化
让被序列化的对象所属类实现序列化接口。
该接口是一个标记接口。没有功能需要实现。 - transient关键字声明不需要序列化的成员变量
Properties集合
Properties作为Map集合的使用
NIO
JDK4出现的NIO,对以前的IO操作进行了优化,提供了效率。
上一篇: php日历代码
下一篇: java se基础--异常处理