版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cheidou123/article/details/82941784
一、什么是File类
用来抽象的表示文件或文件夹,这个File不一定存在。代表着java和资源的一个关联
二、路径
1. 拼接路径的方式
第一种拼接方式:直接用/来分割
第二种拼接方式:用File.separator
2. 绝对路径和相对路径
绝对路径:完整的文件路径
相对路径:相对于项目的路径
/***
* @author bincai
* @email [email protected]
*/
public class PathTest {
public static void main(String[] args) {
//第一种拼接方式:直接用/来分割
String path1 = "/Users/caibin/IOstudy/timg.jpeg";
File file1 = new File(path1);
System.out.println(path1);
System.out.println(file1.length());
//第二种拼接方式,用File.separator
String path2 = File.separator + "Users" + File.separator + "caibin" + File.separator + "IOstudy" + File.separator + "timg.jpeg";
File file2 = new File(path2);
System.out.println(path2);
System.out.println(file2.length());
//绝对路径
String path3 = "/Users/caibin/IOstudy/timg.jpeg";
File file3 = new File(path3);
System.out.println(path3);
System.out.println(file3.length());
//相对路径
String path4 = "timg.jpeg";
File file4 = new File(path4);
System.out.println(path4);
System.out.println(file4.length());
}
}
三、File类的构建
1.通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例
File(String pathname)
2.根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(String parent, String child)
3.通过给定的父抽象路径名和子路径名字符串创建一个新的File实例。
File(File parent, String child);
4.通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。
这个相对来说最难理解
File(URI uri)
5.代码
/***
* @author bincai
* @email [email protected]
*/
public class No2_BuildFile {
public static void main(String[] args) {
File file = new File("/Users/caibin/IOstudy/timg.jpeg");
System.out.println(file.length());
File file2 = new File("/Users/caibin/IOstudy", "timg.jpeg");
System.out.println(file2.length());
File file3 = new File(new File("/Users/caibin/IOstudy"), "timg.jpeg");
System.out.println(file3.length());
try {
URI url = new URI("file", null, "/Users/caibin/IOstudy/timg.jpeg", null, null);
File file4 = new File(url);
System.out.println(file4.length());
} catch (Exception e) {
System.out.println(e);
}
}
}
四、File类常用API
1.名称/路径
getName() 获取文件名
getPath() 获取路径(构建是是什么路径就是绝对路径)
getAbsoultePath() 获取绝对路径
getParent() 获取父路径,把getPath文件的名称分隔符前面的拿出来,没有返回为null
2.文件状态
exists() 是否存在
isFile() 是否是文件,目录不是文件夹,在存在的情况下只有文件和目录两种状态!
isDirectory() 是否是目录
import java.io.File;
/***
* @author bincai
* @email [email protected]
*/
public class No3_FileState {
public static void main(String[] args) {
File file = new File("/Users/caibin/IOstudy/timg.jpeg");
if (null == file || !file.exists()) { //这里null == file 这里不需要,这里为了完整加上
System.out.println("文件不存在");
} else {
if (file.isFile()) {
System.out.println("这是个文件");
} else {
System.out.println("这是个目录");
}
}
}
}
3.文件长度
length() 文件长度,如果是目录或不存在返回0, 返回的是long类型
4.创建删除
createNewFile() 创建文件,如果创建不成功(比如已经存在,则返回false),不能创建文件夹
delete() 删除文件,如果是删除文件夹要使用递归!!!
import java.io.File;
import java.io.IOException;
/***
* @author bincai
* @email [email protected]
*/
public class No4_CreateFile {
public static void main(String[] args) throws IOException {
File file = new File("/Users/caibin/IOstudy/caibin.txt");
System.out.println("创建文件之前是否存在"+file.exists());
System.out.println("创建文件"+file.createNewFile());
System.out.println("文件是否存在"+file.exists());
System.out.println("删除文件"+file.delete());
System.out.println("删除文件之后文件是否存在"+file.exists());
}
}
5 文件夹相关
mkdir()/mkdirs() 创建目录,mkdir必须保证上一级存在,mkdirs如果父目录不存在则一同创建,尽量用mkdirs()
list() 返回下级名称(包括文件和文件夹)数组,只是下一级
listFiles() 返回下级File对象(包括文件和文件夹)数组,只是下一级
另外,遍历子孙所有文件,获取文件夹大小,delete需要用递归
public class No5_DirectoryList {
public static void main(String[] args) {
File dir = new File("/Users/caibin/IOstudy/son/grandson1");
System.out.println(dir.mkdirs());
File dir2 = new File("/Users/caibin/IOstudy/son/grandson2");
System.out.println(dir2.mkdirs());
File dir3 = new File("/Users/caibin/IOstudy/son");
String[] list = dir3.list();
for (String s : list) {
System.out.println(s);
}
File[] list2 = dir3.listFiles();
for (File s : list2) {
System.out.println(s.getAbsolutePath());
}
//删除一定要用递归
delete(dir3);
}
public static void delete(File f) {
if(f.isDirectory()){
File[] files = f.listFiles();
for (File file : files) {
delete(file);
file.delete();
}
}
f.delete();
}
}
五、编码与解码
1.什么是字符集
字符集其实就是一个码表,一个字符不同的字符集对应的字节不一样。
utf-8 中文三个字节,英文一个
gbk 中文两个字节,英文一个
2. 编码encode
由字符到字节叫做编码,默认的字符集是根据项目配置来的。
3.解码decode
由字节到字符叫做解码
4.乱码出现的原因
⑴ 字节数不够
⑵ 字符集不统一
5.代码
public class No6_EnDecode {
public static void main(String[] args) throws IOException {
String input = "io流";
//编码 默认的字符集是根据项目配置来的
byte[] byte1 = input.getBytes();
System.out.println(byte1.length);
//使用指定字符集编码
byte[] byte2 = input.getBytes("gbk");
System.out.println(byte2.length);
//解码
String output = new String(byte1);
System.out.println(output);
//乱码1 字节数不够,导致乱码
String output2 = new String(byte1,0,byte1.length-1);
System.out.println(output2);
//乱码2 字符集不一致
String output3 = new String(byte1,"gbk");
System.out.println(output3);
}
}