成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JAVA8快速寫入和讀取文件

高璐 / 3377人閱讀

摘要:快速寫入和讀取文件話不多說,先看題隨機(jī)生成的記錄,如,每行一條記錄,總共萬記錄,寫入文本文件編碼,然后讀取文件,的前兩個(gè)字符相同的,其年薪累加,比如,萬,個(gè)人,最后做排序和分組,輸出年薪總額最高的組萬,人萬,人位隨機(jī),隨機(jī)隨機(jī),年薪總

JAVA8快速寫入和讀取文件?

話不多說,先看題:

隨機(jī)生成 Salary {name, baseSalary, bonus }的記錄,如“wxxx,10,1”,每行一條記錄,總共1000萬記錄,寫入文本文件(UFT-8編碼), 然后讀取文件,name的前兩個(gè)字符相同的,其年薪累加,比如wx,100萬,3個(gè)人,最后做排序和分組,輸出年薪總額最高的10組:

? wx, 200萬,10人

? lt, 180萬,8人

? ....

name 4位a-z隨機(jī),baseSalary [0,100]隨機(jī) bonus[0-5]隨機(jī) ,年薪總額 = baseSalary*13 + bonus。

思路:

第一步:先編寫一個(gè)Salary對(duì)象

里面包含有name,baseSalary, bounus屬性,然后編寫一個(gè)構(gòu)造器,重寫toString()方法方便序列化數(shù)據(jù),同時(shí)編寫構(gòu)建Salary對(duì)象的方法build();

/**
 *  name 4位a-z隨機(jī)
 *  baseSalary 0-100隨機(jī)
 *  bonus 0-5隨機(jī)
 *  年薪總額 = baseSalary * 13 + bonus
 */
class Salary {
    // name 4位a-z隨機(jī),baseSalary 0-100隨機(jī),bonus 0-5隨機(jī) 年薪總額 = baseSalary * 13 + bonus
    private String name;
    private int baseSalary;
    private int bonus;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getBaseSalary() {
        return baseSalary;
    }

    public void setBaseSalary(int baseSalary) {
        this.baseSalary = baseSalary;
    }

    public int getBonus() {
        return bonus;
    }

    public void setBonus(int bonus) {
        this.bonus = bonus;
    }


    public Salary() {

    }

    public Salary(String name, int baseSalary, int bonus) {
        this.name = name;
        this.baseSalary = baseSalary;
        this.bonus = bonus;
    }

    public Salary build() {
        this.name = getRandomName(4);
        // 0-100隨機(jī)數(shù)
        this.baseSalary = (int)(100 * Math.random());
        // 0-5隨機(jī)數(shù)
        this.bonus = (int)(5 * Math.random());
        return this;
    }

    @Override
    public String toString() {
        return name + " " + baseSalary + " " + bonus;
    }

    /**
     * 生產(chǎn)Name隨機(jī)函數(shù) 4位a-z隨機(jī)
     * @param length
     * @return
     */
    private static String getRandomName(int length ){
        String base = "abcdefghijklmnopqrstuvwxyz";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for ( int i = 0; i < length; i++ ){
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }
}
第二步:編寫寫入方法

? a) 第一種方式,使用Java的IO中BufferedWriter寫入文件

/**
 * 寫入文件
 * @return
 * @throws IOException
 */
public static File writeBuffer() throws IOException {
    File file = new File(FILE_NAME);
    FileOutputStream fos = new FileOutputStream(file);
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos));
    int i = AMOUNT;
    while(i > 0) {
        Salary salary = new Salary().build();
        writer.write(salary.toString() + "
");
        i --;
    }
    writer.close();
    fos.close();
    return file;
}

? b) 第二種方式,使用JAVA的NIO中的FileChannel進(jìn)行寫入

/**
 * NIO進(jìn)行寫入
 * @throws IOException
 */
