> Java > java지도 시간 > 본문

Java에서 디렉토리 파일 목록 표시 및 디렉토리 삭제 기능을 구현하는 방법

王林
풀어 주다: 2023-05-10 15:13:06
앞으로
1177명이 탐색했습니다.

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 컬렉션을 사용합니다. 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> file_queue = new Queue<File>(); //构建一个队列
 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<E> {
 private LinkedList<E> linkedlist;
 Queue() {
 linkedlist = new LinkedList<E>();
 }
 public void add(E e) {
 linkedlist.addFirst(e); //先进
 }
 public E get() {
 return linkedlist.removeLast(); //先出
 }
 public boolean isNull() {
 return linkedlist.isEmpty();
 }
}
로그인 후 복사

4.3 예 3: 트리 구조는 전체 디렉터리의 파일을 (재귀적으로) 표시합니다.

Ideas:

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<level;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();
 }
}
로그인 후 복사

위 내용은 Java에서 디렉토리 파일 목록 표시 및 디렉토리 삭제 기능을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