1.File类
File类是专门处理电脑磁盘上面的文件和文件夹的一个类
./当前的工作路径
../相对于当前工作目录的上一级目录
../../相对于当前工作目录的上上一级的目录
相对路径:得有参照物
绝对路径:从磁盘的根目录(D:、F:)开始,一级一级的找,没有参照物
1.1 File类的构造方法
| Constructor and Description |
|---|
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。 |
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 |
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。 |
File(URI uri) 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。 |
2. File(String pathname);传入文件或文件夹名字的路径,对当前路径的一个抽象,数理化出来,可以对文件进行操作
3. File(String parent , String child);parent 父路径 child 子路径,子路径是在父路径的下面
1. File(File parent,String child);
*_5.File.separator 在windows自己识别正斜线 在Linux自动识别为反斜线_
更具有兼容性,在任何系统都不会报错
package com.qfedu.test1file;import java.io.File;//file类的构造方法public class Demo1 {public static void main(String[] args) {//`File(String pathname)`//通过将给定的路径名字符串转换为抽象路径名来创建新的 `File`实例。File file = new File("E:/aaa/AAA.txt");System.out.println(file);//`File(String parent, String child)`//从父路径名字符串和子路径名字符串创建新的 `File`实例。//parent 父路径 child 子路径//子路径是在父路径的下面File file2 = new File("E:/aaa", "AAA.txt");System.out.println(file2);//`File(File parent, String child)`//从父抽象路径名和子路径名字符串创建新的 `File`实例。File file3 = new File(new File("E:/aaa"), "AAA.txt");System.out.println(file3);//File.separator 在windows自己识别正斜线 在Linux自动识别为反斜线\File file4 = new File("E:" + File.separator + "aaa" + File.separator + "1.txt");System.out.println(file4);}}
1.2使用对象创建文件和文件夹
boolean createNewFile(); 创建文件,返回bollean类型数据【注意事项】:1.创建文件的时候,文件路径不存在会报错2.硬盘坏了,也不能创建boolean mkdir();创建单级的路径boolean mkdirs(); 创建多级的路径
package com.qfedu.test1file;import java.io.File;import java.io.IOException;//方法public class Demo2 {public static void main(String[] args) throws IOException{File file = new File("E:/aaa/BBB.txt");//编译时异常,可能没有这个文件,所以抛异常System.out.println(file.createNewFile());//创建文件File file2 = new File("E:/aaa/bbb");System.out.println(file2.mkdir());//mkdir 创建单级路径File file3 = new File("E:/aaa/ccc/eee/ffff");System.out.println(file3.mkdirs());//mkdirs 创建单级路径}}
1.3删除文件或者文件夹
boolean delete(); 立即删除,(删除文件夹的时候,必须是空的才能删)
void deleteOnExit();程序结束时才删除
package com.qfedu.test1file;import java.io.File;public class Demo3 {public static void main(String[] args) {File file = new File("E:/aaa/BBB.txt");System.out.println(file.delete());//立即删除//删除文件夹//删除文件加的时候只能删除空的文件夹File file2 = new File("E:/aaa/BBB");System.out.println(file2.delete());File file3 = new File("E:/aaa/AAA.txt");file3.deleteOnExit();//程序退出才删除}}
1.4File对象的判断方法
boolean isFile(); 判断是不是文件
boolean isDirectory(); 判断是不是文件夹
boolean isHidden(); 判断是不是隐藏文件
boolean isAbsolute(); 判断是不是绝对路径
boolean exists(); 判断对应的文件或者文件夹是否存在
1.5返回值是String类型的方法
String getName(); 获取文件或文件夹的名字
String getPath(); 获取当前File对象路径的
String getParent(); 获取当前文件的上级目录
String getAbsolutPath(); 获取绝对路径
1.6返回值是long类型的方法
long length(); 占用字节数,英文和数字字符都是一个字节,中文根据编译器不一样可能是2字节或者3字节
long lastModified(); 获取当前文件最后修改的时间,这个时间是时间戳
时间戳从1970年1月1日0时0分到现在的秒数
1.7获取当前文件夹的所有文件和文件夹
1.7.1获取文件
listFiles();返回File数组
package com.qfedu.test1file;import java.io.File;//获取当前文件夹的所有文件和文件夹public class Demo7 {public static void main(String[] args) {File file = new File("E:/aaa");//获取当前文件夹下的所有文件和文件夹// System.out.println(file.listFiles());File[] files = file.listFiles();//数组遍历for (File file2 : files) {System.out.println(file2);}}}
1.7.2删除文件夹下的所有文件
用到递归的思想,如果是文件夹就再方法中再次调用方法。
package com.qfedu.test1file;import java.io.File;//递归删除public class Demo7diguiDEL {public static void main(String[] args) {//删除某个目录下面所有的文件(包括子文件) 递归File file = new File("E:/aaa");del(file);}//递归 删除该位置所有文件public static void del(File f) {File[] files = f.listFiles();//获取f目录下所有文件和文件夹for (File file1 : files) {if (file1.isDirectory()) {//是否是文件夹del(file1);//在调用一次方法 (自己调用自己) 递归的思想}else {file1.delete();//如果不是文件夹,就是文件,是文件就删除// System.out.println(file1.delete());}}}}
2 IO流【超级重点】
电脑上的文件,比如文档,音频,视频,图片等,在进行读取和存些的时候都是以流的形式进行操作的,叫IO流(input output)。IO流就是对电脑中的文件进行读和写的,CPU通过内存从硬盘上面读取数据,每次读取4kb左右(缓冲值)。缓冲值:提高读取和存储的效率、保护磁盘
2.1读取和输入的概念
2.1.1读取数据
比如磁盘有一个1.txt,可以通过java代码将它读取到java内存中,从java内存展示出来
磁盘中某个文件数据 —> java内存 —> 展示数据(eclipse控制台展示)
2.1.2写入数据
先把java代码中的数据写入到java代码中,然后在写入磁盘
数据—> java内存—> 磁盘上面
2.2IO流的分类
参照物是内存:可以理解为当前java代码I:input 输入,从磁盘读取数据到内存里面,从磁盘到内存叫输入磁盘读取到java里是输入O:output 输出,从内存中去数据,写道磁盘上面,叫做输出从java写道磁盘是输出输入流:两种:字节输入流和字符输入流字节输入流:InputStream:有一个子类FileInputStreamBufferedInputStream1.实例化一个file对象,带数据内容2.开始使用输入流 FileInputStream3.加一个缓冲流 BufferedInputStream4.准备一个字节数组byte[]5.while循环读取,因为不知道读取几次 终止条件是length-16.new String(字节数组,0,lenght) 将自己数组内的数据打印出自己能看懂的格式案例看下面输出流:两种:字节输出流和字符输出流案例FileOutputStream
输入流案例
package com.qfedu.test2IOliu;import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;//IO输入流 InputStream 一个子类(文件字节输入流)FileInputStreampublic class Demo1 {public static void main(String[] args) throws IOException {//1.创建对应的文件对象File file = new File("E:/aaa/1.txt");//2.创建文件字节输入流对象来操作文件对象FileInputStream fis = new FileInputStream(file);//3.FileInputStream 本身是不带缓冲效果的,要想给输入流对象加上缓冲效果//BufferedInputStream(InputStream in) 增加缓冲效果BufferedInputStream bis = new BufferedInputStream(fis);//以上fis就有了缓冲的效果//4.创建一个字节数组 这个数组就是缓冲区//1024*4是每次读取的字节 缓冲值为4kbbyte[] buf = new byte[1024 * 4];//4kb的容器 4096个字节int length = -1;//定义结束条件,文件中到达结尾是-1//5.将1.txt里面的数据读取到java内存中(缓存数组)//bis.read(buf) bis读取到buf缓存数组中while ((length = bis.read(buf)) != -1) {System.out.println(length);//length字节数System.out.println(new String(buf,0,length));}//6.流是需要关闭的bis.close();fis.close();}}
输出流案例
需求:将一个字符串数据写入到空的文件夹里 getBytes 字符串转成字节数组
package com.qfedu.test2IOliu;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;//IO输入流 OutputStream 一个子类(文件字节输入流)FileOutputStreampublic class Demo3 {public static void main(String[] args) throws IOException {//1.创建一个被写入的文件对象File file = new File("E:/aaa/3.txt");//2.字节输出流FileOutputStream fos = new FileOutputStream(file);//3.缓冲输出流BufferedOutputStream bos = new BufferedOutputStream(fos);//4.将字符串写入磁盘中String string = "杨博是我儿,我是朱志伟";byte[] bytes = string.getBytes();bos.write(bytes);//关闭流 先关后开的流bos.close();fos.close();}}
案例
从../路径复制一个视频到E:/aaa文件夹下
分析:源文件需要输入流 >>>>内存>>>>>>在输出到E:/aaa文件夹下
package com.qfedu.test2IOliu;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;//复制图片public class Demo5anli2 {public static void main(String[] args) throws IOException {copyPhoto();copyPhoto1();}public static void copyPhoto() throws IOException {long start = System.currentTimeMillis();//开始时间 计算程序运行时间BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("C:\\Users\\ZHU\\Pictures\\Saved Pictures\\luo.jpeg")));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("E:/aaa/luo1.png")));byte[] b1 = new byte[1024 * 4];int length = -1;while((length = bis.read(b1)) != -1) {bos.write(b1);}bos.close();bis.close();System.out.println("复制完成");long end = System.currentTimeMillis();//结束时间System.out.println(end - start);//计算代码运行所用得时间 检查效率}public static void copyPhoto1() throws IOException {long start = System.currentTimeMillis();//开始时间 计算程序运行时间FileInputStream fis = new FileInputStream(new File("C:\\Users\\ZHU\\Pictures\\Saved Pictures\\luo.jpeg"));FileOutputStream fos = new FileOutputStream(new File("E:/aaa/luo2.png"));//不用缓冲流int length = -1;while((length = fis.read()) != -1) {fos.write(length);}fis.close();fos.close();System.out.println("复制完成");long end = System.currentTimeMillis();//结束时间System.out.println(end - start);//计算代码运行所用得时间 检查效率}}
3.递归
package com.qfedu.test1file;import java.io.File;//递归删除public class Demo7diguiDEL {public static void main(String[] args) {//删除某个目录下面所有的文件(包括子文件) 递归File file = new File("E:/aaa");del(file);}//递归 删除该位置所有文件public static void del(File f) {File[] files = f.listFiles();//获取f目录下所有文件和文件夹for (File file1 : files) {if (file1.isDirectory()) {//是否是文件夹del(file1);//在调用一次方法 (自己调用自己) 递归的思想}else {file1.delete();//如果不是文件夹,就是文件,是文件就删除// System.out.println(file1.delete());}}}}
