文件中的两列内容,以第一列为key,放入map中。

50 阅读1分钟

image.png

package com.hrsyabc.definecenter;

import com.alibaba.fastjson.JSON;

import java.io.File;
import java.io.RandomAccessFile;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @description:
 * @author: ncc
 * @createDate: 2022/8/16
 * @version: 1.0
 */
public class FileImportTest {


    public static void main(String[] args) {

        Map<String,List<Double>> map = new HashMap<>();
        //先读文件到list集合中,
        List<String> list = readLastLineV1();
        // 过滤出不为空的字符串,并对每一个字符串,去掉收尾空格
        List<String> collect = list.stream()
                .filter(item -> item != null && !item.equals("") && !item.equals(" "))
                .map(String::trim)
                .collect(Collectors.toList());
        //对每个字符串 用中间的空格分割,
        for (String strItem : collect) {
            String[] s = strItem.split(" ");
            //去掉多余的空格
            String[] resArr = removeNullStringArray(s);
            //放到map里
            List<Double> doubleList = map.get(resArr[0]);
            if (doubleList == null){
                map.put(resArr[0],new ArrayList<String>(){{
                    add(Double.parseDouble(resArr[1]));
                }});
            }else {
                doubleList.add(Double.parseDouble(resArr[1]));
            }
        }
        System.out.println("s = " + JSON.toJSONString(map));
    }

    public static String[] removeNullStringArray(String[] arrayString) {
        String[] list1 = new String[arrayString.length];
        int j =0;
        for (int i = 0; i < arrayString.length; i++) {
            if (arrayString[i] != null && arrayString[i].length() != 0) { //过滤掉数组arrayString里面的空字符串
                list1[j] = (arrayString[i]);
                j++;
            }
        }
        return list1;
    }

    public static List<String> readLastLineV1() {
        // 存储结果
        StringBuilder builder = new StringBuilder();
        File file = new File("E:/a.json");
        List<String> list = new ArrayList<>();
        try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r")) {
            // 指针位置开始为0,所以最大长度为 length-1
            long fileLastPointer = randomAccessFile.length() - 1;
            // 从后向前读取文件
            for (long filePointer = 0; filePointer <= fileLastPointer; filePointer++) {
                // 移动指针指向
                randomAccessFile.seek(filePointer);
                //读数据
                int readByte = randomAccessFile.readByte();
                //遇到换行和回车,结束当前行读取。并输出数据
                if (0xA == readByte) {
                    //  LF='\n'=0x0A 换行 // 如果是最后的换行,过滤掉
                    if (filePointer == fileLastPointer) {
                        break;
                    }

                    list.add(builder.toString());
                    //重置builder
                    builder = new StringBuilder();
                    continue;
                }
                if (0xD == readByte) {
                    //  CR ='\r'=0x0D 回车
                    if (filePointer == fileLastPointer - 1) {
                        // 如果是倒数的回车也过滤掉
                        break;
                    }
                    list.add(builder.toString());
                    //重置builder
                    builder = new StringBuilder();
                    continue;
                }
                builder.append((char) readByte);
            }
        } catch (Exception e) {
            System.out.println("e = " + e);
        }
        return list;
    }
}