Java常用工具之IO流
根据API文档使用步骤查找并使用IO流体系中的类:
1.查找输入/输出流类
2.查看构造方法
3.创建输入/输出流对象
4.处理异常
5.读/写操作
6.关闭输入/输出设备
异常
异常:即非正常情况,通俗地说,异常就是程序出现的错误
异常的分类(Throwable 父类)
异常(Exception 子类):合理的应用程序可能需要捕获的问题(可预料的),这个才是需要我们处理的异常
如:NullPointerException(空指针异常)
错误(Error 子类):合理的应用程序不应该试图捕获的问题(不可预料的),不需要我们处理
如:StackOverFlowError(栈内存溢出)
异常的处理方式
JVM默认的异常处理方式:在控制台打印错误信息,并终止程序
开发中异常的处理方式:
1.try…catch(finally):捕获,自己处理
try {
//尝试执行的代码
} catch(Exception e) {
//出现可能的异常之后的处理代码
} finally {
//一定会执行的代码,如关闭资源,这里的代码正常情况下一定会执行,一般是用来释放资源的
}
特点:处理完异常之后程序会继续执行
package io.demo;
public class Test {
public static void main(String[] args) {
try {
// 尝试要执行的代码
int a = 40 / 10;
System.out.println(a);
return;
}catch (Exception e) {
// 出现异常之后的处理的代码
System.out.println("被除数不能为0");
return; //结束方法
}finally { //即使try…catch中有return,finally里边的代码也会执行
System.out.println("看看我能出现吗");
}
// System.out.println("看看我能出现吗");
}
}
执行流程:
先执行try{}中的内容,看是否有问题(异常);没有:就直接执行finally语句中的内容;有:跳转到**catch(){}语句中开始执行,再执行finally{}**语句中的内容
2.throws:抛出,交给调用者处理
public void 方法名() throws Exception {
}
package io.demo;
//特点:执行结束之后,程序不再执行
public class Test2 {
public static void main(String[] args) throws Exception {
// 调用show方法
// 因为show方法以及抛出一个异常,作为调用者(main函数)必须处理这个异常
// 方案一接着抛,main函数抛给jvm
// show();
// 方案二:try…catch处理
try {
show();
} catch (Exception e) {
System.out.println("代码出问题了");
} finally {
System.out.println("看看我执行了吗");
}
}
public static void show() throws Exception {
int a = 20 / 0;
System.out.println("a:"+a);
}
}
IO流概述
IO流:I/O,即输入(Input)输出(Output),IO流指的是数据像连绵的流体一样进行传输。用来进行数据传输的一项技术
IO流能干什么:在本地磁盘和网络上操作数据
IO流的分类:
按数据流向分:输入流(读取数据);输出流(往外写数据);
按操作方式分:
字节流:InputStream(字节输入流);OutputStream(字节输出流)
字符流:Reader(字符输入流);Writer(字符输出流)
IO流体系
字符流:按字符读写数据的IO流
Reader(抽象类)
子类:FileReader(普通字符输入流);BufferedReader(高效字符输入流)
Writer(抽象类)
子类:FileWriter(普通字符输出流);BufferedWriter(高效字符输出流)
字节流:按字节读写数据的IO流
InputStream(抽象类)
子类:FileInputStream(普通字节输入流);BufferedInputStream(高效字节输入流)
OutputStream(抽象类)
子类:FileOutputStream(普通字节输出流);BufferedOutputStream(高效字节输出流)
src右键—>File
IO流简介:
概述:
I(Input,输入)/O(Output,输出)流,是java中用来传输数据的方式
划分:
按照流向分:
输入流:读数据
输出流:写数据
按照操作分:
字节流:以字节为单位来操作数据
InputStream:字节输入流的顶层抽象类
FileInputStream:普通字节输入流
BufferedInputStream:高效字节输入流(也叫:字节缓冲输入流)
OutputStream:字节输出流的顶层抽象类
FileOutputStream:普通字节输出流
BufferedOutputStream:高效字节输出流(也叫:字节缓冲输出流)
字符流:以字符为单位来操作数据
Reader:字符输入流的顶层抽象类
FileReader:普通字符输入流
BufferedReader:高效字符输入流(也叫:字父缓冲输入流)
Writer:字符输出流的顶层抽象类
FileWriter:普通字符输出流
BufferedWriter:高效字符输出流(也叫:字符缓冲输出流)
File类
概念:文件,文件夹,一个File对象代表磁盘上的某个文件或文件夹;就是用来操作文件(夹)路径的
构造方法:
File(String pathname)
File(String parent,String child)
File(File parent,String child)
有了构造方法就有了对象,有了对象就可以调用成员方法了
成员方法
创建功能:
createNewFile():创建文件
mkdir():创建单级目录
mkdirs():创建目录
判断功能:
isDirectory():判断File对象是否为目录
isFile():判断File对象是否是文件
exists():判断File对象是否存在
要自行在项目下创建一个文件夹:右键项目—>new—>Directroy
文件夹下创建一个文件夹:右键文件夹—>new—>Directroy
文件夹下创建一个文件:右键文件夹—>new—>File
package io.demo;
import java.io.File;
import java.io.IOException;
/*
构造方法
File(String pathname)
File(String parent,String child)
File(File parent,String child)
成员方法:
创建功能:如果不存在就创建,返回true;否则就不创建,就返回false
createNewFile():创建文件
mkdir():创建单级目录
mkdirs():创建多级目录(也可创建单级目录)
make directory的缩写
判断功能:
isDirectory:判断File对象是否为目录
isFile():判断File对象是否是文件
exists():判断File对象是否存在
*/
public class Test3 {
public static void main(String[] args) throws IOException {
// 需求:将D:\abc\1.txt封装成File对象
// 方式一:根据字符串形式的路径获取File对象
File file1 = new File("D:\\abc\\1.txt"); //D:\abc\1.txt=D:/abc/1.txt
System.out.println("file1:"+file1);
// 方式二:根据字符串形式的父目录以及子目录创建File对象
File file2 = new File("D:/abc","1.txt");
System.out.println("file2:"+file2);
// 方式三:根据父目录对象,以及字符串形式的子目录来获取File对象
File file3 = new File("D:/abc");
File file4 = new File(file3,"1.txt");
System.out.println("file4:"+file4);
System.out.println("——————————");
// 在D盘下创建2.txt文件
File file5 = new File("d:/2.txt");
boolean flag = file5.createNewFile();
System.out.println("flag:"+flag);//第一次打印,是true,说明已经创建成功,再打印一次,是false,因为已经存在了
// 需求:在D盘下创建一个a文件夹
File file6 = new File("D:/a");
boolean mkdir = file6.mkdir();
System.out.println("file6:"+mkdir);
// 需求:在D盘下创建a/b/c文件夹(创建嵌套的文件夹)
File file7 = new File("D:/a/b/c");
boolean mkdirs = file7.mkdirs();
System.out.println("mkdirs:"+mkdirs);
System.out.println("————————");
System.out.println("测试判断功能");
File file8 = new File("D:/a/b");
System.out.println("判断file8是否为文件夹:"+file8.isDirectory());
System.out.println("判断file8是否为文件:"+file8.isFile());
System.out.println("判断file8是否为存在:"+file8.exists());
}
}
获取功能:
getAbsolutePath():获取绝对路径
getPath():获取文件的相对路径
getName():获取文件名
list():获取指定目录下所有文件(夹)名称数组。(返回值是String类型)
listFile():获取指定目录下所有文件(夹)File对象数组
绝对路径:以盘符开头的路径,固定的,写“死”的路径;例如:D:/1.txt
相对路径:一般是相对于当前项目的路径来说的;例如:1.txt
package io.demo;
import java.io.File;
/*
获取功能:
getAbsolutePath():获取绝对路径
getPath():获取文件的相对路径
getName():获取文件名
list():获取指定目录下所有文件(夹)名称数组。(返回值是String类型)
listFile():获取指定目录下所有文件(夹)File对象数组
*/
public class Text4 {
public static void main(String[] args) {
File file1 = new File("lib/1.txt");
// 获取file1的绝对路径
String abs = file1.getAbsolutePath();
System.out.println("file1的绝对路径:"+abs);
// 获取file1的相对路径
String path = file1.getPath();
System.out.println("file1的相对路径:"+path);
// 获取文件名
String name = file1.getName();
System.out.println("file的文件名为:"+name);
// 获取lib文件夹下所有的文件(夹)的名称数组String[]
File file2 = new File("lib");
String[] names = file2.list(); //这获得的是名字
for (String s : names) {
System.out.println("名称为:"+s);
}
System.out.println("——————————————————");
// 获取lib文件夹下所有的文件(夹)的File对象数组File[]
File[] files = file2.listFiles(); //这获得的是一个对象,可以调用
for (File file : files) {
// System.out.println("File对象:"+file);
System.out.println("File对象:"+file.exists());
}
}
}