Java SE 高级教程

1、异常(Exception)

程序执行过程中发生中断,我们叫做异常,如果异常。

异常思维导图

在这里插入图片描述

1.1、异常的分类

异常分为检查性异常、运行时异常、和错误。
检查性异常:在编译时发生的异常。
运行时异常:编译完成之后触发的异常。
错误:不是异常,系统抛出的错误,程序员无法处理。

所有的异常类都继承于Exception类,Exception是Throwable的子类,Throwable还有一个子类Error。
在这里插入图片描述

1.2、异常处理的方式

1.2.1、try-catch处理

语法
try{
可能发生异常的代码;
}catch(Exception e){
e.printStackTrace();
}

try----捕捉
catch—处理
Exception --是处理的异常类型
e --异常变量
e.printStackTrace(); --打印异常信息

如下图代码发生了异常,程序终止了运行,我们需要对其进行处理。
在这里插入图片描述
当我们对异常进行处理了,后面的代码也能运行了。
在这里插入图片描述

1.2.2、多重处理异常

当一次性可能会发生多种异常,我们需要多重处理,多重处理异常的时候异常类型要按照大小来排序。
语法
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}

处理方式

package com.Ex;

import java.util.InputMismatchException;
import java.util.Scanner;

import com.sc.sc;

public class exception2 {
   
	public static void main(String[] args) {
   
		try {
   
			int is = 10/0;
			int arr [] = {
   1,3};
			System.out.println(arr[2]);
		} catch (ArithmeticException e) {
   
			System.out.println("被除数不能为0!");
		}catch (ArrayIndexOutOfBoundsException e1) {
   
			System.out.println("下标越界!!");
		}
	
		
	}
}

1.2.3、throws/throw抛出异常

throws/throw抛出异常交给上级处理,直到被处理为止。

throws 出现在方法声明上,而throw通常都出现在方法体内。
throws 表示出现异常的一种可能性,并不一定会发生这些异常;
throw则是抛出了异常,执行throw则一定抛出了某个异常对象。
在这里插入图片描述

1.3、finally块

finally快,无论发生什么异常,块里的代码都会执行!
除非在try或者catch里面加System.exit(0);直接退出虚拟机。
在这里插入图片描述

1.4、异常分为处理可不处理

编译时异常
编译时异常一定要处理,要么try catch住,要么往外抛,谁调用,谁处理,不处理编译器不会让你通过,就无法执行。

运行时异常
不是必须进行try catch的异常,运行时异常一般是由程序员造成的异常,jvm会一直把异常往上抛,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出,最后要么就是线程终止,要么就是主程序终止。

常见运行时异常
除数不能为0异常:ArithmeticException
下标越界异常:ArrayIndexOutOfBoundsException
空指针异常:NullPointerException

错误
指的是系统级别的异常,程序员无法处理。

1.5、自定义异常

自定义异常要继承Exception异常,通过throws/throw进行抛出。

package com.Ex;

public class myException extends Exception {
   

	public myException() {
   

	}

	public myException(String msg) {
   
			super(msg);
	}

	public static void main(String[] args) {
   
		try {
   
			new myException().show(11);
		} catch (myException e) {
   
			System.out.println(e.getMessage());
		}
	}

	public void show(int age) throws myException {
   
		if (age < 18) {
   
			throw new myException("未成年!!!");
		}
	}
}



运行结果

未成年

2、IO流

2.1、file类

file代表目录和文件,主要适用于对目录和文件的操作。
创建一个文件对象

//创建一个文件对象
		File file = new File("F:\\");

创建文件

package com.files;

import java.io.File;
import java.io.IOException;

public class file1 {
   
	public static void main(String[] args) throws IOException {
   
		//创建一个文件对象
		File file = new File("F:\\zhou.txt");
		//判断文件是否存在
		if(!file.exists()) {
   
			//不存在就创建一个新文件
			file.createNewFile();
		}
		System.out.println("文件创建成功!");
		
	}
}

文件创建成功!

创建文件夹

package com.files;

import java.io.File;
import java.io.IOException;

public class file1 {
   
	public static void main(String[] args) throws IOException {
   
		//创建一个文件对象
		File file = new File("F:\\ss");
		//判断文件是否存在
		if(!file.exists()) {
   
			//不存在就创建一个新文件夹
			file.mkdir();
		}
		System.out.println("文件夹创建成功!");
		
	}
}

