java目录结构_java 目录结构树

语法及其算法检测

1.要求做一个程序扫描指定的目录及其所有的子目录和文件,要求生成一个目录树的文本文件,格式如下,假如要求扫描的是c:\

C:\

|--test1

|--test2

|   |--childt1

|   |   |--cct1

|   |   |--cct2

|   |   |    |--ccdc1

|   |   |    |--ccdc2

|   |--childt2

|--test3

|--child3

|     |--ccd3

2.程序可以采用命令行方式,或者桌面程序方式

3.请注意示例中的格式,仔细理解。

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.File;

import java.io.FileFilter;

import java.util.HashMap;

import java.util.Map;

import javax.swing.BorderFactory;

import javax.swing.JButton;

import javax.swing.JCheckBox;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.SwingUtilities;

public class PathTree extends JPanel {

private static final long serialVersionUID = 1L;

private JButton stopButton = new JButton("停止扫描");

private JButton browseButton = new JButton("选择文件夹");

private JTextArea pathsTextArea = new JTextArea();

private JCheckBox showHiddenFilesCheckbox = new JCheckBox("显示隐藏文件", false);

private Map pathIndexes = new HashMap();

private FileFilter docFilter = new DocFilter(); //文档过滤器

private FileFilter dirFilter = new DirFilter(); //文件夹过滤器

private boolean stopped = false; //是否停止扫描的标志

public PathTree() {

initGui();

}

//初始化界面

private void initGui() {

this.setLayout(new BorderLayout());

JPanel buttonsPanel = new JPanel();

buttonsPanel.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.GRAY));

buttonsPanel.add(showHiddenFilesCheckbox);

buttonsPanel.add(browseButton);

buttonsPanel.add(stopButton);

this.add(buttonsPanel, BorderLayout.NORTH);

JScrollPane scroller = new JScrollPane(pathsTextArea);

scroller.setBorder(null);

this.add(scroller, BorderLayout.CENTER);

browseButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

//选择文件夹

final JFileChooser chooser = new JFileChooser();

chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

int result = chooser.showOpenDialog(PathTree.this);

if (result == JFileChooser.APPROVE_OPTION) {

Thread t = new Thread(new Runnable() {

@Override

public void run() {

File dir = chooser.getSelectedFile();

pathsTextArea.setText("");

stopped = false;

walkTree(dir, 0);

}

});

t.start();

}

}

});

stopButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

stopped = true;

}

});

}

//递归遍历目录树

private void walkTree(File dir, int level) {

// 1. current dir path

// 2. docs path that located in this dir

// 3. sub dirs path

if (stopped) { return; }

//如果不显示隐藏文件,则返回

if (dir.isHidden() && !showHiddenFilesCheckbox.isSelected()) { return; }

final StringBuilder pathBuffer = new StringBuilder(1024);

//访问当前目录

pathBuffer.append(createPath(dir, level));

//访问文档

for (File doc : dir.listFiles(docFilter)) {

if (doc.isHidden() && !showHiddenFilesCheckbox.isSelected()) {

continue;

}

pathBuffer.append(createPath(doc, level + 1));

}

//把当前目录下的文件更新到text area中

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

pathsTextArea.append(pathBuffer.toString());

}

});

//递归遍历子目录

for (File subDir : dir.listFiles(dirFilter)) {

walkTree(subDir, level + 1);

}

}

//创建文件的路径

public String createPath(File file, int level) {

StringBuilder pathBuffer = new StringBuilder(128);

pathBuffer.append(getPathIndex(level)).append(file.getName()).append("\n");

return pathBuffer.toString();

}

//创建目录的缩进

private String getPathIndex(int level) {

//如果不存在,则创建

if (pathIndexes.get(level) == null) {

StringBuilder indexBuffer = new StringBuilder(128);

for (int i = 0; i < level; ++i) {

indexBuffer.append("|        ");

}

indexBuffer.append("|----");

pathIndexes.put(Integer.valueOf(level), indexBuffer.toString());

return indexBuffer.toString();

} else {

return pathIndexes.get(level);

}

}

//创建主窗口

private static void createGUIAndShow() {

JFrame frame = new JFrame("目录结构树");

frame.setContentPane(new PathTree());

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();

int w = 600;

int h = 700;

int x = (ss.width - w) / 2;

int y = (ss.height - h) / 2 - 40;

x = x > 0 ? x : 0;

y = y > 0 ? y : 0;

frame.setBounds(x, y, w, h);

frame.setVisible(true);

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

createGUIAndShow();

}

});

}

}

class DocFilter implements FileFilter {

@Override

public boolean accept(File file) {

return file.isFile();

}

}

class DirFilter implements FileFilter {

@Override

public boolean accept(File file) {

return file.isDirectory();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值