Java语言基础
IO流
- IO流概述:
IO流用来处理设备之间的数据传输,上传文件和下载文件;Java对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中。 - IO流分类:
a:按照数据流向
输入流:读入数据
输出流:写出数据
b:按照数据类型
字节流:可以读写任何类型的文件 比如音频 视频 文本文件
字符流:只能读写文本文件 - IO流前奏:
从了解异常和File类开始;
File表示的是IO流将来要操作的文件,而常见操作文件无非就是上传文件和下载文件,在这个操作的过程中可能出现问题;
出现问题后,我们需要对对应的代码进行处理,即异常的处理。
异常
- 简述:异常就是Java程序在运行过程中出现的错误
- 分类:编译时异常和运行时异常
严重问题: Erro,不予处理,因为这种问题一般是很严重的问题,比如: 内存溢出
非严重问题: Exception
编译时异常: 非RuntimeException
运行时异常: RuntimeException - JVM默认是如何处理异常的?
main函数收到这个问题时,有两种处理方式:
a:自己将该问题处理,然后继续运行
b:自己没有针对的处理方式,只有交给调用main的jvm来处理,jvm有一个默认的异常处理机制,就将该异常进行处理,并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上,同时将程序停止运行;
//例如:
public class demo {
public static void main(String[] args) {
int a=3;
int b=0;
System.out.println(a/b);
}
}
/*JVM处理异常结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
//除数为0了
*/
- try…catch的方式处理异常1
try...catch处理异常的基本格式:
try {
可能出现问题的代码 ;
}catch(异常名 变量名){
针对问题的处理 ;
}finally{
我们一般在finally里面喜欢做一些善后收尾工作,比如释放资源
}
如:if (scanner != null) {
scanner.close(); //释放资源
}
变形格式:
try {
可能出现问题的代码 ;
}catch(异常名 变量名){
针对问题的处理 ;
}
注意事项:
a: try中的代码越少越好
b: catch中要做处理,哪怕是一条输出语句也可以.(不能将异常信息隐藏)
- try…catch的方式处理异常2
try {
可能出现问题的代码 ;
}catch(异常名1 变量名1){
对异常的处理方式 ;
}catch (异常名2 变量名2){
对异常的处理方式 ;
}....
- 注意:
你能明确的异常名,尽量名确,不要全用异常的父类捕获了,如果你捕获的异常,是平级关系,谁前谁后无所谓,如果异常之间有继承关系,父类异常放在最后;
//异常处理演示
public class Demo1 {
public static void main(String[] args) {
int a=1;
int b=0;
int[] arr={2,3};
arr=null;
try {
System.out.println(a / b);
System.out.println(arr[3]);
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组角标越界异常");
}catch (ArithmeticException e){
System.out.println("除数为0的异常");
}catch (NullPointerException e){
System.out.println("空指针异常");
}catch (Exception e){
System.out.println("其他异常");
}
}
}
- 请写出最常见到的5个RuntimeException异常:
ClassCastException:将对象强制转换为不是实例的子类时
IndexOutOfBoundsException:索引越界异常
ArithmeticException:异常的运算
ArrayStoreException:将错误类型的对象存储到一个对象数组时抛出的异常
NullPointerException:空指针异常
- 编译期异常和运行期异常的区别:
所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常;
编译时异常: Java程序必须显示处理,否则程序就会发生错误,无法通过编译;
运行时异常: 无需显示处理,也可以和编译时异常一样处理 - 编译期的处理方式:
一种抛给调用者,处理,谁调用谁处理;(throws的方式处理异常)
另外一种就是自己捕获处理
public class Demo1 {
public static void main(String[] args) throws CloneNotSupportedException{
Dog dog = new Dog();
//编译期异常,我们自己不捕获处理,那么就抛给调用者,去处理
dog.clone();
//编译期异常的处理
try {
aa();
} catch (ParseException e) {
e.printStackTrace();
}
}
//ParseException:解析异常
public static void aa() throws ParseException{
new SimpleDateFormat("yyyy-MM-dd").parse("2017:11-11");
}
}
class Dog implements Cloneable{
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
- throw和throws的区别:
A:throw的概述: 在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
B:throws和throw的区别:
a:throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
b:throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
这个异常对象可以是编译期异常对象,可以是运行期异常对象
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常 - finally关键字
用在try…catch…语句中 , 作用: 释放资源 . 特点: 始终被执行(JVM不能退出)
还有两个关键字:
final: 是一个状态修饰符, 可以用来修饰类 , 变量 , 成员方法,被修饰的类不能被子类继承, 修饰的变量其实是一个常量不能被再次赋值,修饰的方法不能被子类重写
finalize: Obejct类中的一个方法,用来回收垃圾
public class Demo1 {
public static void main(String[] args) {
String dateStr = "2015-11/17";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd") ;
Date date = null;
try {
date = dateFormat.parse(dateStr);
} catch (ParseException e) {
// e.printStackTrace();
System.out.println("解析异常");
} finally {
System.out.println("此行代码被执行了。。");
}
// 输出
System.out.println(date);
}
}
/*结果:
解析异常
此行代码被执行了。。
null
*/
- 自定义异常
a:为什么需要自定义异常?
因为在以后的开发过程中,我们可能会遇到各种问题,而Jdk不可能针对每一种问题都给出具体的异常类与之对应,为了满足需求,我们就需要自定义异常.
b:自定义异常概述 需要将我们自定义的异常类纳入到我们的异常体系中:
继承自Exception
继承自RuntimeException
//自定义模拟银行取钱,发现钱不够,给出异常提示
public class NoMoneyException extends RuntimeException {
public NoMoneyException(String s) {
super(s);
}
}
public class MyTest {
public static void main(String[] args) {
int num = 100;//定义总金额为100;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的取款金额:");
int money = scanner.nextInt();
if (money <= num) {
num -= money;
System.out.println("你的余额还剩余"+num);
} else {
throw new NoMoneyException("余额不足");
}
}
}
/*结果:
请输入你的取款金额:
200
Exception in thread "main" org.westos.demo4.NoMoneyException: 余额不足
*/
- 异常的注意事项及如何使用异常处理:
A:异常注意事项(针对编译期异常)
a:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类,或者子类不抛出异常也是可以的。
b:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常,或者子类不抛出异常也是可以的。
c:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws.
B:如何使用异常处理
如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
区别:
后续程序需要继续运行就try
后续程序不需要继续运行就throws
如果JDK没有提供对应的异常,需要自定义异常。
File类
- 概述:
- 文件和目录路径名的抽象表示形式;这个File类可以用来表示文件,也可以用来表示目录
- 用户界面和操作系统使用与系统相关的路径名字符串来命名文件和目录。此类呈现分层路径名的一个抽象的、与系统无关的视图。抽象路径名 有两个组件:
a:一个可选的与系统有关的前缀字符串;
比如盘符,"/" 表示 UNIX 中的根目录,"\\" 表示 Microsoft Windows UNC 路径名。
b:零个或更多字符串名称的序列;
抽象路径名中的第一个名称是目录名,对于 Microsoft Windows UNC 路径名则是主机名。抽象路径名中第一个名称之后的每个名称表示一个目录;最后一个名称既可以表示目录,也可以表示文件。空抽象路径名没有前缀和名称序列。 - 无论是抽象路径名还是路径名字符串,都可以是绝对路径名或相对路径名;
a:绝对路径名是完整的路径名,不需要任何其他信息就可以定位它所表示的文件;
b:相对路径名必须使用取自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来解析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。 - 在处理 UNIX 平台的根目录,以及 Microsoft Windows 平台的盘符、根目录和 UNC 路径名时,将用到前缀这一概念。如下所示:
a:对于 UNIX 平台,绝对路径名的前缀始终是 “/”。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 “/” 且名称序列为空。
b:对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个 “:” 组成。如果路径名是绝对路径名,还可能后跟 “\”。UNC 路径名的前缀是 “\\”;主机名和共享名是名称序列中的前两个名称。没有指定驱动器的相对路径名没有前缀。
File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。
- 构造方法:
File(String pathname):根据一个路径得到File对象
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象 - 功能方法:
a:创建功能
public boolean createNewFile():创建一个新的文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了 注意这个方法只能创建单层目录 如果创建多层目录得一层一层创建
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来 可以创建多层目录 当然也可以创建单层目录
b:删除功能
public boolean delete():删除文件或者文件夹
注意:删除文件夹时 这个文件夹是空文件夹 如果这个文件夹里面有文件,则不能删除
//例:E盘中一个名为demo文件夹包含多级文件夹,递归删除,将demo直接删除完整;
import java.io.File;
public class MyTest {
public static void main(String[] args) {
File file = new File("E:\\demo");
remove(file);
}
private static void remove(File file) {
File[] files = file.listFiles();
for (File f : files) {
if (f.isFile()){
f.delete();
}else {
remove(f);
}
}
file.delete();
}
}
c:重命名功能
public boolean renameTo(File dest):把文件重命名为指定的文件路径
//判断多级目录下是否有以 .jpg为后缀名的文件,如果有,把后缀名改成.png
import java.io.File;
public class Demo {
public static void main(String[] args) {
//判断多级目录下是否有以 .jpg的文件,如果有,把后缀名改成.png
//封装多级目录
File file = new File("E://picture");
updateFolder(file);
System.out.println("修改完成");
}
private static void updateFolder(File file) {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
if(f.isFile()&&f.getName().endsWith(".jpg")){
//修改文件的后缀名
String absolutePath = f.getAbsolutePath();
int index = absolutePath.lastIndexOf(".");
String substring = absolutePath.substring(0, index);
File newFile = new File(substring+".png");
f.renameTo(newFile);
}else{
updateFolder(f);
}
}
}
}
}
重命名功能的注意事项:
如果路径名相同,就是改名;
如果路径名不同,就是改名并剪切.
d:判断功能
public boolean isDirectory(): 判断是否是目录
public boolean isFile(): 判断是否是文件
public boolean exists(): 判断是否存在
public boolean canRead(): 判断是否可读
public boolean canWrite(): 判断是否可写
public boolean isHidden(): 判断是否隐藏
e:获取功能
public String getAbsolutePath(): 获取绝对路径
public String getPath(): 获取相对路径
public String getParent() :返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
public File getParentFile() :返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
public long getTotalSpace(): 返回此抽象路径名指定的分区大小。 返回总容量 单位字节
public long getFreeSpace(): 返回此抽象路径名指定的分区中未分配的字节数。返回剩余容量 单位字节
public String getName(): 获取名称
public long length(): 获取长度。字节数
public long lastModified(): 获取最后一次的修改时间,毫秒值
public String[] list(): 获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles(): 获取指定目录下的所有文件或者文件夹的File数组
//判断E盘某目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
import java.io.File
public class Demo {
public static void main(String[] args) {
//把E:\\picture这个路径封装成一个File对象
File file = new File("E:\\picture");
// 获取该路径下所有的文件或者文件夹对应的File数组
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f);
if(f.isFile()&&f.getName().endsWith(".jpg")){
System.out.println(f.getName());
}
}
}
}
- 文件名称过滤器:
a:文件名称过滤器
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
b:文件名称过滤器的使用:
//判断E盘某目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
import java.io.File;
import java.io.FileFilter;
public class Demo {
public static void main(String[] args) {
File file = new File("E:\\picture");
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
if (f.isFile() && f.getName().endsWith(".jpg")) {
return true;
} else {
return false;
}
}
});
for (File file1 : files) {
System.out.println(file1.getName());
}
}
}
//下篇再见…谢谢