1File类
1.1创建对象
常使用第一种情况:
//1.创建File对象
File f = new File("F:\\images\\nature.png"); // \\转义字符
System.out.println(f); //打印 new File对象的字符串(相对/绝对路径)
System.out.println(f.length()); //文件的字节大小
直接字符: /
File f1 = new File("F:/images/nature.png"); // 可以直接使用/
针对不同系统的分隔符 ,File.separator
对不同系统(比直接字符)有适应性
File f2 = new File("F:"+File.separator+"images"+File.separator+"nature.png");
注意:
-
文件路径可以使用 绝对路径 和 相对路径
-
绝对路径:从盘符开始 (之前已使用)
-
相对路径:不带盘符,默认直接到当前工程下的目录寻找文件
//相对路径 相对于当前工程project下 ,(最先以模块开始)!!! File file2 = new File("file-io-app/src/abc.txt"); System.out.println(file2); System.out.println("文件的规范路径:" + file2.getCanonicalPath()); //返回此抽象路径名的规范路径名字符串。
-
-
File创建对象,可以是文件或文件夹
1.2常用API
方法 | 说明 |
---|---|
public boolean isDirectory() | 测试此路径名表示的File是否为文件夹 |
public boolean isFile() | 测试此路径名表示的File是否为文件 |
public boolean exists() | 测试此路径名表示的File是否存在 |
public String getAbsolutePath() | 返回此路径名的绝对路径 字符串 |
public String getPath() | 返回定义File时使用的绝对 或相对 路径 |
public String getName() | 返回此路径名表示的文件或文件夹的名称 |
public long lastModified() | 返回文件最后修改的时间ms |
public class FileApiDemo {
public static void main(String[] args) {
File f1 = new File("src\\abc.txt");
//a.获取文件绝对路径
System.out.println(f1.getAbsolutePath()); //获取绝对路径
//b.获取文件名称
System.out.println(f1.getName());
//c.获取定义文件的路径
System.out.println(f1.getPath()); //创建File对象时使用的路径(绝对或相对)
//d.判断是否为文件类型
System.out.println(f1.isFile());
//e.判断是否为文件夹类型
System.out.println(f1.isDirectory()); //false , 文件夹(包含其他文件)
File file = new File("C:");
System.out.println(file.isDirectory()); //true
//f.文件是否存在
System.out.println(f1.exists());
//g.最后修改时间的毫秒值
long time1 = f1.lastModified();
System.out.println(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(time1));
}
}
1.3创建文件
方法 | 说明 |
---|---|
public boolean createNewFile() | 创建一个新的空的文件 |
public boolean mkdir() | 只能创建一级文件夹 / 目录 |
public boolean mkdirs() | 可以创建多级文件夹 /目录 |
public class GenerateNewFile {
public static void main(String[] args) throws Exception {
//1创建新的空的 文件
File file = new File("F:\\code\\abc.txt");
System.out.println(file.createNewFile());
//2创建一级文件夹
File file1 = new File("F:\\code\\test\\1\\2");
System.out.println(file1.mkdir()); // false
//3创建多级文件夹
System.out.println(file1.mkdirs()); //true
}
}
1.4删除文件
方法 | 说明 |
---|---|
public boolean delete() | 删除由此抽象路径名表示的空文件夹 |
- delete方法默认只能删除空文件夹
- delete方法直接删除,不走回收站;
public class DeleteFile {
public static void main(String[] args) {
File file = new File("\u202AF:\\code\\test.txt");
System.out.println(file.delete()); //false 1KB 不能直接删除
File file3 = new File("\u202AF:\\code\\test1.txt");
System.out.println(file3.delete()); //false 不能直接删除空文件
File file1 = new File("F:\\code\\1\\2\\3");
System.out.println(file1.delete()); //true 直接删除文件夹 F:/code/1/2/3
File file2 = new File("F:\\code\\1");
System.out.println(file1.delete()); //false 不能直接删除非空文件夹
}
}
1.5文件遍历
方法 | 说明 |
---|---|
public String[] list() | 获取当前目录 下所有的“一级文件名称”到一个字符串数组中 |
public File[] listFiles()常用 | 获取当前目录 下 所有的“一级文件对象”到一个文件对象数组中并返回 |
public class FileApiDemo2 {
public static void main(String[] args) throws IOException {
File f = new File("D:\\work-manager");
//1.获取目录所有一级文件(含文件夹)名称,到一个字符数组中,并返回
//获取目录路径下的第一层文件(文件夹)
String[] list = f.list();
for (String s : list) {
System.out.println(s);
}
//2.获取目录所有一级文件对象,到一个文件对象数组中返回
File[] files = f.listFiles();
for (File file : files) {
System.out.println(file);
}
}
}
listFiles方法注意:
- 调用者不存在时,返回null
- 调用者是一个文件时,返回null , 需要目录(文件夹)
- 调用者是一个空文件夹时,返回一个length为0的数组
- 调用者是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
- 调用者是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏内容
- 调用者是一个需要权限才能进入的文件夹时,返回null
1.6文件搜索
递归:
- 方法直接或间接 自己调用自己
recursion
实例:
从D:
盘中,搜索某个文件名称 并输出绝对路径;
- 1定位出 一级文件对象数组
- 2遍历全部一级文件对象,判断是否是文件
- 3如果是文件,则判断是否是自己想要的
- 4如果是文件夹,则继续 递归 重复上述整个过程
public class RecursionDemo4 {
public static void main(String[] args) {
//2.调用方法
searchFile(new File("D:/"),"detect.p");
}
/**
* 1.根据文件名称,递归搜索文件路径
* @param dir 查找的文件目录
* @param name 待查找的文件名称
*/
public static void searchFile(File dir , String name){
//3.判断dir是否为目录
if(dir != null && dir.isDirectory()){
//4.提取当前目录下的一级文件对象
File[] files = dir.listFiles();
//5.判断文件数组是否存在文件对象
if (files != null && files.length > 0){
//6.遍历文件数组
for (File file : files) {
//7.文件对象是否为文件,是则匹配
if (file.isFile()){
//.contains模糊包含
if (file.getName().contains(name)){
System.out.println("找到了!!!"+name + "的绝对路径为" + file.getAbsolutePath());
//启动它
try {
//调用外部程序
Runtime.getRuntime().exec(file.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
}
}
}else {
//8.是文件夹(目录)则递归匹配
searchFile(file,name);
}
}
}
}else {
System.out.println("您输入的文件不是目录,无法查询");
}
}
}
2字符集
计算机可以给人类字符进行编号,这套编号规则就是字符集 charset;
-
ASCII(American Standard Code for Information Interchage,美国信息交换标准代码)包括了数字、英文、符号;
- 使用
1个字节存储一个字符
,总共128个
- 使用
-
GBK (即
国标
)window
系统默认的码表,包含了几万个汉字- GBK是中国的码表,一个中文以
两个
字节存储
- GBK是中国的码表,一个中文以
-
Unicode (统一码、万国码、单一码)
- 计算机科学领域里的一项业界字符码表标准
- 容纳世界上大多数的常用文字和符号
- Unicode会先通过 UTF-8 , UTF-16以及UTF-32的编码成二进制后 ,再存储到计算机中。 最常见为UTF-8
- UTF-8 是 一个中文以
三个字节
存储
- UTF-8 是 一个中文以
注意:
- UTF-8也要兼容ASCII
- 编码前后 , 字符集需要一致,否则会出现中文乱码
- 技术人员都应当使用UTF-8的字符集编码
2.1编码/解码
String 编码
方法 | 描述 |
---|---|
byte[] getBytes() | 使用默认字符集 将该字符串 编码成一系列字节,将结果存储到新的字节数组 |
byte[] getBytes(String charsetName) | 使用指定字符集 将该字符串编码成一系列的字节,将结果存储到新的字节数组 |
String 解码
方法 | 描述 |
---|---|
String(byte[] bytes) | 通过默认字符集解码 指定的字节数组来构造新的String |
String(byte[] bytes,String charsetName) | 通过指定的字符集 解码指定的字节数组来构造新的String |
public class CharsetDemo {
public static void main(String[] args) throws Exception{
//1.编码把文字转变为二进制
String s = "我爱你中国,至死不渝hhh~~~";
byte[] bytes = s.getBytes();// 默认UTF-8 , 中文 为 3个字节 共计34
byte[] b = s.getBytes("GBK"); //GBK , 中文为2个字节 共计25
System.out.println(bytes.length);
//中文显示为负数
System.out.println(Arrays.toString(bytes));
System.out.println(b.length);
System.out.println(Arrays.toString(b));
//2.解码把二进制转变为中文字符
//使用构造器,生成String
//String rs = new String(bytes,"GBK"); //编码与解码的字符集要对应 , 乱码
String rs = new String(bytes);
System.out.println(rs);
String rs1 = new String(b,"GBK");
System.out.println(rs1);
//3.换行符
String s1 = "\n";
byte[] bytes1 = s1.getBytes();
System.out.println(bytes1.length);
System.out.println(new String(bytes1));
}
}