项目上线需要生成个目录树文件,本来可以用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 + "个";
}
}
效果还不错: