自学Java基础知识第十六天
day16
1. File类
1.1 File类的概述
- File类 : 表示一个文件或者是文件夹路径类型, 来自于java.io包
- 路径 : 表示一个文件或者文件夹具体位置的字符串
举例 : D:\0810Java系统班\day16\笔记\day16笔记.docx
- 路径分为 :
a : 绝对路径 , 表示带有根目录的路径
举例 : windows操作系统中的绝对路径是带有盘符的路径
D:\0810Java系统班
b : 相对路径 , 不带有根目录, 只是相对于某一个路径存在
举例 : a\123.txt
Eclipse中的相对路径, 相对于当前正在操作的项目工程根目录而言
1.2 File类构造
- File(String path) :将一个表示文件或者文件夹路径的字符串参数path封装到一个File类中
- File(String fu, String zi): 将fu和zi字符串路径拼接, 拼接后的结果封装到一个File类中
- File(File fu, String zi) : 将fu和zi路径拼接, 拼接后的结果封装到一个File类中
代码
package com.ujiuye.file; import java.io.File; public class Demo01_File类构造 { public static void main(String[] args) { // 1.File(String path) :将一个表示文件或者文件夹路径的字符串参数path封装到一个File类中 File f = new File("D:\\0810Java系统班"); System.out.println(f);
// 2.File(String fu, String zi): 将fu和zi字符串路径拼接, 拼接后的结果封装到一个File类中 File f1 = new File("D:\\", "AWS"); System.out.println(f1);// D:\AWS
// 3.File(File fu, String zi) : 将fu和zi路径拼接, 拼接后的结果封装到一个File类中 File f2 = new File(f,"day15"); System.out.println(f2); } } |
1.3 File类创建功能
- createNewFile() : 当file类型所表示的文件不存在时, 创建出一个新的,空的文件, 返回值类型boolean , 创建成功返回true, 创建失败返回false
- mkdir() : 创建出file表示的文件夹目录, 只能创建出最后一个级别文件夹路径, 如果最后级别文件夹前面的父路径不存在, 创建失败,返回值类型boolean类型
- mkdirs() : 创建出file表示的文件夹目录, 会将不存在的路径级别全部创建出来,返回值类型boolean类型
代码
package com.ujiuye.file; import java.io.File; import java.io.IOException; public class Demo02_File类创建功能 {
public static void main(String[] args) throws IOException { // 1.createNewFile() : 当file类型所表示的文件不存在时, 创建出一个新的,空的文件, 返回值类型boolean , // 创建成功返回true, 创建失败返回false File f = new File("123.txt"); boolean boo = f.createNewFile(); System.out.println(boo);
// 2.mkdir() : 创建出file表示的文件夹目录, 只能创建出最后一个级别文件夹路径, // 如果最后级别文件夹前面的父路径不存在, 创建失败,返回值类型boolean类型 File f2 = new File("D:\\a"); System.out.println(f2.mkdir());
File f1 = new File("D:\\b\\c\\d"); boolean boo1 = f1.mkdir(); System.out.println(boo1);
// 3.mkdirs() : 创建出file表示的文件夹目录, 会将不存在的路径级别全部创建出来,返回值类型boolean类型 boolean boo2 = f1.mkdirs(); System.out.println(boo2); } } |
1.4 File类的删除和重命名功能
- delete() : 删除file类型所表示的文件或者文件夹路径,删除成功返回true. 删除失败返回false
注意 : 如果删除的是文件夹, 那么要求文件夹必须为空才能删除, 不为空文件夹无法删除, 为了安全性保证, delete方法不走回收站
- renameTo(File path): 将file表示的文件名字进行修改, 返回值类型boolean类型
a : 如果方法调用file对象文件路径与参数path文件路径一致, 那么表示文件名称的修改
b : 如果方法调用file对象文件路径与参数path文件路径不一致,先将文件剪切到参数路径下, 再进行文件的重命名
代码
package com.ujiuye.file; import java.io.File; public class Demo03_File类的删除和重命名功能 { public static void main(String[] args) { // 1.delete() : 删除file类型所表示的文件或者文件夹路径,删除成功返回true. 删除失败返回false // 注意 : 如果删除的是文件夹, 那么要求文件夹必须为空才能删除, 不为空文件夹无法删除, // 为了安全性保证, delete方法不走回收站 File f = new File("123.txt"); System.out.println(f.delete());
File f1 = new File("D:\\a"); System.out.println(f1.delete());
File f2 = new File("D:\\b"); System.out.println(f2.delete());
// 2. 2.renameTo(File path): 将file表示的文件名字进行修改, 返回值类型boolean类型 /*a : 如果方法调用file对象文件路径与参数path文件路径一致, 那么表示文件名称的修改 b : 如果方法调用file对象文件路径与参数path文件路径不一致,先将文件剪切到参数路径下, 再进行文件的重命名 */
File f3 = new File("D:\\123.txt"); // System.out.println(f3.renameTo(new File("D:\\456.txt")));
System.out.println(f3.renameTo(new File("D:\\b\\c\\copy.txt"))); } } |
1.5 File类判断功能
- exists() : 判断file类型所表示文件或者文件夹路径是否真实存在, 存在返回true, 不存在返回false
- isFile() : 判断file类型所表示的是否是文件,是文件返回true, 不是文件返回false
- isDirectory(): 判断file类型所表示的是否是文件夹,是文件夹返回true, 不是文件夹返回false
代码
package com.ujiuye.file; import java.io.File; import java.io.IOException; public class Demo4_File类判断功能 { public static void main(String[] args) throws IOException { File f = new File("中文.txt"); if(f.exists()) { System.out.println("存在"); }else { f.createNewFile(); // 判断文件还是文件夹, 创建出来 /*if(f.isFile()) { f.createNewFile(); }else { f.mkdirs(); }*/ } } } |
1.6 File类的获取功能
- getAbsolutePath(): 将file类型所表示的文件或者文件夹路径对应的绝对路径以字符串的形式进行返回
- getPath() : 将file类型所表示的文件或者文件夹路径以字符串的形式进行返回
- getName() : 将file类型所表示的路径最后的文件或者文件夹名字获取到, 返回值类型String类型
- length() : 表示获取到文件的大小(以字节为丈量粒度), 返回值类型long类型
注意 : 实际开发中, 会涉及到读取文件过程, 读取文件内容之前
1) 判断文件是否存在
2) 文件存在, 判断文件中是否有内容, length() > 0 证明文件中有内容
- list() : 将file所表示文件夹路径下的所有文件和文件夹目录以字符串的形式获取到, 返回String[]
- listFiles() : 将file所表示文件夹路径下的所有文件和文件夹目录以File类型获取到, 返回File[]
代码
package com.ujiuye.file; import java.io.File; import java.util.Arrays; public class Demo05_File类获取功能 { public static void main(String[] args) { // 1. getAbsolutePath(): 将file类型所表示的文件或者文件夹路径对应的绝对路径以字符串的形式进行返回 File f = new File("D:\\0810Java系统班\\day06\\笔记\\day06.docx"); String path = f.getAbsolutePath(); System.out.println(path);
File f1 = new File("中文.txt"); System.out.println(f1.getAbsolutePath());// D:\eclipse-workspace\day16\中文.txt
// 2. getPath() : 将file类型所表示的文件或者文件夹路径以字符串的形式进行返回 System.out.println(f1.getPath()); System.out.println(f.getPath());
// 3. getName() : 将file类型所表示的文件或者文件夹路径最后的文件或者文件夹名字获取到, 返回值类型String类型 System.out.println(f.getName());//day06.docx System.out.println(f1.getName());// 中文.txt
// 4.length() : 表示获取到文件的大小(以字节为丈量粒度), 返回值类型long类型 long lon = f1.length(); System.out.println(lon);
// 5.list() : 将file所表示文件夹路径下的所有文件和文件夹目录以字符串的形式获取到, 返回String[] File f2 = new File("D:\\b\\c"); String[] arr = f2.list(); System.out.println(Arrays.toString(arr));
// 6.listFiles() : 将file所表示文件夹路径下的所有文件和文件夹目录以File类型获取到, 返回File[] File[] file = f2.listFiles(); System.out.println(Arrays.toString(file)); } } |
2. IO流
2.1 IO流的概述
- IO 流: 输入输出流
I : input , 输入概念; O : output , 输出概念
- IO流向:
输入: 其他设备数据写入到内存中
输出 : 数据从内存写入到其他设备
IO流也是可以进行设备之间的数据传输
2.2 IO流分类
- 从功能上分类
1) 字节流 : 以字节粒度进行文件的操作
2) 字符流 : 以字符粒度进行文件的操作
- 从流向上分类
1) 输入流
字节输入流 : InputStream
字符输入流 : Reader
2) 输出流
字节输出流 : OutputStream
字符输出流 : Writer
2.3 IO流的书写规范
- 使用IO流资源之前, 需要导包, java.io包
- 使用IO时, 需要处理异常 IOException
- IO流资源使用完毕, 必须关闭资源, 流资源关闭统一使用close()方法功能
3.字节流
字节流 : 以字节方式进行文件内容读写(操作)
字节流 : 字节输入流 : InputStream ; 字节输出流 : OutputStream
3.1 字节输入流InputStream
- InputStream : 抽象类, 来自于java.io包, 是所有的字节输入流的父类
- InputStream中的常用方法功能:
- InputStream是抽象类, 不能实例化对象, 于是需要一个子类, FileInputStream, 主要读取磁盘上的文件数据
3.2 FileInputStream类
- FileInputStream作为InputStream的子类, 来自于java.io包, 类主要功能就是与于磁盘上的文件进行交互, 使用字节方法从文件中读取出数据内容, 可以使用单个字节进行读取, 也可以使用字节数组进行文件内容读取, 因为所有的文件都是以字节组成, 因此FileInputStream可以读取很多类型文件, 文本(txt), 图片, 音频...
- FileInputStream构造方法:
1) FileInputStream(String path) : 将表示一个文件路径的path字符串封装在一个字节输入流中, 以后通过字节输入流, 可以从文件中读取出数据
2) FileInputStream(File f ): 将表示一个文件路径的file文件封装在一个字节输入流中, 以后通过字节输入流, 可以从文件中读取出数据
注意 : IO流资源只能操作文件, 不能操作文件夹
- 读取文件内容方法:
1) read() : 表示每次从文件中读取出一个字节, 将读取到的这个字节转换成一个int类型整数(00000000 00000000 00000000 字节数据), 将字节转换成整数, 结果需要补位, 补位结果导致所有的字节读取都是正数, 如果读取到-1,证明文件内容读取完毕
2) read(byte[] b) : 表示每次最多从文件中读取出b.length个字节, 将读取到的数据放置到参数b字节数组中, 通过查看字节数组内容相当与查看文件内容, 返回值类型int类型, 返回值表示每次从文件中读取到的字节的个数, 如果读取到-1,证明文件读取完毕
- IO流读取文件原理
代码
package com.ujiuye.io;
import java.io.File; import java.io.FileInputStream; import java.io.IOException;
public class Demo01_FileInputStream单个字节读文件 {
public static void main(String[] args) throws IOException{ // 1. 创建出字节输入流对象(相当于绑定一个数据源) FileInputStream fis = new FileInputStream("123.txt"); // FileInputStream fis1 = new FileInputStream(new File("123.txt"));
// 2. read(): /*int c1 = fis.read(); System.out.print((char)c1); int c2 = fis.read(); System.out.print((char)c2); int c3 = fis.read(); System.out.print((char)c3); int c4 = fis.read(); System.out.print((char)c4); int c5 = fis.read(); System.out.print((char)c5); int c6 = fis.read(); System.out.print((char)c6); int c7 = fis.read(); System.out.println(c7);*/
// 3. 优化文件读取过程 // len表示每次读取到的字节结果 int len; while((len = fis.read()) != -1) { System.out.print((char)len); }
// 3. 关闭流资源 fis.close(); } } |
package com.ujiuye.io; import java.io.FileInputStream; import java.io.IOException; public class Demo02_FileInputStream字节数组读文件 { public static void main(String[] args) throws IOException{ // 1. 创建出一个字节输入流, 绑定一个数据源 FileInputStream fis = new FileInputStream("123.txt");
// 2. 创建出一个字节数组 byte[] b = new byte[4]; /*int num = fis.read(b); System.out.println(num);// 4 System.out.println(new String(b));// abcd
int num1 = fis.read(b); System.out.println(num1);// 2 System.out.println(new String(b));// efcd
int num2 = fis.read(b); System.out.println(num2);// -1 System.out.println(new String(b));// efcd */ // len表示读取到的字节的个数 int len; while((len = fis.read(b)) != -1) { // 将b数组中的读取到的部分转换成字符串进行展示 System.out.print(new String(b,0,len)); } // 关闭资源 fis.close(); } } |
3.3 字节输出流OutputStream
- OutputStream 抽象类, 来自于java.io包, 是所有的字节输出流的父类, 因为抽象类不能实例化对象,因此需要一个子类 FileOutputStream
- 以字节方式向其他设备中输出数据
主要关注的方法:
3.4 FileOutputStream类
- FileOutputStream : 是OutputStream的子类, 来自于java.io包, 主要用于向磁盘文件中写入字节数据, 可以按照单个字节写入,可以按照字节数组写入, 使用完毕IO流资源,关闭
- FileOutputStream构造方法:
1) FileOutputStream(String path) : 将表示一个文件路径的path字符串封装在一个字节输出流中, 以后通过字节输出流, 可以向文件中写入字节数据
2) FileOutputStream(File f) : 将表示一个文件路径f, File类型封装在一个字节输出流中, 以后通过字节输出流, 可以向文件中写入字节数据
- 向文件中写入数据方法: write方法没有返回值类型
1) write(int b) : 向文件中写入一个字节数据b
2) write(byte[] b) : 向文件中写入字节数组中的内容
3) write(byte[] b, int index, int length) : 向文件中写入字节数组b的一部分, 从index索引位置开始写, 一共写入length个字节
代码
package com.ujiuye.io; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class Demo03_FileOutputStream字节向文件写入数据 { public static void main(String[] args) throws IOException{ // 1. 创建出一个字节输出流, 绑定一个数据目的 // 写入的目标文件不存在,那么可以自动创建出一个文件 File f = new File("out.txt"); if(!f.exists()) { f.createNewFile(); } FileOutputStream fos = new FileOutputStream(f);
// 2. 向文件中写入内容 // 1)write(int b) : 向文件中写入一个字节数据b fos.write(97);// a byte[] b = {65,66,67,68};// ABCD // 2)write(byte[] b) : 向文件中写入字节数组中的内容 fos.write(b); // 3) 3)write(byte[] b, int index, int length) : 向文件中写入字节数组b的一部分, 从index索引位置开始写, 一共写入length个字节 fos.write(b, 1, 2);// BC
fos.write("你好".getBytes());
// 3.关闭资源 fos.close(); } } |
3.5 文件的复制
- 文件的复制 : 本质就是字节的搬运, 从源文件中读取出字节数据, 将读取到的内容原封不动的写入到目标文件中,读到什么写入什么
- 复制一张图片
注意 : 读取文件,或者复制文件时, 为了提高读写效能, 通常使用数组进行数据操作, 数组大小一般设定为1024的倍数
最常用 : 1024 1024 * 4 1024 * 8
代码
package com.ujiuye.io; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo04_文件复制 { public static void main(String[] args) throws IOException{ // 1. 创建出一个字节输入流, 绑定一个数据源 FileInputStream fis = new FileInputStream("D:\\0810Java系统班\\day09\\图解\\抽象方法的引入.png"); // 2. 创建出一个字节输出流, 绑定数据目的 FileOutputStream fos = new FileOutputStream("D:\\copy.png");
// 3. 边读边写 // len表示每次读取到的字节结果 /* int len; while((len = fis.read()) != -1) {// 63 * 1024 次 fos.write(len); }*/
byte[] b = new byte[1024*4]; // len表示每次读取到的字节的个数 int len; while((len = fis.read(b)) != -1) { fos.write(b,0,len); }
// 4. 关闭资源 fos.close(); fis.close(); } } |
3.6 字节高效缓冲流
- BufferedInputStream : 是InputStream的子类, 表示高效的字节输入流, 能够高效进行文件内容读取. 高效的字节输入流是一个包装类, 可以将普通字节输入流包装成一个高效字节输入流
a : 构造方法 : BufferedInputStream(InputStream in)
b : 高效原理 : 当创建出一个BufferedInputStream, 类型底层会自动创建出一个大小为8192(1024*8)的字节数组, 每次通过read方法从文件读取内容时, 最多从文件中读取出8192个字节, 放置到底层字节数组中, 后面使用read方法读取, 都是从底层数组缓冲中读取出内容, 从数组中读取数据远远比从文件中每次读取出一个字节效率高很多, 如果8192读取完毕, 再继续最多从文件中读取出8192,以此类推, 直到文件读取完毕
- BufferedOutputStream : 是OutputStream的子类, 表示高效的字节输出流, 能够高效向文件内容写入内容. 高效的字节输出流是一个包装类, 可以将普通字节输出流包装成一个高效字节输出流
a : 构造方法BufferedOutputStream(OutputStream out)
b : 高效原理 : 当创建出一个BufferedOutputStream, 类型底层自动创建出一个大小为8192的字节数组, 每次向文件中写入内容都是写入到了底层数组缓冲区中, 当8192字节数写满, 一次性的将数据同步到文件中, 继续写入, 如果没有写满8192字节, 可以通过close方法功能将缓冲区中的数据同步到文件中
代码
package com.ujiuye.io; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo05_字节高效缓冲流 { public static void main(String[] args) throws IOException{ // 1. 创建出一个字节高效输入流, 绑定一个数据源 BufferedInputStream bis = new BufferedInputStream( new FileInputStream("D:\\0810Java系统班\\day15\\视频\\01.day14内容回顾.mp4")); // 2. 创建出一个字节高效输出流, 绑定一个数据目的 BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("D:\\day14copy.mp4")); long begin = System.currentTimeMillis(); // 3. 边读边写 // 表示每次读取到的字节结果 int len; while((len = bis.read()) != -1) { bos.write(len); }
long end = System.currentTimeMillis(); System.out.println(end-begin);
// 4. 关闭资源 bos.close(); bis.close(); } } |