private static void writeNIO() throws IOException {
    FileOutputStream fos = new FileOutputStream(FILE_NAME, true);
    FileChannel channel = fos.getChannel();
    int i = AMOUNT;
    StringBuffer content = new StringBuffer();
    while(i > 0) {
        Salary salary = new Salary().build();
        content.append(salary.toString()).append("
");
        i --;
    }
    ByteBuffer buf = ByteBuffer.wrap(content.toString().getBytes());
    buf.put(content.toString().getBytes());
    buf.flip();
    channel.write(buf);
    channel.close();
    fos.close();

}

比較下來,單純從這個(gè)代碼的性能上講差不太多!

第三步:讀取并解析文件在進(jìn)行排序

? a) 通過JAVA的IO進(jìn)行讀?。?/p>

/**
 * Java IO讀取文件的方式
 * @return
 * @throws Exception
 */
public static List readFileIO() throws Exception {
    File file = new File(FILE_NAME);
    List list = new ArrayList<>();
    InputStreamReader reader = new InputStreamReader(new FileInputStream(file)); // 建立一個(gè)輸入流對(duì)象reader
    BufferedReader br = new BufferedReader(reader); // 建立一個(gè)對(duì)象,它把文件內(nèi)容轉(zhuǎn)成計(jì)算機(jī)能讀懂的語言
    String line = ""; // 每一行的內(nèi)容
    int i = 1;
    while ((line = br.readLine()) != null) {
        String[] split = line.trim().split(" ");// .trim()可以去掉首尾多余的空格
        list.add(new Salary(split[0], Integer.valueOf(split[1]), Integer.valueOf(split[2]))); // 添加一個(gè)Salary實(shí)體
        i++;
    }
    reader.close();
    br.close();
    return list;
}

? b) 通過JAVA的NIO讀取:

/**
 * JDK8 NIO讀取文件
 * @return
 * @throws Exception
 */
public static List readFileNIO() throws Exception {
    List list = new ArrayList<>();
    Files.lines(Paths.get(FILE_NAME)).forEach(line -> {
        String[] split = line.trim().split(" ");// .trim()可以去掉首尾多余的空格
        list.add(new Salary(split[0], Integer.valueOf(split[1]), Integer.valueOf(split[2]))); // 添加一個(gè)Salary實(shí)體
    });
    return list;
}

二者比較下來:使用jdk1.8讀取更簡單,效率性能更高!

第四步:使用JDK8的Stream進(jìn)行排序和截取
/**
 * 排序并獲取前十?dāng)?shù)據(jù)
 * @param salaries
 */
public static void sort(List salaries) {
    Map result = new HashMap<>();
    salaries.forEach(salary -> {
        String shortName = salary.getName().substring(0, 2);
        GroupSalary groupSalary = null;
        List salaryList = null;
        if (result.containsKey(shortName)) {
            groupSalary = result.get(shortName);
            salaryList = groupSalary.getSalaries();
        } else {
            groupSalary = new GroupSalary();
            salaryList = new ArrayList<>();
            groupSalary.setSalaries(salaryList);
        }
        salaryList.add(salary);
        groupSalary.setShortName(shortName);
        groupSalary.setTotal(groupSalary.getTotal() + salary.getBaseSalary() * 13 + salary.getBonus());
        result.put(shortName, groupSalary);
    });

    List r = result.entrySet().stream()
            .sorted((Map.Entry o1, Map.Entry o2) -> o2.getValue().getTotal() - o1.getValue().getTotal())
            .map(entry -> entry.getValue()).collect(Collectors.toList()).subList(0,10);

    r.forEach(groupSalary -> {
        System.out.println(groupSalary.getShortName() + " " + groupSalary.getTotal() + " " + groupSalary.getSalaries().size());
    });
}

同時(shí)將數(shù)據(jù)封裝在GroupSalary中

class GroupSalary {
    private List salaries;
    private String shortName;
    private int total;

    public List getSalaries() {
        return salaries;
    }

    public void setSalaries(List salaries) {
        this.salaries = salaries;
    }

    public String getShortName() {
        return shortName;
    }

    public void setShortName(String shortName) {
        this.shortName = shortName;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }


}

