文件夹遍历



import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
 
/**
 * 图形化文件遍历
 * 
 * @author wangr
 * @version 1.0
 */
public class Window {
    private JFrame frame;
    private JPanel panel;
    private JLabel label;
    private JFileChooser filedialog;
    private JButton button;
    private JScrollPane spanel;
    private JTextArea textarea;
    private static int level = 0;// 层级数
 
    public Window() {
 
        init();
        addListener();
 
    }
 
    // 初始化界面
    private void init() {
        frame = new JFrame("遍历文件显示文件夹的结构");
        label = new JLabel("选择文件目录");
        button = new JButton("选择文件夹");
        panel = new JPanel();
        textarea = new JTextArea();
        textarea.setEditable(false);
        spanel = new JScrollPane(textarea);
        spanel.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        panel.add(label);
        panel.add(button);
        frame.add(panel, BorderLayout.NORTH);
        frame.add(spanel, BorderLayout.CENTER);
        frame.setSize(600, 500);
        Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension screenSize = kit.getScreenSize();
        int screenWidth = screenSize.width;
        int screenHeight = screenSize.height;
        int windowWidth = frame.getWidth();
        int windowHeight = frame.getHeight();
        frame.setLocation((screenWidth - windowWidth) / 2,
                (screenHeight - windowHeight) / 2);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
 
    // 添加监听器
    private void addListener() {
 
        button.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent e) {
                filedialog = new JFileChooser();
                filedialog.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                filedialog.showOpenDialog(frame);
                File selectFile = filedialog.getSelectedFile();
                String filepath = "";
                if (selectFile != null) {
                    filepath = selectFile.getAbsolutePath();
                    textarea.setText("");
                }
                // System.out.println(filepath);//测试使用
                if (filepath != null && !filepath.equals("")) {
                    IteratorDir(new File(filepath));
 
                } else {
                    textarea.setText("选择目录无效");
                }
 
            }
        });
 
    }
 
    public void IteratorDir(File file) {
        if (file != null && file.exists()) {
            // 找出递归的出口
            // 假设是文件或者是空文件夹就返回.
            if (file.isFile() || file.listFiles().length == 0) {
                // textarea.setText("选择目录无效");
                return;
            } else {
                File[] files = file.listFiles();
                // 要求是先输出文件夹再输出文件
                files = sort(files);
                for (File f : files) {
 
                    StringBuilder sb = new StringBuilder();
                    if (f.isFile()) {
                        sb.append(getTab(level));
                        sb.append(f.getName() + "\n");
                    } else {
                        sb.append(getTab(level));
                        sb.append(f.getName());
                        sb.append("\\");
                    }
                    if (!textarea.isEditable()) {
                        textarea.setEditable(true);
                        textarea.replaceSelection(sb.toString());
                        textarea.setEditable(false);
                    }
                    // 假如是文件夹
                    if (f.isDirectory()) {
                        level++;// 进入目录遍历,层级加1
                        IteratorDir(f);// 递归调用遍历目录的方法
                        level--;// 目录层级减一,返回上一级目录继续打印输出
                    }
                }
 
            }
        }
    }
 
    /**
     * 对File类型的数组进行先目录后文件的排列
     * 
     * @param files
     * @return
     */
    private File[] sort(File[] files) {
        List<File> fList = new ArrayList<File>();
        // 先存放文件夹(目录)
        for (File f : files) {
            if (f.isDirectory()) {
                fList.add(f);
            }
        }
        // 再存放文件
        for (File f : files) {
            if (f.isFile()) {
                fList.add(f);
            }
        }
        // 把集合中的元素转换成指定大小和指定类型的数组
        return fList.toArray(new File[fList.size()]);
    }
 
    // 就是根据层级数来得到\t所组成的字符串
    private String getTab(int level) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < level; i++) {
            sb.append("   ");
        }
        return sb.toString();
    }
 
    public static void main(String[] args) {
        new Window();
    }
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值