歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

用Java分析C源代碼中頭文件使用頻率

想法:
 
分析Linux C運行庫各個頭文件的使用頻率,可以大致判斷哪些C庫頭文件是常用的、基礎的或重要的,給Linux系統編程學習者提供一個方向。其實最精細的統計分析應該是針對Linux系統調用和C標准庫函數,這樣對LinuxC初學者更有指導意義,不過現在還不知道怎麼實現。最終選擇BusyBox作為研究對象,它主要依賴Linux C運行庫實現各種Linux命令和工具。
 
BusyBox是一個集成了一百多個最常用linux命令和工具的軟件。BusyBox包含了一些簡單的工具,例如ls、cat和echo等等,還包含了一些更大、更復雜的工具,例grep、find、mount以及telnet。有些人將BusyBox 稱為 Linux 工具裡的瑞士軍刀。簡單的說BusyBox就好像是個大工具箱,它集成壓縮了 Linux 的許多工具和命令,也包含了Android 系統的自帶的shell。
 
搜索Busybox源代碼文件,提取出含有include語句的代碼行
 
find -name '*.c' -o-name '*.h' | xargs grep include > busybox-stats.txt
 
./console-tools/setlogcons.c:#include"libbb.h"
 
./console-tools/clear.c:#include"libbb.h"
 
./console-tools/openvt.c:#include<linux/vt.h>
 
./console-tools/openvt.c:#include"libbb.h"
 
./console-tools/setkeycodes.c:#include"libbb.h"
 
./console-tools/fgconsole.c:#include"libbb.h"
 
./console-tools/resize.c:#include"libbb.h"
 
./console-tools/showkey.c:#include"libbb.h"
 
./console-tools/showkey.c:#include<linux/kd.h>
 
./console-tools/loadfont.c:#include"libbb.h"
 
./console-tools/loadfont.c:#include<sys/kd.h>
 
./console-tools/setconsole.c:#include"libbb.h"
 
...
 
 
 
在NotePad++下對文本進行過濾,排序,最終得到如下數據
 
 
 
arpa/inet.h
 
arpa/inet.h
 
arpa/inet.h
 
arpa/inet.h
 
arpa/inet.h
 
arpa/inet.h
 
arpa/inet.h
 
arpa/telnet.h
 
arpa/telnet.h
 
asm/types.h
 
asm/types.h
 
asm/types.h
 
asm/unistd.h
 
...
 
 
 
 
 
這些頭文件就是Linux C運行庫的頭文件。
 
 
 
現在我們要做的就是用Java編寫一個程序,統計每個頭文件在文本文件中出現的次數並排序。
 
比如"arpa/inet.h"這個頭文件出現的次數為7.
 
 
 
工程目錄結構:
 
 E:\workspace\JavaApp\WordStats 的目錄
 
 
 
2014-04-22  15:03  <DIR>          .
 
2014-04-22  15:03  <DIR>          ..
 
2014-04-18  12:16            10,797 busybox-stats.txt
 
2014-04-22  14:58            2,229 WordStats.java
 
 
 
WordStats.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;
import java.text.DecimalFormat;

public class WordStats {
    public static void main(String[] args) throws IOException {
        //System.out.println("Hello World!");
        //System.out.println(args.length);
        // 解析參數
        int argc = args.length;
        String inputFilename;
        String outputFilename;
        if (argc == 2) {
            inputFilename = args[0];
            outputFilename = args[1];
            //System.out.println(args[0]);
            //System.out.println(args[1]);
        } else {
            System.out.println("usage: java WordStats <inputfile> <outputfile>");
            return;
        }
       
        // 打開輸入和輸出文件
        BufferedReader in = new BufferedReader(new FileReader(inputFilename));
        File fout = new File(outputFilename);
        PrintWriter out = new PrintWriter(new FileWriter(fout));
       
        // 使用HashMap來保存統計數據
        Map<String, Integer> stats = new HashMap<String, Integer>();
        String str;
        Integer count;
        // 解析輸入文本並統計
        while ((str = in.readLine()) != null) {
            //System.out.println(str);
            if (stats.containsKey(str)) {
                count = (Integer)stats.get(str);
                count++;
                stats.put(str, count);
            } else {
                count = 1;
                stats.put(str, count);
            }
        }
       
        // 使用ArrayList來對Value進行排序
        ArrayList<Entry<String,Integer>> l = new ArrayList<Entry<String,Integer>>(stats.entrySet());
        Collections.sort(l, new Comparator<Map.Entry<String, Integer>>() {
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return (o2.getValue() - o1.getValue());
            }
        });
       
        // 將統計結果保存到輸出文件
        for (Entry<String, Integer> e : l) {
            //System.out.println(new DecimalFormat("000").format(e.getValue()) + " " + e.getKey());
            out.println(new DecimalFormat("000").format(e.getValue()) + " " + e.getKey());
        }
       
        // 關閉輸入和輸出文件
        in.close();
        out.close();
    }
}

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-04/100688p2.htm

Copyright © Linux教程網 All Rights Reserved