到此如果寫入100W數(shù)據(jù)基本上1分鐘不到就可以完成寫入和讀取,歡迎大家進(jìn)行改寫和優(yōu)化,具體代碼請(qǐng)去:

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72504.html

相關(guān)文章

  • Java 8 API 示例:字符串、數(shù)值、算術(shù)文件

    摘要:示例字符串?dāng)?shù)值算術(shù)和文件原文譯者飛龍協(xié)議大量的教程和文章都涉及到中最重要的改變,例如表達(dá)式和函數(shù)式數(shù)據(jù)流。不僅僅是字符串,正則表達(dá)式模式串也能受益于數(shù)據(jù)流。 Java 8 API 示例:字符串、數(shù)值、算術(shù)和文件 原文:Java 8 API by Example: Strings, Numbers, Math and Files 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 ...

    KavenFan 評(píng)論0 收藏0
  • java.io (1) 基本輸入輸出流

    摘要:基本輸入流輸入流類中包含兩類功能輸入流的兩大功能讀取流中字節(jié)數(shù)據(jù)的功能是通過方法來完成?;据敵隽髋c類相對(duì)應(yīng)的類表示基本的輸出流,用來把數(shù)據(jù)從程序輸出到其他地方。 一堆廢話(趕快跳過) 在我們的日常開發(fā)中 I/O 涉及到我們開發(fā)的方方面面,雖然早在 JDK1.5 就新增了 NIO的概念,但是 java.io 的使用以及技巧在我們的日常開發(fā)中還是占據(jù)很高的比重。 概念(不看也行) ...

    haobowd 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-讀書筆記第一章(02)

    摘要:實(shí)戰(zhàn)讀書筆記第一章從方法傳遞到接著上次的,繼續(xù)來了解一下,如果繼續(xù)簡化代碼。去掉并且生成的數(shù)字是萬,所消耗的時(shí)間循序流并行流至于為什么有時(shí)候并行流效率比循序流還低,這個(gè)以后的文章會(huì)解釋。 《Java8實(shí)戰(zhàn)》-讀書筆記第一章(02) 從方法傳遞到Lambda 接著上次的Predicate,繼續(xù)來了解一下,如果繼續(xù)簡化代碼。 把方法作為值來傳遞雖然很有用,但是要是有很多類似與isHeavy...

    lushan 評(píng)論0 收藏0
  • 【極致】一個(gè) jar 包的自我修養(yǎng)

    摘要:提升自己,方便他人。其實(shí)一份文檔,說到底是為自己減輕工作量??偨Y(jié)總結(jié)起來,我們在提供一個(gè)通用包的時(shí)候,應(yīng)該考慮以下七個(gè)點(diǎn)文檔。支持的類反射獲取參數(shù)名面向接口編程。一個(gè)注解,快速整合 聲明:本文屬原創(chuàng)文章,首發(fā)于公號(hào)程序員自學(xué)之道,轉(zhuǎn)載請(qǐng)注明出處 遇到槽點(diǎn) 開發(fā)實(shí)踐中,對(duì)于開發(fā)一個(gè) jar 包,很多人都只是完成功能,只要功能使用沒問題,就算是完事了,但其實(shí)遠(yuǎn)遠(yuǎn)不夠。當(dāng)用戶使用 jar 包...

    pumpkin9 評(píng)論0 收藏0
  • Java 集合 Map Properties讀取屬性文件

    摘要:和之間存在單向一對(duì)一關(guān)系,即通過指定的,總能找到唯一的確定的。從中取出數(shù)據(jù)時(shí),只要給出指定的,就可以取出對(duì)應(yīng)的。有時(shí)也稱為字典,或關(guān)聯(lián)數(shù)組。采用定制排序時(shí)不要求的實(shí)現(xiàn)接口中判斷兩個(gè)相等的標(biāo)準(zhǔn)是兩個(gè)通過方法返回,即認(rèn)為這兩個(gè)是相等的。 map用于保存具有映射關(guān)系的數(shù)據(jù),因此Map集合里保存著兩組值,一組值用于保存Map里的key,另外一組值用于保存Map里的value,key和value...

    tomato 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

高璐

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<