`
myCsdn_taoge
  • 浏览: 38713 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论

打印java文件中的所有注释

阅读更多
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.xpup.bear.code.EnumDescription;
import org.xpup.bear.code.gb.RadiationSickness;

/**
 * :打印java文件中的所有注释
 */
public class PrintComments {
	
	 public static final String filepath="E:/workspace/bear-code/src/org/xpup/bear/code/ws/";
	 
	 public static void main(String[] args) throws FileNotFoundException {
		   List<String> list=new ArrayList<String>();
		   
		   File file = new File(filepath);
	       String [] fileName = file.list();
	       int i=0;
	       for (String name : fileName) {
	    	   list.add(readFile(filepath, name));
	    	   i++;
	       }
		 
//	       list.add(readFile(filepath, "BornDefectType.java"));
	       write2TxtFile(list);
	       System.out.println("已经写入文件的JAVA类个数:"+i);
	 }
	 
	 
	 /*
	  * 获取JAVA类文件中的类注释
	  * @ filePath 文件路径
	  * @ fileName 文件名称
	  * @ return   注释内容
	  */
	 public static String readFile(String filePath,String fileName) {
		 String rtn="";
		 try {
	            FileReader freader = new FileReader(filePath+fileName);
	            BufferedReader breader = new BufferedReader(freader);
	            StringBuilder sb = new StringBuilder();
	            try {
	                String temp = "";
	                /**
	                 * 读取文件内容,并将读取的每一行后都不加\n
	                 * 其目的是为了在解析双反斜杠(//)注释时做注释中止符
	                 */
	                while((temp=breader.readLine())!= null)
	                {
	                    sb.append(temp);
	                    sb.append('\n');
	                }
	                String src = sb.toString();
	                /**
	                 * 1、做/* 注释的正则匹配
	                 *

	                 * 通过渐进法做注释的正则匹配,因为/*注释总是成对出现
	                 * 当匹配到一个/*时总会在接下来的内容中会首先匹配到"*\\/",
	                 * 因此在获取对应的"*\\/"注释时只需要从当前匹配的/*开始即可,
	                 * 下一次匹配时只需要从上一次匹配的结尾开始即可
	                 * (这样对于大文本可以节省匹配效率)——
	                 * 这就是渐进匹配法
	                 *

	                 * */
	                Pattern leftpattern = Pattern.compile("/\\*");
	                Matcher leftmatcher = leftpattern.matcher(src);
	                Pattern rightpattern = Pattern.compile("\\*/");
	                Matcher rightmatcher = rightpattern.matcher(src);
	                sb = new StringBuilder();
	                /**
	                 * begin 变量用来做渐进匹配的游标 {@value}
	                 * 初始值为文件开头
	                 * **/
	                int begin = 0;
	                while(leftmatcher.find(begin))
	                {
	                    rightmatcher.find(leftmatcher.start());
	                    sb.append(src.substring(leftmatcher.start(), rightmatcher.end()));
	                    /** 为输出时格式的美观 **/
	                    sb.append('\n');
	                    begin = rightmatcher.end();
	                }
//	                System.out.println(sb.toString());
	               rtn= getDescrpition(sb.toString(),fileName);
//	               list.add(strList);
	       		   return rtn;
	       		   
//	                /**
//	                 * 2、对//注释进行匹配(渐进匹配法)
//	                 * 匹配方法是 // 总是与 \n 成对出现
//	                 * */
//	                begin = 0;
//	                Pattern leftpattern1 = Pattern.compile("//");
//	                Matcher leftmatcher1 = leftpattern1.matcher(src);
//	                Pattern rightpattern1 = Pattern.compile("\n");
//	                Matcher rightmatcher1 = rightpattern1.matcher(src);
//	                sb = new StringBuilder();
//	                while(leftmatcher1.find(begin))
//	                {
//	                    rightmatcher1.find(leftmatcher1.start());
//	                    sb.append(src.substring(leftmatcher1.start(), rightmatcher1.end()));
//	                    begin = rightmatcher1.end();
//	                }
//	                System.out.println(sb.toString());
	            } catch (IOException e) {
	                System.out.println("文件读取失败");
	            }finally
	            {
	                breader.close();
	                freader.close();
	            }
	        } catch (FileNotFoundException e) {
	            System.out.println("文件不存在");
	        }catch(IOException e)
	        {
	            System.out.println("文件读取失败");
	        }
		return rtn;
	}
	 
	 
	 /**
	  * 获取相关信息
	  * @param strTxt
	  */
	 public static String getDescrpition(String strTxt,String fileName) {
		
//		List<String> list=new ArrayList<String>();
		String rtn="";
		String preStr=strTxt.substring(strTxt.indexOf("<pre>")+5, strTxt.indexOf("</pre>")-2);
//		System.out.println(preStr);
		
		String temp=preStr.substring(preStr.indexOf("标准依据:")+5, preStr.indexOf("* 发布单位:"));
//		System.out.println("temp:"+temp);
		
		//名称
		String name=temp.substring(temp.lastIndexOf(".")+4, temp.length());
//		System.out.println("名称:"+name);
		
		//标准依据
		String code=temp.substring(temp.indexOf("WS"), temp.lastIndexOf(".")+4);
//		System.out.println("标准依据:"+code);
		
		//发布单位
		String maker=preStr.substring(preStr.indexOf("发布单位:")+5, preStr.indexOf("* 发布时间:"));
//		System.out.println("发布单位:"+maker);
		
		//发布时间
		String releaseTime=preStr.substring(preStr.indexOf("发布时间:")+5, preStr.length());
//		System.out.println("发布时间:"+releaseTime);
		
		String className=fileName.substring(0, fileName.indexOf(".java"));
		
		String effectiveTime="2012-02-01";
		
		
		rtn= "list.add(new EnumDescription('"+name.trim()+"', '"+code.trim()+"', '"+maker.trim()+"', '"+releaseTime.trim()+"', '"+effectiveTime.trim()+"', "+"\r\n"+"		"+className.trim()+".class.getName()));";
		System.out.println(rtn);
		return rtn;
		
		
//		list.add(new EnumDescription("放射性疾病名单代码", "GB/T 18201-2000", "中国国家质量技术监督局", "2000-09-30", "2001-03-01",
//		     RadiationSickness.class.getName()));
		
	}
	 
	 /**

     * 将拼接好的字符串写进文本

     * @param List<String> 要写入文件的字符串集合
     * 
     */   
	 public static void write2TxtFile(List<String> strList) throws FileNotFoundException {
//			String lan+="\r\n"; 
	    	File file=new File("E:\\result.txt");
	    	if (file.exists()) {
				file.delete();
			}
	    	PrintWriter writer=null;
	    	if(!file.exists()){
	    		try {
					file.createNewFile();
					 writer=new PrintWriter(file);
					 for (String str : strList) {
						 writer.write(str+"\r\n");
					   }
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally{
					writer.flush();
					writer.close();
				}
	    	}
	   } 
	 
	 
}

 

分享到:
评论

相关推荐

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA_API1.6文档(中文)

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包2

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包4

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包3

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java 1.6 API 中文 New

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类。...

    JavaPDF操作类库API_Free Spire.PDF for Java_5.1.0

    1.功能:该API为适用于Java平台下,通过后端程序代码调用API...lib文件夹下包含了用于在java程序中的Spire.Pdf.jar文件,在项目程序中调用接口方法时,需要导入该jar文件;doc文件下包含了所有类及方法的说明解释等。

    JavaAPI1.6中文chm文档 part1

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类...

    Java统计代码文本文件的字符行数.rar

    Java统计代码文本文件的字符行数,程序名称:java代码行数统计软件.  * 功能:统计代码的行数  * 说明:支持 整个工程的代码行数统计  共有 21 个类  忽略注释忽略空行共 1224 行  包括注释忽略空行共 1370 行  ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程...

    代码行统计工具(可用于对VC++、C++ Builder、Delphi、VB、C/C++、ASM、Java、C#、SQL 等程序源码进行详细的统计,可以准确的分析出程序中代码行、注释行和空白行的行数。)

    10、支持Java文件 .java 的统计。 11、支持SQL文件 .sql 的统计。 12、支持 *.* 文件类型的自动分析统计。 13、支持自定义一次选择多个目录的统计方式。 14、支持用户自定义文件统计类型及统计方法。 15、支持htm,...

    java智能源码统计专家

    可用于对VC++、C++ Builder、Delphi、VB、C/C++、ASM、Java、C#、SQL 等程序源码进行详细的统计,可以准确的分析出程序中代码行、注释行和空白行的行数。程序会自动根据你选择的文件类型选择相应的统计方式,并将...

    JavaAPI中文chm文档 part2

    javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类...

    JAVA--达内培训笔记

    在文档注释中可以用 @author 表示程序的作者,@version 表示程序的版本,前两个注释符号要写在类定义之前,用于方法的注释@param 对参数进行注释,@return 对返回值进行注释 @throws对抛出异常的注释。 10、...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程...

    Java实现局域网内两点文件传输

    Java实现局域网内两点文件传输,接收端收到doc,docx,pdf类型的文件后自动调用虚拟打印机接口,实现打印pdf文件的功能。其中包括实现的原理,以及操作实现的源代码、实现的步骤、每一实现步骤对应的讲解,包括代码...

Global site tag (gtag.js) - Google Analytics