`
yianpuodiaotu
  • 浏览: 237846 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

目录树的生成

 
阅读更多

项目上线需要生成个目录树文件,本来可以用dos的tree就搞定的,领导非得要统计每个文件下的子文件数目。没办法,只好找了点资料随便写了个JFrame。

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.util.Stack;

import javax.swing.BorderFactory;
import javax.swing.JButton;
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 browseButton = new JButton("选择文件夹");
	private JTextArea pathsTextArea = new JTextArea();

	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(browseButton);
		this.add(buttonsPanel, BorderLayout.NORTH);
		JScrollPane scroller = new JScrollPane(pathsTextArea);
		scroller.setBorder(null);
		this.add(scroller, BorderLayout.CENTER);
		browseButton.addActionListener(new ActionListener() {
			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() {
						public void run() {
							File dir = chooser.getSelectedFile();
							pathsTextArea.setText("");
							WorkTree workTree = new WorkTree(dir);
							workTree.tree();
							pathsTextArea.setText(workTree.getResult());
						}
					});
					t.start();
				}
			}
		});
	}

	// 创建主窗口
	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() {
			public void run() {
				createGUIAndShow();
			}
		});
	}

}

class WorkTree {
	private File root;
	private StringBuffer resultBuffer = new StringBuffer();

	public WorkTree(File root) {
		this.root = root;
	}

	public String getResult() {
		return resultBuffer.toString();
	}

	public WorkTree(String rootName) {
		this(new File(rootName));
	}

	public void tree() {
		Stack<Boolean> lastStack = new Stack<Boolean>();
		tree(root, 0, lastStack);
	}

	private void tree(File dir, int level, Stack<Boolean> lastStack) {
		if (dir == null || !dir.exists()) {
			return;
		}
		// 输出
		printFile(dir, level, lastStack);

		if (dir.isFile()) {
			return;
		}
		File[] children = dir.listFiles();
		for (int i = 0; i < children.length; i++) {
			lastStack.push(i == children.length - 1);
			tree(children[i], level + 1, lastStack);
			lastStack.pop();
		}
	}

	/**
	 * 打印树形文件目录
	 * 
	 * @param file
	 *            文件
	 * @param level
	 *            文件所处的层级
	 * @param lastStack
	 *            该文件是否是最后一个文件
	 */
	private void printFile(File file, int level, Stack<Boolean> lastStack) {
		for (int i = 0, k = lastStack.size() - 1; i < k; i++) {
			resultBuffer.append(lastStack.get(i) ? "\t" : "│\t");
		}
		if (level > 0) {
			resultBuffer.append(
					lastStack.get(lastStack.size() - 1) ? "└─" : "├─");
		}

		String fileName = file.isDirectory() == true ? (file.getName() + dirMarks(file))
				: file.getName();

		resultBuffer.append(level == 0 ? file.getPath() : fileName)
				.append("\n");
	}

	private static String dirMarks(File file) {
		int files = 0;
		int dirs = 0;
		File[] curFileList = file.listFiles();
		for (int i = 0; i < curFileList.length; i++) {
			File temp = curFileList[i];
			if (temp.isFile()) {
				files++;
			} else {
				dirs++;
			}
		}
		return " " + "子目录" + dirs + "个,文件" + files + "个";
	}
}

 

效果还不错:



 

  • 大小: 17.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics