Java - 列出指定目录中的文件夹及文件

新建 Maven Project,项目结构:

在这里插入图片描述

修改 pom.xml 文件,引入依赖:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.mk</groupId>
    <artifactId>cmd-tree</artifactId>
    <version>1.0.0</version>
    
    <description>列出指定目录的结构</description>

    <properties>
        <commons-lang3.version>3.10</commons-lang3.version>
        <logback-classic.version>1.2.3</logback-classic.version>
        <lombok.version>1.18.12</lombok.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback-classic.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- http://maven.apache.org/plugins/index.html -->
            <!-- http://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <!-- To create an executable uber JAR, one simply needs to set the main class that serves as the application entry point -->
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.mk.Application</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

/cmd-tree/src/main/resources/logback.xml 日志配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 输出到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>
    
    <!-- 基于大小以及时间的轮转策略 -->
    <!-- 参考:http://www.logback.cn/04%E7%AC%AC%E5%9B%9B%E7%AB%A0Appenders.html -->
    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 要写入文件的名称。如果文件不存在,则新建。 -->
        <!-- <file>${USER_HOME}/logback.log</file> -->
        <file>logback.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>%d{yyyyMMdd}/logback-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>1000KB</maxFileSize>
            <!-- 最多保留多少数量的归档文件,将会异步删除旧的文件。 -->
            <maxHistory>30</maxHistory>
            <!-- 所有归档文件总的大小。当达到这个大小后,旧的归档文件将会被异步的删除。 -->
            <totalSizeCap>10MB</totalSizeCap>
        </rollingPolicy>

        <encoder>
<!--             <pattern>%d{HH:mm:ss.SSS} %-5level [%-10thread] %logger - %msg%n</pattern> -->
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>
    
    <!-- 日志输出级别 -->
    <root level="info">
        <appender-ref ref="ROLLING" />
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

/cmd-tree/src/main/java/com/mk/Application.java 主类

package com.mk;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

import org.apache.commons.lang3.StringUtils;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Application {
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String pathname = null;
        try {
            System.out.format("Please input the location (default is %s): ", 
                    System.getProperty("user.dir"));
            pathname = scanner.nextLine();
        } catch (Exception e) {
            log.error("ERROR! EXCEPTION: {}", e);
            scanner.close();
            System.exit(0);
        }
        
        if (StringUtils.isBlank(pathname)) {
            pathname = System.getProperty("user.dir");
        }
        
        File root = new File(pathname);
        
        if (!root.exists()) {
            log.info("{} does not exist.", pathname);
            System.exit(0);
        }
        
        Map<String, Integer> counters = listFiles(root, 0, null);
        
        log.info("\nTotal directories: {}", counters.get("directories"));
        log.info("Total files: {}", counters.get("files"));
    }
    
    /**
     * 
     * @param root 目录
     * @param deep 初始值 0
     * @param counters 初始值 <code>null</code>
     * @return 返回两个计数器。第一个记录文件夹总数,键值 <code>directories</code>;第二个记录文件总数,键值 <code>files</code>
     */
    private static Map<String, Integer> listFiles(File root, int deep, Map<String, Integer> counters) {
        if (counters == null) {
            counters = new HashMap<>();
            counters.put("directories", 0);
            counters.put("files", 0);
        }
        
        deep++;
        
        String indentation = "";
        for (int i = 0; i < deep; i++) {
            indentation = indentation.concat("    ");
        }
        indentation = "|".concat(indentation.substring(1));
        
        File[] files = root.listFiles();
        List<File> sortedFiles = new ArrayList<>();
        List<File> sortedDirectories = new ArrayList<>();
        for (File file : files) {
            if (file.isDirectory()) {
                sortedDirectories.add(file);
            } else {
                sortedFiles.add(file);
            }
        }

        counters.put("files", counters.get("files") + sortedFiles.size());
        indentation = indentation.replace("+", "|").replaceAll("-", " ");            
        for (File file : sortedFiles) {
            log.info("{}{}", indentation, file.getName());
        }

        counters.put("directories", counters.get("directories") + sortedDirectories.size());
        indentation = indentation.replace("|", "+").replaceAll(" ", "-");
        for (File file : sortedDirectories) {
            log.info("{}{}", indentation, file.getName());
            listFiles(file, deep, counters);
        }
        
        return counters;
    }
}

使用 Maven 打包之后,执行命令 java -jar cmd-tree-1.0.0.jar,如果不输入目录,则统计当前目录:

G:\Eclipse\eclipse-workspace-spring-boot-20191129\cmd-tree\target>java -jar cmd-tree-1.0.0.jar
Please input the location (default is G:\Eclipse\eclipse-workspace-spring-boot-20191129\cmd-tree\target):
|   cmd-tree-1.0.0.jar
|   logback.log
|   original-cmd-tree-1.0.0.jar
+---classes
|       logback.xml
+-------com
+-----------mk
|               Application.class
+-------META-INF
|           MANIFEST.MF
+-----------maven
+---------------com.mk
+-------------------cmd-tree
|                       pom.properties
|                       pom.xml
+---generated-sources
+-------annotations
+---maven-archiver
|       pom.properties
+---maven-status
+-------maven-compiler-plugin
+-----------compile
+---------------default-compile
|                   createdFiles.lst
|                   inputFiles.lst
+-----------testCompile
+---------------default-testCompile
|                   inputFiles.lst
+---test-classes

Total directories: 17
Total files: 12
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
知道目录后,可以列出目录下所属的文件 import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; //列出目录下的文件 public class ListFileDemo extends JFrame{ JTextField jtfPath; //路径输入文本域 JTextArea jtfShow; //显示目录下的内容 public ListFileDemo(){ super("列出目录下的文件"); Container container=getContentPane(); //得到容器 jtfPath=new JTextField(16); //实例化路径输入文本框 JButton jbGo=new JButton("转到"); //实例化"转到"按钮 jtfShow=new JTextArea(); //实例化显示内容文本框 jtfPath.addActionListener(new ShowDirListener()); //增加事件处理 jbGo.addActionListener(new ShowDirListener()); JPanel panel=new JPanel(); //实例化面板,用于增加路径输入和按钮 panel.add(jtfPath); panel.add(jbGo); container.add(panel,BorderLayout.NORTH); //增加组件到容器 JScrollPane jsp=new JScrollPane(jtfShow); jsp.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); //设置边界 container.add(jsp,BorderLayout.CENTER); setSize(300,200); //设置窗口尺寸 setVisible(true); //设置窗口可视 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序 } class ShowDirListener implements ActionListener { //取得目录内容的事件处理 public void actionPerformed(ActionEvent event) { showDirContent(jtfPath.getText()); //调用显示目录内容方法 } } public void showDirContent(String path){ //该方法实现取得目录内容 File file=new File(path); //用路径实例化一个文件对象 File[] files=file.listFiles(); //重点:取得目录内所有文件列表 StringBuffer message=new StringBuffer(); //实例化一个StringBuffer,用于处理显示的字符串 message.append(path); //增加信息 message.append(" 内容如下:\n"); for (int i=0;i<files.length;i++){ if (files[i].isDirectory()){ //如果这是一个目录 message.append("<dir>\t"); //增加目录标识 } else{ message.append("\t"); } message.append(files[i].getName()); //增加文件目录名 message.append("\n"); } jtfShow.setText(new String(message)); //显示消息 } public static void main(String[] args){ new ListFileDemo(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值