File类

计算机中万物皆文件

获取File类

获取File类有三种方式[Constructor构造方法]

  • File(String pathName);
    根据对应的文件路径创建获取对应的File类对象,可以是文件,也可以是文件夹
  • File(String parent, String child);
    根据对应的父目录文件夹路径,以及子文件名或者子文件夹名,创建对应的File类对象
  • File(File parent, String child);
    根据对应的父目录文件夹File类对象,以及子文件名或者子文件夹名,创建对应的File类对象

路径

  • 相对路径
    . 当前工作目录
    … 上级目录
  • 绝对路径

分隔符

Java基础之File类和String类_java

File.separatorChar

根据当前系统区分不同的分隔符

Java基础之File类和String类_字符串_02

创建文件和文件夹

  • boolean createNewFile();
    通过File类对象调用,创建对应File类对象中保存的路径的普通文件
    创建成功返回True,创建失败返回False
    返回False的原因:
  1. 路径不合法
  2. 对应的文件夹没有写入权限
  3. 对应当前的文件已经存在
  • boolean mkdir();
    通过File类对象调用,创建对应的File类对象中保存路径的文件夹
    创建成功返回True,创建失败返回False
    返回False的原因:
  1. 路径不合法
  2. 对应的文件夹没有写入权限
  3. 对应当前的文件夹已经存在
  • boolean mkdirs(path);
    创建一个嵌套的文件夹
  • boolean renameTo(File dest);
    通过File类对象调用,转为目标File类对象dest
    文件/文件夹移动,重命名

实例1:

package obj_file;

import java.io.File;
import java.io.IOException;


public class Demo1 {
public static void main(String[] args) throws IOException{
File file = new File("D:\\JavaCode\\test");

// 需要抛出异常,创建文件
File file2 = new File(file, "1.txt");
System.out.println(file2.createNewFile());

// 创建文件夹
File file3 = new File(file, "aaa");
System.out.println(file3.mkdir());

// 创建一个嵌套文件夹
File file4 = new File("D:\\JavaCode\\test\\a\\b\\c\\d");
System.out.println(file4.mkdirs());
}
}

Java基础之File类和String类_类对象_03

效果:

Java基础之File类和String类_类对象_04

Java基础之File类和String类_java_05

实例2:

package obj_file;

import java.io.File;
import java.io.IOException;


public class Demo1 {
public static void main(String[] args) throws IOException{
File file = new File("D:\\JavaCode\\test");

// 需要抛出异常,创建文件
File file2 = new File(file, "1.txt");
System.out.println(file2.createNewFile());

// 文件重命名,相当于覆盖源文件,但是文件的创建时间和修改时间等参数不改变
file2.renameTo(new File("D:\\JavaCode\\test\\test.txt"));
}
}

修改成功:

Java基础之File类和String类_字符串_06

删除文件或者文件夹

  • boolean delete();
    通过File类对象调用,删除对应的文件或者文件夹
    要求:
  1. 删除的文件或者文件夹都是直接抹掉数据,不是放入回收站
  2. 无法删除非空文件夹,文件夹中存在其他内容无法整体删除
  • void deleteOnExit();
    程序退出时删除对应的文件或者文件夹
    可用于删除程序运行过程中,留下的日志文件,缓存文件等
File file = new File("D:\\JavaCode\\test\\test.txt");
System.out.println(file.delete());

File file2 = new File("D:\\JavaCode\\test\\a");
file2.deleteOnExit();

文件属性判断

  • boolean isFile();
    判断是否是一个普通文件
  • boolean isDirectory
    判断是否是一个文件夹
  • boolean isAbsolute();
    判断是否使用了绝对路径
  • boolean isHidden();
    判断是否是隐藏文件
  • boolean exists();
    判断文件是否存在
package obj_file;

import java.io.File;

