linux去掉java路径_Java显示目录文件列表和删除目录
Java顯示目錄文件列表和刪除目錄
以d:\a目錄為例,假設D:\a目錄內的結構如下:
d:\a
|--a.sql
|--back.log
|--b
| |--e
| | |--1.txt
| | |--2.txt
| | `--3.txt
| `--f
| |--4.txt
| |--5.txt
| `--6.txt
|--c
| |--e
| | |--ace1.txt
| | |--ace2.txt
| | `--ace3.txt
| `--f
| |--4.txt
| |--5.txt
| `--6.txt
`--d
|--a.java
|--abc (1).txt
|--abc (2).txt
|--abc (3).txt
|--b.java
`--c.java
4.1 示例1:列出整個目錄中的文件(遞歸)
思路:
1.遍歷目錄d:\a。
2.每遍歷到d:\a中的一個目錄就遍歷這個子目錄。因此需要判斷每個遍歷到的元素是否是目錄。
以下是從普通代碼到遞歸代碼前的部分代碼:
File dir = new File("d:/a");
File[] file_list = dir.listFiles();
for (File list : file_list) {
if (list.isDirectory()) {
File dir_1 = list.listFiles(); //此處開始代碼重復,且邏輯上可能會無限遞歸下去
if (dir_1.isDirectory()) {
....
}
} else {
System.out.println(list.getAbsolutePath());
}
}
對重復的代碼部分進行封裝,于是使用遞歸方法,既封裝代碼,又解決無限遞歸問題。最終代碼如下:
import java.io.*;
public class ListAllFiles {
public static void main(String[] args){
File dir = new File("d:/a");
System.out.println("dir------>"+dir.getAbsolutePath());
listAll(dir);
}
public static void listAll(File dir){
File[] file_list = dir.listFiles();
for (File file : file_list) {
if (file.isDirectory()) {
System.out.println("dir------>"+file.getAbsolutePath());
listAll(file);
} else {
System.out.println("file------>"+file.getAbsolutePath());
}
}
}
}
4.2 示例2:列出整個目錄中的文件(隊列)
思路:
1.遍歷給定目錄。將遍歷到的目錄名放進集合中。
2.對集合中的每個目錄元素進行遍歷,并將遍歷到的子目錄添加到集合中,最后每遍歷結束一個目錄就從集合中刪除它。
3.這樣一來,只要發現目錄,就會一直遍歷下去,直到某個目錄整個都遍歷完,開始遍歷下一個同級目錄。
需要考慮的是使用什么樣的集合。首先集合內目錄元素無需排序、不同目錄內子目錄名可能重復,因此使用List集合而非set集合,又因為頻繁增刪元素,因此使用linkedlist而非arraylist集合,linkedlist集合最突出的特性就是FIFO隊列。
相比于遞歸遍歷,使用隊列遍歷目錄的好處是元素放在容器中,它們都在堆內存中,不容易內存溢出。
import java.util.*;
import java.io.*;
public class ListAllFiles2{
public static void main(String[] args){
File dir = new File("d:/a");
Queue file_queue = new Queue(); //構建一個隊列
File[] list = dir.listFiles();
for (File file : list) { //遍歷頂級目錄
if(file.isDirectory()) {
System.out.println("dir------>"+file.getAbsolutePath());
file_queue.add(file);
} else {
System.out.println("file------>"+file.getAbsolutePath());
}
}
while (!file_queue.isNull()) { //從二級子目錄開始,逐層遍歷
File subdirs = file_queue.get(); //先取得二級子目錄名稱
File[] subFiles = subdirs.listFiles();
for (File subdir : subFiles) { //遍歷每個下一級子目錄
if(subdir.isDirectory()) {
System.out.println("dir------>"+subdir.getAbsolutePath());
file_queue.add(subdir); //如果內層還有子目錄,添加到隊列中
} else {
System.out.println("file------>"+subdir.getAbsolutePath());
}
}
}
}
}
class Queue{
private LinkedList linkedlist;
Queue() {
linkedlist = new LinkedList();
}
public void add(E e){
linkedlist.addFirst(e); //先進
}
public E get(){
return linkedlist.removeLast(); //先出
}
public boolean isNull(){
return linkedlist.isEmpty();
}
}
4.3 示例3:樹形結構顯示整個目錄中的文件(遞歸)
思路:
1.先列出一級目錄和文件。
2.如果是目錄,則加一個構成樹形的前綴符號。然后再遍歷這個目錄,在此需要遞歸遍歷。
import java.io.*;
public class TreeFiles {
public static void main(String[] args){
File dir = new File("d:/a");
System.out.println(dir.getName());
listChilds(dir,1);
}
public static void listChilds(File f,int level){
String prefix = "";
for(int i=0;i
prefix = "| " + prefix;
}
File[] files = f.listFiles();
for (File file : files) {
if(file.isDirectory()) {
System.out.println(prefix + file.getName());
listChilds(file,level+1);
} else {
System.out.println(prefix + file.getName());
}
}
}
}
結果如下:
a
| a.sql
| b
| | e
| | | 1.txt
| | | 2.txt
| | | 3.txt
| | f
| | | 4.txt
| | | 5.txt
| | | 6.txt
| back.log
| c
| | e
| | | ace1.txt
| | | ace2.txt
| | | ace3.txt
| | f
| | | 4.txt
| | | 5.txt
| | | 6.txt
| d
| | a.java
| | abc (1).txt
| | abc (2).txt
| | abc (3).txt
| | b.java
| | c.java
4.4 刪除整個目錄
import java.io.*;
public class FileDelete{
public static void main(String[] args){
File file = new File("d:/a");
rm(file);
}
public static void rm(File f){
if(!f.exists()){
System.out.println("file not found!");
return;
} else if(f.isFile()){
f.delete();
return;
}
File[] dir = f.listFiles();
for(File file : dir) {
rm(file);
}
f.delete();
}
}
總結
以上是生活随笔為你收集整理的linux去掉java路径_Java显示目录文件列表和删除目录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java虚拟机调用jni_JNI攻略之十
- 下一篇: java理解程序逻辑_使用java理解程