文件夹创建成功!

创建多级目录

package com.files;

import java.io.File;
import java.io.IOException;

public class file1 {
   
	public static void main(String[] args) throws IOException {
   
		//创建一个文件对象
		File file = new File("F:\\ss\\dd\\cc\\gg");
		//判断文件是否存在
		if(!file.exists()) {
   
			//不存在就创建一个新文件夹
			file.mkdirs();
		}
		System.out.println("多级文件夹创建成功!");
		
	}
}

多级文件夹创建成功!

2.1.1、file类常用方法

package com.files;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class file2 {
   
	public static void main(String[] args) {
   
		File file = new File("F:\\zhou.txt");
		//判断是否文件是否存在
		System.out.println(file.exists());
		//判断是否是文件夹
		System.out.println(file.isDirectory());
		//判断是否是文件
		System.out.println(file.isFile());
		//获取文件的长度
		System.out.println(file.length());
		//获取文件的最后一修改时间
		long time = file.lastModified();
		Date date = new Date(time);
		SimpleDateFormat sim = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
		System.out.println("文件的最后修改时间为:"+sim.format(date));
		
		//设置文件的修改时间
		file.setLastModified(0);
		//文件重命名
		File file1 = new File("F:\\zbb.txt");
		file.renameTo(file1);
		System.out.println("文件名字修改成功!");
	}
}

运行结果

true
false
true
30
文件的最后修改时间为:20200827234439秒
文件名字修改成功!

2.1.2、使用file类递归读取磁盘下所有文件

package com.files;

import java.io.File;

public class file3 {
   
	public static void main(String[] args) {
   
		File file = new File("F:\\");
		new file3().search(file);
	}

	public void search(File file) {
   
		//得到文件夹内的子文件下面的子文件夹
		File[] files = file.listFiles();
		//如果时目录就进去循环
		if (file.isDirectory()) {
   
			//遍历文件夹
			for (File file2 : files) {
   
				//遍历所有不是隐藏文件夹
				if (!file2.isHidden()) {
   
					System.out.println(file2.getPath() + file2.length() + "字节");
					//反复调用方法
					search(file2);
				}
			}

		}
	}

}

运行结果

F:\附加作业-秒表0字节
F:\附加作业-秒表\.project977字节
F:\附加作业-秒表\css0字节
F:\附加作业-秒表\img0字节
F:\附加作业-秒表\js0字节
F:\附加作业-秒表\计时器已完成.html1768字节
F:\附加作业-秒表\计时器未完成.html2475字节


2.2、流(Stream)的介绍

流是一连串流动的数据,不同介质之间有数据交互的时候可以使用流,数据源可以是文件,还可以是数据库,网络甚至是其他的程序,以先进先出的方式发送和接收数据的通道。

举个例子:站在文件的角度来说,读取文件叫做输入流,向文件写入东西叫做输出流。

2.3、流的分类

流分为输出流和输入流,由于传输的格式不同分为字节流和字符流。
输出流:读取文件信息。
输入流:向文件写入信息。

字节流:指8位的通用字节流,以字节为基本单位,在java.io包中,对于字节流进行操作的类大部分继承于InputStream(输入字节流)类和OutputStream(输出字节流)类;

字符流:指16位的Unicode字符流,以字符(两个字节)为基本单位,非常适合处理字符串和文本,对于字符流进行操作的类大部分继承于Reader(读取流)类和Writer(写入流)类。

2.4、字节流

2.4.1、FileInputStream类读取文件

FileInputStream是字节输入流继承于InputStream。
它的作用是将文件中的数据输入到内存中,我们可以利用它来读文件;
由于它属于字节流,因此在读取Unicode字符(如中文)的文件时可能会出现问题。

package com.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class fileinput {
   
	public static void main(String[] args) throws IOException {
   
		//创建文件对象
		File file = new File("f:\\zbb.txt");
		//创建文件输入流对象
		FileInputStream fis = new FileInputStream(file);
		//创建字节数组
		byte [] by = new byte[(int) file.length()];
		//将读取的数据放到字节数组中
		fis.read(by);
		//将数组中的数据转换成字符串
		System.out.println(new String(by));
		//使用完流记得关闭
		fis.close();
	}
}