public class Demo2 {
public static void main(String[] args) {
// 判断是否是一个普通文件
System.out.println(new File("D:\\JavaCode\\test\\1.txt").isFile());

// 判断是否是一个文件夹
System.out.println(new File("D:\\JavaCode\\test\\1.txt").isDirectory());
System.out.println(new File("D:\\JavaCode\\test").isDirectory());

// 判断是否使用了绝对路径,注意20.txt及时不存在结果也是true,只判断是否是绝对路径
System.out.println(new File("D:\\JavaCode\\test\\1.txt").isAbsolute());
System.out.println(new File("D:\\JavaCode\\test\\20.txt").isAbsolute());

// 判断是否是隐藏文件
System.out.println(new File("D:\\JavaCode\\test\\2.txt").isHidden());

// 判断文件是否存在
System.out.println(new File("D:\\JavaCode\\test\\2.txt").exists());
}
}

获取文件属性

  • String getPath();
    获取File类对象保存的路径
  • String getName();
    获取当前File类对象中保存的文件名或者文件夹名
  • String getParent();
    获取当前File类对象对应文件或文件夹的父目录路径
  • String getAbsolutePath();
    获取当前File类对象对应文件或者文件夹的绝对路径

常用方法:

  • long lastModified();
    获取文件最后一次修改时间,返回值是一个时间戳类型,从1970年01月01日00:00:00到现在的秒数
  • long length();
    获取文件的大小,字节数
package obj_file;

import java.io.File;

public class Demo3 {
public static void main(String[] args) {
File file = new File("D:\\JavaCode\\test\\test.txt");

System.out.println(file.getPath());
System.out.println(file.getParent());
System.out.println(file.getName());
System.out.println(file.getAbsolutePath());

// 如果找不到文件,返回时间0
System.out.println(file.lastModified());
// 文件夹返回0L,找不到返回0L
System.out.println(file.length());
}
}

Java基础之File类和String类_类对象_07

package obj_file;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo3 {
public static void main(String[] args) {
File file = new File("D:\\JavaCode\\test\\test.txt");

long lastModified = file.lastModified();
System.out.println(lastModified);

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
String format = simpleDateFormat.format(new Date(lastModified));

System.out.println(format);
}
}

Java基础之File类和String类_字符串_08

列表方法

  • static File[] listRoots();
    通过File类对象调用,有且针对于Windows操作系统有效,获取当前电脑内所有根盘符对象,如果是Linux,UNIX,macos则无效
  • File[] listFiles();
    通过File类对象调用,获取当前File类对象对应文件夹下的所有子文件或者子文件夹的File类对象数组
  • String[] list();
    通过File类对象调用,获取当前File类对象对应文件夹下的所有子文件或者子文件夹的String类型文件名或者文件夹名称数组

实例:

package obj_file;

import java.io.File;

public class Demo4 {
public static void main(String[] args) {
File[] listRoots = File.listRoots();

/*
* for (数据类型 变量名:数组/集合) {
* }
*/
for(File file : listRoots) {
System.out.println(file);
}

System.out.println("--------------");
File file = new File("D:\\JavaCode\\test");
File[] listFiles = file.listFiles();
for (File file2 : listFiles) {
System.out.println(file2);
}

System.out.println("--------------");
String[] liStrings = file.list();
for (String string : liStrings) {
System.out.println(string);
}
}
}

输出:

Java基础之File类和String类_类对象_09

FilenameFilter文件名过滤器

匿名内部类实现方法:

package obj_file;

import java.io.File;
import java.io.FilenameFilter;

public class Demo5 {
public static void main(String[] args) {
File file = new File("D:\\JavaCode\\test");

// 使用匿名内部类的匿名对象直接作为方法的参数
File[] listFiles = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
/*
* dir是当前操作的文件夹类对象 name是当前文件夹下的子文件或者子文件夹 获取对应的Java文件 1.判断是不是普通文件
* 2.判断当前文件夹是不是以.java结尾的
*/
return new File(dir, name).isFile() && name.endsWith(".java");
}
});

for (File file2 : listFiles) {
System.out.println(file2);
}
}
}

lambda表达式方法实现:

jdk1.8新特征

File[] listFiles = file.listFiles((dir, name) -> 
new File(dir, name).isFile() && name.endsWith(".java")
);

for (File file2 : listFiles) {
System.out.println(file2);
}

Java基础之File类和String类_字符串_10

常用API-String

String字符串冗余问题

Java基础之File类和String类_字符串_11

复习实例:

将文件按照不同的文件后缀名归类,如:Java后缀的放到Java文件夹,doc文件放到doc文件夹

Java基础之File类和String类_java_12

Java基础之File类和String类_java_13

package obj_file;

import java.io.File;
import java.io.IOException;

public class Demo7 {
public static void main(String[] args) throws IOException{
// 目标文件夹的File类对象
File file = new File("D:\\JavaCode\\demo");

// 需要创建的文件夹类对象
File toBeCreateFile = null;

// 判断file是否是文件夹,不是文件夹就退出程序
if(!file.isDirectory()) {
return;
}

// 当前文件夹已经完成归档,不需要再次归档
if(new File(file,"1.lock").exists()) {
System.out.println("已经归档完成");
return;
}

// 当前文件夹下的所有子文件和子文件夹File类对象
File[] listFiles = file.listFiles();

// 遍历listFiles对象数组
for (File srcFile : listFiles) {
// 如果是文件,获取后缀名
if(srcFile.isFile()) {
String fileName = srcFile.getName();
String upperSuffix = fileName.substring(fileName.lastIndexOf(".") + 1)
.toUpperCase();
toBeCreateFile = new File(file, upperSuffix);
} else {
// 如果是文件夹,则创建子文件夹最后统一移进去
toBeCreateFile = new File(file, "subDir");
}

// 创建文件夹
toBeCreateFile.mkdir();

// 移动文件
srcFile.renameTo(new File(toBeCreateFile, srcFile.getName()));
}

// 创建锁文件
new File(file, "1.lock").createNewFile();
}
}

执行效果:

Java基础之File类和String类_类对象_14

String类

String比较

Java基础之File类和String类_字符串_15

双等于号(==)更多的是比较地址,而.equals比较的是数值,推荐使用equals

推荐使用:

String str1 = "test"

比较方法

获取方法

  • int length();
    获取字符串长度
  • char charAt(int index);
    获取String字符串中指定下标位置的char类型字符,如果index超出有效范围,抛出异常StringIndexOutOfBoundException
  • int indexOf(char ch);
  • int indexOf(String str);
  • int indexOf(char ch, int fromIndex);
  • int indexOf(String str, int fromIndex);
    这四个方法都是获取指定元素所在的下标位置,元素可以是char类型字符,也可以是字符串,找出指定元素在字符串中第一次出现的位置,也可以通过fromIndex约束,从哪个位置开始找
  • int lastIndexOf(char ch);
  • int lastIndexOf(String str);
  • int lastIndexOf(char ch, int fromIndex);
  • int lastIndexOf(String str, int fromIndex);
    这四个方法都是获取指定元素所在的下标位置,元素可以是char类型字符,也可以是字符串,找出指定元素在字符串中最后一次出现的位置,也可以通过fromIndex约束,从哪个位置开始找

找到返回位置(从0开始),找不到返回负数

实例:

package obj_string;

public class Demo1 {
public static void main(String[] args) {
String str = "ocean is a good boy";

System.out.println("str的长度:" + str.length());
System.out.println("下标为4的字符为:" + str.charAt(4));
System.out.println("===========================================");

System.out.println("字符o所在的位置为:" + str.indexOf("o"));
System.out.println("字符串oo所在的位置为:" + str.indexOf("oo"));
System.out.println("字符o从5开始后查找第一次出现的位置为:" + str.indexOf("o", 5));
System.out.println("字符串oo从5开始后查找第一次出现的位置为:" + str.indexOf("oo", 5));
System.out.println("===========================================");

System.out.println("字符o所在的位置为:" + str.lastIndexOf("o"));
System.out.println("字符串oo所在的位置为:" + str.lastIndexOf("oo"));
System.out.println("字符o从5开始后查找最后一次出现的位置为:" + str.lastIndexOf("o", 5));
System.out.println("字符串oo从5开始后查找最后一次出现的位置为:" + str.lastIndexOf("oo", 5));
System.out.println("字符串o从5开始后查找最后一次出现的位置为:" + str.lastIndexOf("o", 5));
System.out.println("===========================================");

System.out.println("字符串a从5开始后查找第一次出现的位置为:" + str.lastIndexOf("a", 5));

}
}

