通过对File的学习,掌握如下几个基础知识点:
1.学习File的常用方法
2.获取当前项目的路径
3.如何在项目下创建指定文件夹和指定文件
4.复制指定文件夹下的所有文件
5.实现对电脑所有磁盘的文件扫描
6.删除磁盘指定文件夹的所有文件
7.简单学习爬取指定网站的链接网址
一、File的常用方法,应该包括其构造方法和常用普通方法,如下代码:
private void studyFileMethods(){
// 1.通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例(文件目录在src目录下)
File file=new File("F:\\studyNote\\2021\\ClassStudy\\MyNumber\\src\\demoFiles\\studyFiles.txt");
// 2.判断该文件在当前程序的该路径下能否执行
boolean canExecute = file.canExecute();
// 2.1.设置该抽象路径名的所有者的执行权限
file.setExecutable(true);
// 2.2.设置该抽象路径名的所有者或每个人的执行权限
file.setExecutable(true,true);
// 3.判断该路径下的文件是否存在,存在则读取,不存在则创建
if (!file.exists()) {
// 4.文件不存在,创建文件(必须是在绝对路径下方可创造)
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
} else {
// 4.在该抽象路径下是否可读
boolean canRead = file.canRead();
// 4.1.设置该抽象路径名的所有者的读取权限
file.setReadable(true);
// 4.2.设置该抽象路径名的所有者或每个人的读取权限
file.setReadable(true,true);
// 4.3.设置该抽象路径名的文件或目录只读
file.setReadOnly();
// 5.在该抽象路径下是否可写
boolean canWrite = file.canWrite();
// 4.1.设置该抽象路径名的所有者的写入权限
file.setWritable(true);
// 4.2.设置该抽象路径名的所有者或每个人的写入权限
file.setWritable(true,true);
// 6.比较两个抽象的路径名字典
File file1=new File("demoFiles\\studyFiles1.txt");
int compareValue = file.compareTo(file1);
// 7.删除该文件
// boolean delete = file.delete();
// 8.请求在虚拟机终止时删除由此抽象路径名表示的文件或目录
//file.deleteOnExit();
// 9.获取文件名称
String fileName = file.getName();
// 10.文件重命名(可以指定位置和名称,类似于另存为)
boolean renameTo = file.renameTo(new File("test1.txt"));
// 11.获取文件的绝对路径
String absolutePath = file.getAbsolutePath();
// 11.1.获取文件的路径(结果同上)
String path = file.getPath();
// 12.返回此抽象路径名的路径名字符串
Path toPath = file.toPath();
// 13.返回此抽象路径名的绝对形式,同11/12字符串结果一样
File absoluteFile = file.getAbsoluteFile();
try {
// 14.返回此抽象路径名的规范形式
File canonicalFile = file.getCanonicalFile();
// 15.返回此抽象路径名的规范路径名字符串。(11/12/13/14/15字符串结果均一样,得到绝对路径名)
String canonicalPath = file.getCanonicalPath();
} catch (IOException e) {
e.printStackTrace();
}
// 16.构造一个表示此抽象路径名的 file: URI
URI uri = file.toURI();
// 17.获取文件的长度
long length = file.length();
// 18?.返回分区未分配的字节数 named此抽象路径名
long freeSpace = file.getFreeSpace();
// 19?.通过此抽象路径名返回分区 named的大小
long totalSpace = file.getTotalSpace();
// 20?.返回上的分区提供给该虚拟机的字节数 named此抽象路径名
long usableSpace = file.getUsableSpace();
// 21.测试这个抽象路径名是否是绝对的
boolean absolute = file.isAbsolute();
// 22.测试此抽象路径名表示的文件是否为目录
boolean directory = file.isDirectory();
// 23.测试此抽象路径名表示的文件是否为普通文件
boolean isFile = file.isFile();
// 24.测试此抽象路径名命名的文件是否为隐藏文件
boolean hidden = file.isHidden();
// 25.返回此抽象路径名表示的文件上次修改的时间
long lastModified = file.lastModified();
// 26.设置由此抽象路径名命名的文件或目录的最后修改时间
boolean setLastModified = file.setLastModified(9999999999999L);
// 27.获取上一级路径,即去掉文件名的路径,如果没有则为null
String parent = file.getParent();
// 28.获取上一级的文件,与27获取的字符串结果一样,但是实际结果完全不同,一个是字符串,一个是文件
File parentFile = file.getParentFile();
// 29.返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录,该例中已是文件,所以均为0
String[] list = file.list();
// 30.返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件,该例中已是文件,所以均为0
File[] files = file.listFiles();
// 31.返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录
String[] list1 = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// 如果是指定的文件,就添加到文件数组中,如果不是,就不添加。dir当前文件的目录,name当前目录下各个文件的名称
if("test.txt".equals(name))
return true;
else
return false;
}
});
// 32.返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录
File[] files1 = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
String pathnameName = pathname.getName();
String substring = pathnameName.substring(pathnameName.lastIndexOf("."));
// 若是以“.txt”结尾则返回true,否则false,作用是过滤掉所有非“.txt”文件
if(".txt".equals(substring))
return true;
else
return false;
}
});
// 33.返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录
File[] files2 = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// 如果是指定的文件,就添加到文件数组中,如果不是,就不添加。dir当前文件的目录,name当前目录下各个文件的名称
if("test.txt".equals(name))
return true;
else
return false;
}
});
}
}
二、获取当前目录的路径有如下的方法:
// 1.获取当前类的路径方法1
URL resource1 = FileDemo.class.getResource("/");
// 2.获取当前类的路径方法2
URL resource2 = FileDemo.class.getResource("");
// 3.获取当前类的路径方法3
URL resource3 = Thread.currentThread().getContextClassLoader().getResource("");
// 4.获取当前类的路径方法4
URL resource4 = FileDemo.class.getClassLoader().getResource("");
// 5.获取当前类的路径方法5
URL systemResource = ClassLoader.getSystemResource("");
// 6.获取当前类的路径方法6
String absolutePath = new File("").getAbsolutePath();
//测试结果输出
System.out.println("方法1:"+resource1.getPath());
System.out.println("方法2:"+resource2.getPath());
System.out.println("方法3:"+resource3.getPath());
System.out.println("方法4:"+resource4.getPath());
System.out.println("方法5:"+systemResource.getPath());
System.out.println("方法6:"+absolutePath);
========================================================================================结果如下:==================================================================================
方法1:/F:/studyNote/2021/ClassStudy/MyNumber/out/production/MyNumber/
方法2:/F:/studyNote/2021/ClassStudy/MyNumber/out/production/MyNumber/com/study/file/
方法3:/F:/studyNote/2021/ClassStudy/MyNumber/out/production/MyNumber/
方法4:/F:/studyNote/2021/ClassStudy/MyNumber/out/production/MyNumber/
方法5:/F:/studyNote/2021/ClassStudy/MyNumber/out/production/MyNumber/
方法6:F:\studyNote\2021\ClassStudy\MyNumber
三、在项目下创建一个files文件夹和该文件夹下的data.txt文件(需要先创建文件再创建文件夹)
// 创建文件夹
File file = new File("files");
if(!file.exists()){
file.mkdirs();// files成为目录文件
}
// 创建文件
File dataFile = new File("files/data.txt");
if(!dataFile.exists()){
try {
dataFile.createNewFile();// 创建文件
} catch (IOException e) {
e.printStackTrace();
}
}
四、复制指定文件夹下的所有文件到指定目录下:(将该项目的所有文件复制到D盘下)
解决思路:
(1)首先需要获取将要读取项目的路径
(2)读取项目路径下的文件夹和文件,是文件就复制文件,是文件夹下就进行判断D盘是否存在该文件夹,不存在则进行创建,然后继续读取
(3)使用递归的方式读取,直至读完所有的文件
// 调用方法
File srcFile=new File("F:\\studyNote\\2021\\ClassStudy\\MyNumber");
File destFile=new File("D:\\");
this.studyFileCopyDirectory(srcFile,destFile);
/**
* 遍历文件
*
* @param srcFile 源文件
* @param destFile 目标文件
*/
private void studyFileCopyDirectory(File srcFile,File destFile){
// 判断是否是文件
if(srcFile.isFile()){// 是文件
// 获取保存文件的路径
String path=(destFile.getAbsolutePath().endsWith("\\") ? destFile.getAbsolutePath() : destFile.getAbsolutePath()+"\\")+srcFile.getAbsolutePath().substring(3);
// 读文件
try (
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos=new FileOutputStream(path)
) {
byte[] bytes=new byte[1024];
int aa=fis.read(bytes);
while (aa != -1){
fos.write(bytes,0,aa);
aa=fis.read(bytes);
}
fos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return;
}
// 获取文件夹下的所有文件
File[] files = srcFile.listFiles();
for (File file : files) {
if(file.isDirectory()){
// 获取创建目录文件的路径
String destPath=(destFile.getAbsolutePath().endsWith("\\") ? destFile.getAbsolutePath() : destFile.getAbsolutePath()+"\\")+file.getAbsolutePath().substring(3);
// 创建新文件
File newFile=new File(destPath);
// 目录不存在则创建目录
if(!newFile.exists()){
newFile.mkdirs();
}
}
// 递归判断执行
studyFileCopyDirectory(file,destFile);
}
}
五、实现对电脑磁盘所有文件的扫描:
private void scannerAllFile() {
// 获取所有的根目录
File[] files = File.listRoots();
// 遍历根目录
for (File file : files) {
long start = System.currentTimeMillis();
System.out.println("=======================================================================" + file.getAbsolutePath() + "盘所有末端文件夹或文件名称=========================================================");
// 获取目录文件下的所有文件
File[] files1 = file.listFiles();
// 结果判断:null值说明是文件,否则是文件夹
if (files1 != null) {
// 文件夹长度为0说明该文件夹中是没有任何文件的,否则至少存在一个文件
if (files1.length == 0) {
System.out.println("文件夹的名称:" + file.getName());
} else {
// 将所获文件添加到未读文件集合中
for (File file1 : files1) {
if (unReadFiles.contains(file1) == false) {
unReadFiles.add(file1);
}
}
}
} else {
System.out.println("文件名称:" + file.getName());
}
// 对磁盘中所有文件进行读取
printFileName();
long end = System.currentTimeMillis();
times.add((end - start) / (1000 * 60));
}
}
private void printFileName() {
// 执行条件:集合不为空且具有元素的情况下执行
if (unReadFiles != null) {
// 依次读取文件
for (int i = 0; i < unReadFiles.size(); i++) {
File unReadFile = unReadFiles.get(i);
if (unReadFile != null) {
File[] listFiles = unReadFile.listFiles();
// 判断文件是否为空:空值说明是文件,否则是文件夹
if (listFiles != null) {
// 文件夹长度为0,说明没有子文件
if (listFiles.length == 0) {
System.out.println("文件夹名字:" + unReadFile.getName());
} else {
// 集合大于1,说明有文件,把未读取文件添加到集合中
for (File listFile : listFiles) {
if (unReadFiles.contains(listFile) == false)
unReadFiles.add(listFile);
}
}
} else {
System.out.println("文件名称:" + unReadFile.getName());
}
}
// 删除已经执行的文件
unReadFiles.remove(unReadFile);
}
printFileName();
}
}
六.删除磁盘指定文件夹的指定类型文件:给定磁盘和指定文件夹删除方法很简单,如下
// 指定删除文件夹下的指定类型文件(如果只有文件夹的名字,则需要遍历磁盘查询获取)
String fileName = "E:\\测试文件";
this.deleteFiles(fileName);
private void deleteFiles(String fileName){
// 获取该路径下的文件
File file = new File(fileName);
// 获取其目录下的所有文件并进行遍历
File[] files = file.listFiles();
if (files != null) {
for (File fe : files) {
if(fe.isFile()){
// 删除所有txt文件
if(fe.getName().endsWith(".txt")){
fe.delete();// 删除文件
}
}else{
deleteFiles(fe.getAbsolutePath());
}
}
}
}
七.简单学习爬取指定网站的链接网址(很多网站是不允许爬取的,这里以自学网为例)
/**
* 通过指定网站爬取6个网站的所有https的地址
*/
private void crawlerMyPage(){
System.out.println("Enter a URL: ");
// 爬取我要自学网网站:https://www.51zxw.net/
String bgURL=input.next();
// 记录没有爬过的网址
ArrayList<String> listOfPendingURLs=new ArrayList<>();
// 记录已经爬过的网址
ArrayList<String> listOfTraverURLs=new ArrayList<>();
// 没爬过的网址添加到记录中
listOfPendingURLs.add(bgURL);
// 只爬取六个网址
while(!listOfPendingURLs.isEmpty()&&listOfTraverURLs.size()<=5) {
// 爬过之后移除
String ul=listOfPendingURLs.remove(0);
// 如果是新的网址,才进行爬取
if(!listOfTraverURLs.contains(ul)) {
// 把爬过的网址添加到保存记录中
listOfTraverURLs.add(ul);
// 遍历获取到的所有网址,如果没有爬取过,则将爬取到的网址添加到记录没有爬过的集合中
for(String s: getSubURLs(ul)) {
if(!listOfTraverURLs.contains(s)) {
listOfPendingURLs.add(s);
}
}
}
}
System.out.println("==========================================遍历集合listOfPendingURLs============================================================");
if (listOfPendingURLs != null) {
for (String listOfPendingURL : listOfPendingURLs) {
System.out.println(listOfPendingURL);
}
}
System.out.println("==========================================遍历集合listOfTraverURLs============================================================");
if (listOfTraverURLs != null) {
for (String listOfTraverURL : listOfTraverURLs) {
System.out.println(listOfTraverURL);
}
}
}
/**
* 获取爬过的网址的集合
* @param ul 进行爬取的网址
* @return 返回一个String类型的集合,记录爬到的网址
*/
public ArrayList<String> getSubURLs(String ul){
ArrayList<String> list=new ArrayList<>();
try {
// 获取具体要爬的网站
URL rl = new URL(ul);
// 读取流文件
Scanner in=new Scanner(rl.openStream());
// 记录查找到的开始位置
int count=0;
while(in.hasNext()) {
// 按行读
String line=in.nextLine();
// 获取以http或https:开头的位置
count=line.indexOf("http:",count);
while(count>0) {
// 获取以"结尾的位置
int endIndex=line.indexOf("\"",count);
if(endIndex>0){// 正值表示符合要求
list.add(line.substring(count,endIndex));
count=line.indexOf("http:",endIndex);
}else {// 没找到就是没有符合的网址
count=-1;
}
}
}
} catch (Exception e) {
System.out.println("程序出错");
e.printStackTrace();
}
return list;
}