欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
    • Writer
      • OutputStreamWriter
        • FileWriter
      • BufferedWriter

字符输出流 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操作进行了优化,提供了效率。

相关标签: java se java