[ JavaIO ]统计文件夹下的代码行数

在Java.io包中,File类是唯一一个与文件本身操作(创建,删除,取得信息。。)有关的类。、

下面是实现代码行数统计的思路:

  1. 使用File file = new File("C:\\path");来获取一个文件对象。
  2. 使用File[ ] files = file.listFiles();列出文件下所有的文件。
  3. 使用LineNumberReader lnr。
  4. lnr.skip(Long.MAX_VALUE);来跳到最后一行
  5. 使用lnr.getLineNumber()来获取文件的行号。
  6. 递归以上步骤
  7. 使用Swing界面显示结果

代码实现:

CodeLine类(用于计算结果):

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class CodeLine {
	public static int COUNT = 0;
	public static StringBuilder sBuilder = new StringBuilder();
	public static void countCodeLine(File file, String...args) throws IOException {
		if(file.isDirectory()) {
			File[] files = file.listFiles();
			for(File file2 : files) {
				countCodeLine(file2, args);
			}
		} else {
			for(String str : args) {
				if("".equals(str) || null == str)
					break;
				if(file.getName().endsWith(str)) {
					LineNumberReader  lnr = new LineNumberReader(new FileReader(file));
					lnr.skip(Long.MAX_VALUE);
					int lineNum = lnr.getLineNumber() + 1;
					sBuilder.append(file.getName() + "    行数:" + lineNum + "\n");
					COUNT += lnr.getLineNumber() + 1;
					lnr.close();
				}
			}
			
		}
	}
}

MainFrame类(用于输入及显示运行结果):

import java.awt.Color;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

import com.ltp.codecount.CodeLine;

public class MainFrame extends JFrame {
	public MainFrame() {
		this.setBounds(200, 200, 500, 400);
		this.setLayout(null);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		addLabel(50, 50, 100, 25, "请输入文件路径", null);
		JTextField textField = addTextField(160, 50, 200, 25);
		JButton jButton = addBtn(370, 50, 80, 25, "统计", Color.decode("#1E92F2"));
		JCheckBox javaCheckBox = addCheckBox(50, 80, 60, 25, ".java");
		JCheckBox cCheckBox = addCheckBox(110, 80, 60, 25, ".c");
		JCheckBox cppCheckBox = addCheckBox(170, 80, 60, 25, ".cpp");
		JCheckBox htmlCheckBox = addCheckBox(230, 80, 60, 25, ".html");
		JCheckBox jspCheckBox = addCheckBox(290, 80, 60, 25, ".jsp");
		JCheckBox cssCheckBox = addCheckBox(350, 80, 60, 25, ".css");
		JTextField endOfFile = addTextField(410, 80, 40, 25);
		JTextArea jTextArea = addTextArea(50, 120, 400, 230);
		this.setVisible(true);
		jButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				String filePath = textField.getText();
				filePath = filePath.replaceAll("\\\\", "\\\\\\\\");
				File file = new File(filePath);
				int i = 0;
				String[] args = new String[7];
				if (javaCheckBox.isSelected()) {
					args[i] = javaCheckBox.getText();
					i++;
				}
				if (cCheckBox.isSelected()) {
					args[i] = cCheckBox.getText();
					i++;
				}
				if (cppCheckBox.isSelected()) {
					args[i] = cppCheckBox.getText();
					i++;
				}
				if (htmlCheckBox.isSelected()) {
					args[i] = htmlCheckBox.getText();
					i++;
				}
				if (jspCheckBox.isSelected()) {
					args[i] = jspCheckBox.getText();
					i++;
				}
				if (cssCheckBox.isSelected()) {
					args[i] = cssCheckBox.getText();
					i++;
				}
				String customType = endOfFile.getText();
				if (!"".equals(customType) || customType != null) {
					args[i] = customType;
					i++;
				}

					try {
						CodeLine.countCodeLine(file, args);
					} catch (IOException e1) {
						e1.printStackTrace();
					}
					String text = CodeLine.sBuilder.toString();
					text += "统计完毕!\n当前文件路径下总代码行数为:" + CodeLine.COUNT + "行";
					CodeLine.COUNT = 0;
					jTextArea.setText(text);
			}
		});
	}

	// 添加TextField
	public JTextField addTextField(int x, int y, int width, int height) {
		JTextField jTextField = new JTextField();
		jTextField.setBounds(x, y, width, height);
		this.add(jTextField);
		return jTextField;
	}

	// 添加button
	public JButton addBtn(int x, int y, int width, int height, String btnName, Color color) {
		JButton jButton = new JButton(btnName);
		jButton.setBounds(x, y, width, height);
		jButton.setForeground(Color.WHITE);
		jButton.setBackground(color);
		this.add(jButton);
		return jButton;
	}

	// 添加用于显示的jLabel
	public void addLabel(int x, int y, int width, int height, String title, Color color) {
		JLabel jLabel = new JLabel();
		jLabel.setBounds(x, y, width, height);
		jLabel.setText(title);
		this.add(jLabel);
	}

	// 添加jTextArea
	public JTextArea addTextArea(int x, int y, int width, int height) {
		JTextArea txaDisplay = new JTextArea();
		txaDisplay.setBounds(x, y, width, height);
		JScrollPane scroll = new JScrollPane(txaDisplay);
		scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		scroll.setBounds(x, y, width, height);
		txaDisplay.setCaretPosition(txaDisplay.getText().length());
		txaDisplay.setEditable(false);
		this.add(scroll);
		return txaDisplay;
	}

	// 添加checkBox
	public JCheckBox addCheckBox(int x, int y, int width, int height, String text) {
		JCheckBox jCheckBox = new JCheckBox(text);
		jCheckBox.setBounds(x, y, width, height);
		this.add(jCheckBox);
		return jCheckBox;
	}

	public static void main(String[] args) {
		MainFrame mainFrame = new MainFrame();
	}
}

运行截图:







猜你喜欢

转载自blog.csdn.net/bugggget/article/details/80284707