Java 关于文件读取速度问题,求助,谢谢啦

发布网友 发布时间:1天前

我来回答

2个回答

热心网友 时间:23小时前

/**
 * ip条目实体类
 */
public class IpEntry {
    String country, province, city, region, local;
    long start = 0, end = 0;

    public String getCountry() {
        return country;
    }

    public String getProvince() {
        return province;
    }

    public String getCity() {
        return city;
    }

    public String getRegion() {
        return region;
    }

    public String getLocal() {
        return local;
    }
    
    /**
     * 接受字符串初始化属性
     * @param text
     */
    public IpEntry(String text) {
        String fields[] = text.split(",");
        
        start = Long.parseLong(fields[1]);
        end = Long.parseLong(fields[3]);
        
        country = fields[5];
        province = fields[6];
        city = fields[7];
        region = fields[8];
        local = fields[9];
    }
}

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * ip地址表类
 */
public class IpTable {
    List<IpEntry> table;
    
    //读取文件写入, 逐行构造IpEntry, 写入list
    public IpTable(String fileName) {
        BufferedReader rd = null; 
        String line;
        
        table = new LinkedList<IpEntry>();
        
        try {
            rd = new BufferedReader(new FileReader(fileName));
            
            while (true) {
                line = rd.readLine();
                if (null == line)
                    break;
                
                table.add(new IpEntry(line));
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                //IO资源必须在finally中关闭
                rd.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    //匹配第一条
    public IpEntry matchFirst(long ip) {
        for (IpEntry entry : table) {
            if (entry.start <= ip && entry.end >= ip)
                return entry;
        }
        return null;
    }
    
    //匹配所有
    public IpEntry[] matchAll(long ip) {
        List<IpEntry> list = new ArrayList<IpEntry>();
        for (IpEntry entry : table) {
            if (entry.start <= ip && entry.end >= ip)
                list.add(entry);
        }
        
        return list.toArray(new IpEntry[list.size()]);
    }
    
    //静态方法
    static final String IP_TABLE_FILE_NAME = "E://12.txt";
    static IpTable instance = null;
    
    public static IpEntry match(long ip) {
        //仅在第一次调用时,初始化静态实例读取文件
        if (instance == null)
            instance = new IpTable(IP_TABLE_FILE_NAME);
        
        return instance.matchFirst(ip);
    }
    
    //你要的方法
    public static String getIpCountry(String ip) {
        return match(ipToLong(ip)).getCountry();    //你自己的ipToLong方法
    }
    
    //模拟测试
    public static void main(String[] args) {
        String ip[] = {
                "192.168.1.1",
                //...
                "220.10.10.135"
        };
        
        for (int i = 0; i < ip.length; i++) {
            System.out.println(IpTable.getIpCountry(ip[i]));
        }
    }
    
}

可能你一下转不过来,根据你代码里给的结构给你写了个完整的示例。

主要就是把文件内容读取后格式化放在内存对象中,让后只要在对象中查找匹配,就不用再去读取文件了。关于性能优化的话,因为每次都是顺序迭代查找,所以用了LinkedList,其他的话暂时也想不出什么可以优化的地方了

热心网友 时间:23小时前

/**

  * 可以将File中的字符串存放到List中,这样可以增加效率。

  * @param file File路径

  * @return list 返回一个List

  * @throws IOException

  */

 private List<String> file2String(File file) throws IOException{

  List<String> list = new ArrayList<String>();

  BufferedReader reader = new BufferedReader(new FileReader(file));

  String temp  = null;

  while((temp = reader.readLine())!=null ){

   list.add(temp);

  }

  reader.close();

  return list;

 }

这样的话每次执行getIPCity就可以直接从List中读取字符串了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com