分享
 
 
 

为你的Java代码批量设置头注释

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

大多正式一点的Java源代码,在头部都设有头注释信息,其中包含一些版权声明等信息。例如JDK的源码一般如下:

/*

* @(#)Object.java 1.61 03/01/23

*

* Copyright 2003 Sun Microsystems, Inc. All rights reserved.

* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.

*/

package java.lang;

public class Object { .....}

如果我们有个小工具能把我们项目里所有目录下的Java代码统一设置头注释就好了;比如当版本信息等改变时,只要重新运行一下即可一次性更新。下面我们就来亲自写一个。

思路很简单:

建立一个窗口,用户可以设置一个目录、编写头注释信息;

查找目录下所有子文件,如果是Java文件则处理之,如果是目录则递归处理;

处理Java文件时,打开后,找到package语句或者第一个import语句,作为注释的插入点,插入注释;

将增加了头注释的文件内容写回文件。

本例中判断头注释插入点的逻辑比较简单,只是根据package语句或者第一个import语句来判断注释插入点,尚不严谨(比如原有的头注释中可能包含这些关键字),仅供参考。

源码如下:

import java.io.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class HeaderCommentsGenerator {

private static int count = 0;

public static void main(String[] args) {

final JFrame frame = new JFrame("HeaderCommentsGenerator 1.0 [xiaozhonghua@hotmail.com]");

JPanel contentPane = (JPanel) frame.getContentPane();

JPanel centerPane = new JPanel(new BorderLayout(10, 10));

centerPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));

JPanel pathPane = new JPanel(new BorderLayout());

final JTextField txtPath = new JTextField();

txtPath.setText("Please select your file or path.");

pathPane.add(txtPath, BorderLayout.CENTER);

JButton btnSelectPath = new JButton("Browser...");

btnSelectPath.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

JFileChooser chooser = new JFileChooser();

chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

int returnVal = chooser.showOpenDialog(frame);

if (returnVal == JFileChooser.APPROVE_OPTION) {

txtPath.setText(chooser.getSelectedFile().getAbsolutePath());

}

}

});

btnSelectPath.setMnemonic('B');

pathPane.add(btnSelectPath, BorderLayout.EAST);

centerPane.add(pathPane, BorderLayout.NORTH);

final JTextArea txtComments = new JTextArea();

txtComments.setText("/*\n" +

" * Copyright 2003-2004 ABC Software, Inc. All rights reserved.\n" +

" */");

centerPane.add(new JScrollPane(txtComments), BorderLayout.CENTER);

contentPane.add(centerPane, BorderLayout.CENTER);

JPanel buttonPane = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 10));

JButton btnOK = new JButton("Generate!");

btnOK.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

String path = txtPath.getText();

File file = new File(path);

if (!file.exists()) {

JOptionPane.showMessageDialog(frame,

"Path '" + path + "' not exist.",

"Error",

JOptionPane.ERROR_MESSAGE);

} else {

commentFile(file, txtComments.getText());

JOptionPane.showMessageDialog(frame,

"Finish, total " + count + " files are processed.",

"Information",

JOptionPane.INFORMATION_MESSAGE);

}

}

});

btnOK.setMnemonic('G');

JButton btnClose = new JButton("Close");

btnClose.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

System.exit(0);

}

});

btnClose.setMnemonic('C');

buttonPane.add(btnOK);

buttonPane.add(btnClose);

contentPane.add(buttonPane, BorderLayout.SOUTH);

frame.setSize(500, 300);

frame.show();

}

private static void commentFile(File file, String comments) {

if (file != null && file.exists()) {

if (file.isDirectory()) {

String[] children = file.list();

for (int i = 0; i < children.length; i++) {

File child = new File(file.getPath() + System.getProperty("file.separator") + children[i]);

commentFile(child, comments);

}

} else {

if (file.getName().toLowerCase().endsWith(".java")) {

System.out.println(file.getName());

count++;

try {

RandomAccessFile raFile = new RandomAccessFile(file, "rw");

byte[] content = new byte[ (int) raFile.length()];

raFile.readFully(content);

String all = new String(content);

all = all.trim();

while (all.startsWith("\n")) {

all = all.substring(1);

}

if (all.indexOf("package") != -1) {

all = all.substring(all.indexOf("package"));

}

if (all.indexOf("import") != -1) {

all = all.substring(all.indexOf("package"));

}

all = comments + "\n" + all;

raFile.close();

FileWriter writer = new FileWriter(file);

writer.write(all);

writer.close();

}

catch (Exception ex) {

ex.printStackTrace();

}

}

}

}

}

}

希望这个小工具对你有点用处。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有