Java基础之File类和String类_java_16

注意:lastIndexOf(String str, int fromIndex);加了fromIndex就是从后往前数

判断方法

  • boolean endsWith(String str);
    判断当前字符串是不是以指定字符串结尾
  • boolean isEmpty();
    判断字符串是否为空 ""空串
    JDK1.6之后,null不能读取,不能写入,不能调用方法
  • boolean equals(Object obj);
    继承重写Object类内的方法,完成字符串要求的比较方法
  • boolean equalsIgnoreCase(String str);
    不区分大小写比较
  • boolean contains(String str);
    判断字符串是否存在
package obj_string;

public class Demo2 {
public static void main(String[] args) {
String str = "ocean";

System.out.println("str.isEmpty:" + str.isEmpty());
System.out.println("str.endsWith:" + str.endsWith("an"));
System.out.println("abcdefg".equals("abcdefg"));
System.out.println("AbCdefg".equalsIgnoreCase("abcdefg"));
System.out.println(str.contains("an"));
}
}

Java基础之File类和String类_java_17

转换方法

数组转换成字符串

  • String(char[] arr);
    使用字符数组中内容创建一个字符串对象
  • String(char[] arr, int offset, int length)
    使用字符数组中内容创建一个字符串对象,offset是从char类型数组中指定下标位置开始获取数据,获取的数据长度为length
  • static String valueOf(char[] arr);
    通过类名调用的静态方法,实际执行的是String(char[] arr, int offset, int length);
  • char[] toCharArray();
    返回当前字符串对应的字符数组
package obj_string;

public class Demo3 {
public static void main(String[] args) {
char[] arr = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};

String str1 = new String(arr);
System.out.println(str1);

String str2 = new String(arr, 2, 5);
System.out.println(str2);

String str3 = String.valueOf(arr);
System.out.println(str3);

String str4 = String.valueOf(arr, 2, 5);
System.out.println(str4);
}
}

输出结果:

Java基础之File类和String类_类对象_18

字符串转换成数组:

package obj_string;

import java.util.Arrays;

public class Demo3 {
public static void main(String[] args) {
char[] charArray = "这是一个字符串".toCharArray();
System.out.println(Arrays.toString(charArray));
}
}

Java基础之File类和String类_类对象_19

其他方法

  • String replace(char oldChar, char newChar)
    替换,替换不会修改原始的字符串,会创建一个新的字符串返回,将所有就字符替换为新字符或字符串
  • String[] split(String regex)
    按照指定的字符串切割当前字符串
  • String substring(int beginIndex);
    从指定位置开始,截取子字符串,到字符串末尾
  • String substring(int beginIndex, int endIndex)
    截取字符串从beginIndex位置开始到endIndex位置结束,要头不要尾,左闭右开
  • String toUpperCase()
    字符串转换成大写
  • String toLowerCase()
    字符串小写转大写
  • String trim()
    去除字符串两边的空格

实例:

package obj_string;

import java.util.Arrays;

public class Demo4 {
public static void main(String[] args) {
String string = "abcabcabc";

System.out.println(string.replace('a', 'A'));
System.out.println(string.replace("a", "AAA"));
System.out.println(string);

String[] strings = "a,b,c,d".split(",");
System.out.println(Arrays.toString(strings));

System.out.println(string.substring(2));
System.out.println(string.substring(2, 5));

System.out.println(string.toUpperCase());
System.out.println("AAAA".toLowerCase());

System.out.println(" ocean ocean ");
System.out.println(" ocean ocean ".trim());
}
}

执行结果

Java基础之File类和String类_java_20