?? filehandler.java
字號:
//package ipstatistic;
import java.io.*;
import java.util.*;
/**
* 功能:從文件中提取IP地址,并統(tǒng)計(jì)其出現(xiàn)的數(shù),暫存在Hash表中
* @author liangwen 2006/8/1
*/
public class FileHandler extends Thread{
//當(dāng)前正在操作的文件索引
private int fileIndex=0;
//文件的總數(shù)
private int fileNum;
//記錄當(dāng)前正處理的行號
private int lineNum=0;
//獲取選擇的路徑文件
private File[] choosedFile;
//創(chuàng)建鏈路和節(jié)點(diǎn)的Hash table
private static Hashtable ipHashTable;
public FileHandler(File[] choosedFile){
//獲取用戶選擇的輸入文件
this.choosedFile=choosedFile;
//Hash表初始容量為97649,裝載因子為0.75
ipHashTable=new Hashtable(97649,(float)0.75);
}
/*啟動線程,依次讀取每一個(gè)文件
*/
public void run(){
fileIndex = 0;
fileNum=this.choosedFile.length;
while (fileIndex < fileNum)
{
try {
lineNum=0;
StartLoading(); //裝載文件
}catch (Exception e1)
{
int temp=fileIndex+1;
System.out.println("FileHandler.run(),at fileNum="
+temp+",line="+lineNum+e1.toString());
ReleaseHash();
stop();
}
fileIndex++;
IPStatisticFrame.inforOutJTA.append("第"+fileIndex
+"個(gè)文件掃描結(jié)束!\n");
}
}
/*依次處理文件中的每一行數(shù)據(jù)
*/
private void StartLoading() throws Exception
{
String bufferStr;
BufferedReader br = getBufferedReader();
if (br == null)
{
System.out.println("IOHandler.StartLoading():"+
"InputStream is null");
ReleaseHash();
stop();
}
//每次讀取一行數(shù)據(jù)先存入bufferStr中
while((bufferStr = br.readLine()) != null){
lineNum++;
//IP地址最短為7個(gè)字符,如果總長度小于7,說明該行沒有IP地址
if (bufferStr.length() < 7)
continue;
ParseString(new StringTokenizer(bufferStr));
}
}
/*依次處理一行數(shù)據(jù)中的每一IP地址
*/
private void ParseString(StringTokenizer tokenizer) throws Exception
{
String ipStr;
String hashKey,hashValue;
//依次處理每一節(jié)點(diǎn)
while(tokenizer.hasMoreTokens()) {
ipStr=tokenizer.nextToken().toString();
//判斷是否為合法的IP地址
if(!IsIP(ipStr))
continue;
//將節(jié)點(diǎn)存入Hash表
//value格式:節(jié)點(diǎn)的IP地址
//key格式:該IP地址出現(xiàn)的次數(shù)
hashKey=ipStr;
hashValue=this.GetHashValue(this.ipHashTable,hashKey);
this.ipHashTable.put(hashKey, hashValue);
}
}
/*判斷給定字符串是否為IPv4地址
*/
private boolean IsIP(String IPStr){
int length=IPStr.length();
//當(dāng)前掃描的字符位置
int index=0;
//記錄每個(gè)8位組中字符個(gè)數(shù),IPv4地址中其最大取值為3
int inOctetNum=0;
//記錄IPv4地址中8位組的個(gè)數(shù),最大取值為4
int Octets=1;
//判斷給定字符串是否為IPv4地址
boolean IsIP = false;
char temp;
try {
while (index < length) {
temp = IPStr.charAt(index);
if (! ( (temp >= '0' && temp <= '9') || temp == '.')) {
IsIP = false;
break;
}
if (temp == '.') {
inOctetNum = 0;
Octets++;
}
else {
inOctetNum++;
if (inOctetNum > 3) {
IsIP = false;
break;
}
}
index++;
}
}catch (Exception ex) {
System.out.println("FileHandler.IsIP():"+ex.toString());
}
if( index == length && Octets==4 && inOctetNum <=3)
IsIP=true;
return IsIP;
}
/*獲取對應(yīng)HashKey的HashValue,
*/
private String GetHashValue(Hashtable inforHashTable, String hashKey){
String hashValue;
int num;
try {
if(inforHashTable.containsKey(hashKey)){
//獲取原始值
hashValue=inforHashTable.get(hashKey).toString();
num=Integer.parseInt(hashValue);
//原值加一
hashValue=Integer.toString(num+1);
//刪除舊值
inforHashTable.remove(hashKey);
}
else
//設(shè)置初值
hashValue="1";
return hashValue;
}
catch (Exception ex) {
System.out.println("FileHandler.GetHashValue():"+ex.toString());
return null;
}
}
/*獲取用于讀取文件的流
*/
private BufferedReader getBufferedReader()
{
BufferedReader br = null;
try {
File file;
file = choosedFile[fileIndex];
if (!file.canRead())
System.out.println("FileHandler.getBufferedReader()"+
"can't read file");
br = new BufferedReader(
new InputStreamReader(
new FileInputStream(file)));
}
catch (FileNotFoundException e1) {
System.out.println("FileHandler.getBufferedReader():"
+e1.toString());
ReleaseHash();
stop();
}
return br;
}
/*獲取路徑IP地址表
*/
static Hashtable GetIPTable(){
return ipHashTable;
}
/*釋放資源
*/
void ReleaseHash(){
if(!this.ipHashTable.isEmpty())
this.ipHashTable.clear();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -