问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:5小时前

我来回答

2个回答

热心网友 时间:3小时前

/**
 * 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,其他的话暂时也想不出什么可以优化的地方了

热心网友 时间:3小时前

/**

  * 可以将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
姐妹们,哥伦比亚的徒步鞋怎么样?下个月就要去吴越古道户外徒步旅行... 徒步装备选哪个牌子好 徒步小白上线!想问问大神们徒步鞋哥伦比亚户外活动性能如何?方便吗? 去医院怎么检查自己缺钙和缺维生素? 查缺钙做什么检查 骨骼缺钙怎么检查 检查缺钙查什么 joryaweekend是什么牌子 剪映在那里修改视频尺寸 剪映如何修改视频画面尺寸 修改视频画面尺寸方法分享 JAVA读文本文件怎么保存到数据库? 1688铺货踩坑 胡莱三国装备双倍永久有效啥意思 胡莱三国为什么包囊上的武器在铁匠铺里没有 爬山抓了一只蜥蜴,请问是什么品种,怎么饲养 qq怎样不显示性别 QQ性别不显示方法介绍 剪纸有哪些技巧 电脑的配置清单台式电脑主机配置清单及价格 四千块电脑配置什么最好我想组装一个4000左右的台式电脑什么配置... 4000元左右电脑配置单我想组装一台4000元左右的电脑什么配置最合适 四千带显示器的电脑配置四千元组装台式电脑带24寸显示器求配置 建兴帝人物简介 一万元,一分五利息,一月共利息多少钱? 五分利息一万元一个月多少利息 日利率为万分之五,请问这一万元每月的利息总额是多少? 上海奉贤哪里可以鉴定手表 电脑插千兆口影响wifi速度吗笔记本电脑使用外接千兆的USB网卡后电脑网 ... 我也要死一样的痛过的lrc歌词 ...时间一年次是什么意思啊?能具体说明一下吗?谢谢!!!如果 港澳次,三个月一次,一年二次是什么意思啊?能具体说明一下 whose用于名词性从句还是定语从句中? whose先行词什么时候选择 whose引导的主语从句例句 which, whose, who可以作定语从句吗? 级数求和的方法 微积分幂级数求和函数问题 灯具的一般分类 灯具的详细分类 求音乐:活着且行且唱 芳草薇薇 吉他干货|初学者该如何练习扫弦? 儿童微量元素抽多少血 11个月宝宝检查微量元素抽血多吗 湖北省考行测题型及题量 谜之屋有几季 《异物志》原型剧《谜之屋》,看完之后你再说是不是抄袭? 在3dmax中如何复制物体? 冒险游戏历史 ipad9.6英寸 “猗猗井上桐”的出处是哪里 青青窗前柳,郁郁井上桐。 iPhone 14怎么关闭已经打开的程序