一、File类
基本认识
File类:java.io.File,也是io流中的一部分,File类能够新建、删除、重命名文件与目录,但是不能访问文件本身,若是需要访问文件内容需要使用到输入输出流。
创建对象:通过构造器获取,介绍三个
File(String pathname):可填入绝对路径与相当路径,相对路径就是在本项目目录下。 File(String parent, String child):parent是父路径、child是子文件路径。 File(File parent, String child):父File对象与子文件路径。 @Test public void test01(){ //第一个构造器:File(String pathname) File file = new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner"); //第二个构造器:File(String parent, String child) File file1 = new File("C:\\Users\\93997\\Desktop\\fileexer","javahoner"); //第三个构造器:File(File parent, String child) File file2 = new File(new File("C:\\Users\\93997\\Desktop\\fileexer"),"javahoner"); System.out.println(file); System.out.println(file1); System.out.println(file2); }
第三个构造器第一个参数File parent:当其不为空时,实际上也是取该对象属性string path。
println()输出路径:File类其toString()方法就是打印了String path参数。
路径分隔符:就是上面构造器中的那个\\,不同操作系统使用的也不同
windows与Dos系统默认:\
Unix与URL使用:/
因为Java跨平台,所以对于路径分隔符需慎用,Java也给出通用的:File.separator,我们在创建实例时可以使用这个参数来代替我们手写/或\。(这个属性是通过调用方法来获取到本地文件系统的默认分隔符)
//相当于C:\Users\93997\Desktop\fileexer\javahoner File file = new File("C:\\Users\\93997\\Desktop\\fileexer\"+File.separator+\"javahoner");
实用方法
获取功能
获取文件对象的相关信息
String getAbsolutePath():获取文件的绝对路径
String getPath:获取路径(也是绝对路径)
String getName:获取路径下的最后一个文件名
String getParent():获取上层文件目录路径,若无,返回null
Long length():获取文件长度(字节数)
Long lastModified():获取最后一次修改文件的时间戳(毫秒值)
String[] list():获取指定目录下所有文件的名称
File[] listFiles():获取指定目录下所有文件,以对象形式返回
若调用方法的抽象路径名不表示目录,返回值为null
…
实际使用:
@Test public void test01(){ //第一个构造器:File(String pathname) File file = new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner"); System.out.println(file.getAbsolutePath());//C:\Users\93997\Desktop\fileexer\javahoner System.out.println(file.getPath());//C:\Users\93997\Desktop\fileexer\javahoner System.out.println(file.getName());//javahoner System.out.println(file.getParent());//C:\Users\93997\Desktop\fileexer System.out.println(file.length());//0 System.out.println(file.lastModified());//1612056310161 for (String childFile : file.list()) { System.out.print(childFile+" "); }//文件1 文件2 System.out.println(); for (File listFile : file.listFiles()) { System.out.println(listFile); } //C:\Users\93997\Desktop\fileexer\javahoner\文件1 //C:\Users\93997\Desktop\fileexer\javahoner\文件2 }
重命名功能(包含剪切)
方法介绍
public boolean renameTo(File dest):剪切文件改名到指定路径(也可以实现重命名效果)
调用该方法的File,其指定路径下是否有文件都没事;注意dest的文件路径应该是不存在的
返回值:dest的路径下应该不存在文件,若存在返回false。
实际应用:重命名与剪切功能
场景1:想将javahoner目录下的文件名为文件修改为长路锅锅
File file = new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner\\文件"); boolean b = file.renameTo(new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner\\重命名的文件")); System.out.println(b);
实际上就是将C:\\Users\\93997\\Desktop\\fileexer\\javahoner\\文件先剪切到C:\\Users\\93997\\Desktop\\fileexer\\javahoner路径下再改名为不存在的文件名为重命名文件。实现了修改名称效果
场景2:想将javahoner目录下的文件长路锅锅移动到1(2)文件中
File file = new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner\\长路锅锅"); boolean b = file.renameTo(new File("C:\\Users\\93997\\Desktop\\1(2)\\长路锅锅")); System.out.println(b);
其实原理操作与上面一样的,需要注意1(2)要不存在长路锅锅文件。
总结:秒呀这个方法,看了下源码最终定位到一个WinNTFileSystem的private native boolean rename0(File f1, File f2);根据native关键字,说明这个方法是一个原生函数,是使用c/c++来实现并编译成DLL文件由java去调用。
判断功能
这里仅仅介绍下方法使用
public boolean isDirectory:判断是否是文件目录
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在
public boolean canRead():判断是否可读
public boolean canWrite():判断是否可写
public boolean is Hidden():判断是否隐藏
创建、删除文件
创建功能
public boolean createNewFile():文件存在不创建返回false。
public boolean mkdir():文件目录存在不创建,若此文件目录的上级目录不存在也不创建。
public boolean mkdirs():不仅仅是此目录文件,若是此目录的上层文件目录不存在一并创建。
删除功能
public boolean delete():删除此抽象路径名表示的文件或目录,若是此路径名表示目录,则目录必须为空才能删除。
实际小案例
案例:删除指定路径下所有文件
public class Main { //生成num个空白字符串,若是num非0最后添加- public static String blankStr(int num){ StringBuilder str = new StringBuilder(); for (int i=0;i<num;i++){ str.append(" "); } if(num != 0){ str.append("-"); } return str.toString(); } //删除路径下内容(包含层级关系) public static void deleteAllFile(File file,int tier) throws RuntimeException{ //如果该路径是一个文件直接删除 if(file.isFile()){ System.out.println(file.delete()?blankStr(tier)+file.getName()+"已删除":blankStr(tier)+file.getName()+"删除失败"); return; } //该路径是目录 File[] files = file.listFiles(); //空目录直接删除 if(files == null || files.length == 0){ System.out.println(file.delete()?blankStr(tier)+"成功删除"+file.getName():blankStr(tier)+file.getName()+"空目录删除失败"); return; } //目录不为空,遍历当前文件 for (File dict : files) { //目录:删除目录中内容+删除自己本身 if(dict.isDirectory()){ //获取目录下的所有文件 File[] files2 = dict.listFiles(); //如果目录为空直接删除 if(files2 == null || files2.length == 0){ System.out.println(dict.delete()?blankStr(tier)+"成功删除"+dict.getName():blankStr(tier)+dict.getName()+"空目录删除失败"); }else{ //非空目录情况 deleteAllFile(dict,tier+1); System.out.println(dict.delete()?blankStr(tier)+"成功删除"+dict.getName():blankStr(tier)+dict.getName()+"空目录删除失败"); } }else{ //非目录:无提示直接调用 deleteAllFile(dict,tier+1); } } } //测试 @Test public void test01(){ File file = new File("C:\\Users\\93997\\Desktop\\fileexer\\javahoner\\文件1"); try { deleteAllFile(file,0); } catch (RuntimeException e) { System.out.println("删除非空文件时出现异常!!!"); } System.out.println("该文件路径下内容已被删除"); } }
调用deleteAllFile(File file,int tier)即可:参数1就是删除指定文件路径,参数2表示层级关系(设置为0最高级)
二、IO流
1、认识IO流
Google将I/O誉为"开放中创新",input/output:二进制1,0
IO原理:是Input/Output的缩写,I/O技术是很实用的技术,用来处理设备之间的数据传输。例如读/写文件,网络通讯等。
input:读取外部数据(例如磁盘、光盘等存储设备的数据)到程序(内存)中。
output:将程序(内存)中的数据库输出到磁盘、光盘等存储设备中。
在Java程序中,对于数据的输入/输出操作以"流(stream)"的方式进行。java.io包下提供了各种"流"类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
流的分类
根据数据单位不同分为两类:字节流与字符流
字节流:最基本单位是字节byte的流,通常用来传输视频、图片(非文本的数据)
字符流:最基本单位是字符char的流,通常用来文本输入输出。
说明:中文字体在不同编码下占不同字节数,在UTF-8中文所占字节不确定可能是2,3,4个字节,所以建议进行文本输入输出选择字符流。
区别(重要):字节流按字节读数据,不需要编码解码;字符流按字符读数据,一次读两个字节,并返回这两个字节所对应的int型数值)(编码)。
数据的流向不同分为:输入流、输出流
角色不同分为:节点流、处理流
Java的IO流全部都是由下面这4个抽象基类派生:
(抽象基类) |
字节流 |
字符流 |
输入流 |
InputStream |
Reader |
输出流 |
OutputStream |
Writer |
I/O流体系图:
关系图:
2、IO流基类介绍
字节流基类介绍
对于字节流的输入输出流的基类,首先介绍一下InputSream以及OutputSream。
InputSream为字节输入流的抽象基类,其基类定义了以下几个通用方法,这里列举几个
int read():从流中读取1个字节并返回,如果达到文件末尾返回-1;
read(byte b[]):从流中读取b的长度个字节的数据存储到b中,返回的是读取的字节个数,若是返回-1表示到了结尾,没有数据。
int read(byte b[], int off, int len):从流中的off位置开始读取len个字节的数据到b中,返回结果是实际读取的字节个数,若是返回-1表示没有数据。
void close():关闭输入流
OutputSream为字节输出流的抽象基类,这里列举几个该基类常用方法
void write(int b):将1个字节写入到输出流中
void write(byte b[]):从b的off位置开始,获取len个字节数据,写到输出流中
void flush():刷新此输出流并强制任何缓冲的输出字节被写出。(为之后缓冲流提供抽象方法)
void close():关闭输出流
输出入流关字节流的含节点流以及各种处理流它们的基类就是这两个。
字符流基类介绍
对于字符流的输入输出流的基类,介绍一下Reader、Writer
Reader:是字符输入流的抽象基类 ,定义了几个函数如下
int read():读取单个字符,返回结果是一个int,若想要字符显示需要转为char;若是到达流的末尾,返回-1
int read(char cbuf[]):从流中读取b的长度个字符的数据存储到b中,返回的是读取的字节个数,若是返回-1表示到了结尾,没有数据。
void close():关闭字符输入流
writer:是字符输入流的抽象基类 ,定义了几个函数如下
void write(int b):将1个字节写入到输出流中
void write(byte b[]):从b的off位置开始,获取len个字节数据,写到输出流中
void flush():刷新此输出流并强制任何缓冲的输出字节被写出。(为之后缓冲流提供抽象方法)
void close():关闭输出流
与之前介绍的字节流大致相同,他们两个区别之一就是它们传递的数据单位不同一个是字节、一个是流。