目录
一、文件
1、文件的概念
1.广义
2.狭义
二、路径
1、绝对路径
2、相对路径
1.进入下一级./
2.回退上一级../
三、Java里的文件基本操作----File类
1、说明
2、File类的基本操作
1.基本方法
2.创建与删除文件
3.创建目录
4.文件的重命名
四、文件的读写操作
1、数据流
2、InputStream与OutputStream(字节流读写文件)
1.InputStream抽象类进行字节流读取操作
2.OutputStream抽象类进行字节流写入
3、Reader与Writer(字符流读写)
1.Reader抽象类进行字符流读取
2.Writer抽象类进行字符流写入
4、Scanner与PrintWrite(文本文件的读写)
1.Scanner
2.PrintWrite
5、关闭资源
一、文件
1、文件的概念
1.广义
把操作系统管理的软硬件资源都抽象为文件
2.狭义
狭义上的文件就是存储在硬盘上的数据
在后续的讨论中我们所说的文件是狭义上的文件,在操作系统里文件的目录结构是一个n叉树
二、路径
1、绝对路径
绝对路径是指文件在硬盘上真正存在的路径。类似于盘符:/路径这种就是绝对路径,在后续使用更推荐相对路径,因为每台电脑上每个文件的位置不一定相同,使用绝对路径,在换一台电脑后不一定能找到目标文件
2、相对路径
相对路径则是以一个基准路径为起点描述文化位置,,通过./进入下一级与../回退为上一级目录
1.进入下一级./
如果此时基准路径是D盘要找到D盘QQ里的QQ.exe则相对路径就是:./QQ/QQ.exe
2.回退上一级../
如果此时基准路径是在D盘里的YJWJ,那么找到QQ.exe相对路径就是../QQ/QQ.exe
三、Java里的文件基本操作----File类
1、说明
文件操作是操作系统提供的一些API,每个系统的API不同,在Java里JVM中把不同系统的文件操作进行了封装,所有的系统下都可以使用JavaAPI操作文件
2、File类的基本操作
1.基本方法
获取上一级路径:getParent()
获取文件名:getName()
获取文件路径:getPath()
获取文件的绝对路径:getAbsolutePath()
判断文件是否存在:exists()
判断是否是目录:isDirectory()
判断是否是文件:isFile()
2.创建与删除文件
1.实例化File对象,给构造方法传入文件路径
2.调用createNewFile()方法创建文件
3.调用delete()方法删除文件
还有另一个在进程退出时删除文件的方法:deleteOnExit()
3.创建目录
创建单级目录:
创建多级目录:
4.文件的重命名
1.创建新的File实例,构造方法传入新名字
2.待改名的File实例调用renameTo方法
四、文件的读写操作
1、数据流
将读写操作的数据比作水流,流分为字节流与字符流,字节流以字节为基本单位适用于二进制,字符流以字符为基本单位适用于文本文件,Java标准库基于流的操作提供了一些类用于读写文件
2、InputStream与OutputStream(字节流读写文件)
1.InputStream抽象类进行字节流读取操作
1.构造实例----打开文件
2.读取----read
3.释放资源 ---关闭文件
代码:
public static void useInputStream() throws IOException {
//1.构造实例,操作效果类似于打开文件
InputStream inputStream = new FileInputStream("文件路径");
//2.读取操作
int n = 0;
while(n != -1){
n = inputStream.read(); //无参read 返回值为int当返回-1时,文件读完
System.out.println((char)n);
}
byte[] content = new byte[1024];
inputStream.read(content); //参数为byte[] 将文件内容读取到数组里
inputStream.read(content,0,100); //将len长度的内容读取到数组里off位置开始
//3.释放资源类似于关闭文化
inputStream.close();
}
2.OutputStream抽象类进行字节流写入
1.构造实例,打开文件2.写文件
3.释放资源,关闭文件
代码:
public static void useOutputStream(String path) throws IOException {
//1.构造实例,打开文件
OutputStream outputStream = new FileOutputStream(path);
//2.写文件
outputStream.write(97); //参数为int 写入一个字节
outputStream.write(new byte[]{98,99,100}); //参数为数组,将数组写入文件
outputStream.write(new byte[]{101,102,103},0,2);//将数组从off开始写入len个长度
//3.释放资源,关闭文件
outputStream.close();
}
3、Reader与Writer(字符流读写)
1.Reader抽象类进行字符流读取
1.构造实例 打开文件
2.读取文件
3.释放资源 关闭文件
代码:
public static void useReader(String path) throws IOException {
//1.构造实例,打开文件
Reader reader = new FileReader(path);
//2.读取文件
int n = 0;
while(n != -1){
n = reader.read(); //read方法与前面InputStream读取类似
System.out.println((char)n);
}
//3.释放资源,关闭文件
reader.close();
}
2.Writer抽象类进行字符流写入
1.构造实例 打开文件
2.写入
3.释放资源 关闭文件
代码:
public static void useWriter(String path) throws IOException {
//1.构造实例 打开文件
Writer writer = new FileWriter(path);
//2.写入文件
writer.write("参数为字符串写入");
writer.write(98); //参数为int类型写入
writer.write("字符串写入从off来len长度",0,11);
writer.write(new char[]{'a','b','c'}); //参数为字符数组
writer.write(new char[]{'a','b','c'},0,2);
//3.释放资源 关闭文件
writer.close();
}
4、Scanner与PrintWrite(文本文件的读写)
1.Scanner
使用:
代码:
public static void useScanner(String path) throws IOException {
//1.创建InputStream实例
InputStream inputStream = new FileInputStream(path);
//2.创建Scanner实例传入InputStream实例
Scanner scanner = new Scanner(inputStream);
//3.读取我
while(scanner.hasNext()){
System.out.println(scanner.next());
}
//4.释放资源
inputStream.close();
}
2.PrintWrite
使用:
代码:
public static void usePrintWrite(String path) throws IOException {
//1.创建OutputStream实例
OutputStream outputStream = new FileOutputStream(path);
//2.创建PrintWrite实例 传入OutputStream实例
PrintWriter printWriter = new PrintWriter(outputStream);
//3.开始写入
printWriter.println("写入");
printWriter.print(222);
printWriter.printf("年龄 = %d",100);
//4.释放资源
printWriter.close();
outputStream.close();
}
5、关闭资源
一定要调用close关闭资源,从PCB的文件描述符表中删除,文件描述符表本质有长度上限,一旦达到上限就会导致文件打开失败,文件泄露,释放资源最好使用try with resource,多个资源使用;隔开