运行结果

sdfsdfsdfsdf
sdfsdfsd
sdfsdf

2.4.2、使用FileOutputStream写文件

FileOutputStream类称为文件输出流,继承于OutputStream类,是进行文件写操作的最基本类;
它的作用是将内存中的数据输出到文件中,我们可以利用它来写文件。

package com.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class fileOutPutS {
   
	public static void main(String[] args) throws IOException {
   
		//创建文件对象
		File file = new File("f:\\zbb.txt");
		//创建文件输出流对象 ,附加第二个参数true,指定进行文件追加,默认为不追加
		FileOutputStream fos = new FileOutputStream(file,true);
		//创建数据源
		String str = "helloword";
		//将字符串转换成byte数组
		char[] charArray = str.toCharArray();
		//遍历byte数组,将数据写入到输出流
		for (int i = 0; i < charArray.length; i++) {
   
			fos.write(charArray[i]);
		}
		fos.close();
		System.out.println("写入数据成功!");
	}
}

运行结果

写入数据成功!

2.4.3、使用文件输出流输入流复制文件

package com.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class cope {
   
	public static void main(String[] args) throws IOException {
   
		//创建源文件对象
		File file = new File("f:\\zbb.txt");
		//创建目标文件对象
		File file2 = new File("f:\\zhou.txt");
		if(!file2.exists()) {
   
			file2.createNewFile();
		}
		//使用源文件创造输入流对象
		FileInputStream fis = new FileInputStream(file);
		//使用目标文件创建输出流对象
		FileOutputStream fos = new FileOutputStream(file2);
		//创建字节数组用于缓冲
		byte [] by = new byte[1024];
		//循环从输入流中读取数据,如果读到-1说明没有数据可读取
		while (fis.read(by)!=-1) {
   
			//写入到文件输出流中
			fos.write(by);
		}
		System.out.println("复制成功!");
		fis.close();
		fos.close();
	}
}

输出结果

复制成功!

2.5、字符流

字节输入输出流可以高效的读写文件,对于Unicode编码的文件可能出现乱码,所以我们使用字符流来解决这个问题。

字符流主要涉及到以下四个类
FileReader类和FileWriter类;
BufferedReader类和BufferedWriter类。

2.5.1、FileReader读取文件

FileReader 是Reader子类,称为文件读取流,允许以字符流的形式对文件进行读操作。

package com.io;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class fileReaders {
   
	public static void main(String[] args) throws IOException {
   
		//创建文件对象
		File file = new File("f:\\zhou.txt");
		//创建文件读取流对象
		FileReader fr = new FileReader(file);
		//创建字符数组,长度是文件的长度
		char [] c = new char[(int) file.length()];
		//将读取的数据存到字符数组中
		fr.read(c);
		//将字符数组以字符串的形式输出
		System.out.println(new String(c));
		}
}

2.5.2FileWrite写文件

FileWriter类称为文件写入流,以字符流的形式对文件进行写操作。

package com.io;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class write {
   
	public static void main(String[] args) throws Exception {
   
		//创建文件对象
		File file = new File("F:\\zz.txt");
		//文件不存在就创建
		if(!file.exists()) {
   
			file.createNewFile();
		}
		//创建文件写入流对象
		FileWriter fWriter = new FileWriter(file);
		//以字符流的形式把数据写入到文件中
		String str = "asdasdasdfasfa";
		char[] chars = str.toCharArray();
		fWriter.write(chars);
		fWriter.close();
	}
}

2.5.3、字符流复制文件

package com.io;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class cope1 {
   
	public static void main(String[] args) throws Exception {
   
		// 创建源文件对象
		File file = new File("f:\\zbb.txt");
		// 创建目标文件对象
		File file2 = new File("f:\\z1.txt");
		if (!file2.exists()) {
   
			file2.createNewFile();
		}
		FileReader fReader = new FileReader(file);
		FileWriter fWriter = new FileWriter(file2);
		
		//创建一个字符数组
		char [] c= new char[1024];
		while(fReader.read(c)!=-1) {
   
			fWriter.write(c);
		}
		System.out.println("复制成功!");
		fWriter.close();
		fReader.close
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值