java讀取txt、dat、xls、csv文件內容 - 使用策略模式

解析xls、csv文件所用到的pom

<!-- 工具包 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

用到的類

package com.chuangqi.tool.readFile;

import java.util.List;

/**
 * 讀取文件-策略接口
 */
public interface ReadStrategy {

    /**
     * 讀取文件指定行或全部內容
     * @param filePathName 讀取文件路徑
     * @param line 讀取多少行,如果line=0則表示讀取全部內容
     * @return
     */
    List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception;

}
package com.chuangqi.tool.readFile;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * @Description 讀取txt文件
 * @Author qizhentao
 * @Date 2020/3/12 13:58
 * @Version 1.0
 */
public class ReadTxt implements ReadStrategy {

    @Override
    public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
        int index = 0; // 索引
        if(line == null){
            line = 50; // 如果不傳入顯示多少行,則默認展示50行
        }

        // 讀取文件
        FileInputStream fileInputStream = new FileInputStream(filePathName);
        Scanner scanner = new Scanner(fileInputStream) ;

        // 獲取文件第一行數據,設爲title
        String nextLine = scanner.nextLine();
        // title內容
        String [] title = nextLine.split("\\s+");
        // 列數
        int lineNumber = title.length;

        // 封裝最終數據
        List<List<Object>> list = new ArrayList<>(lineNumber);
        list.add(Arrays.asList(title));

        // 用於存儲每行數據
        List<Object> lineList = new ArrayList();

        while(scanner.hasNext()){
            // 展示指定行數據
            if(line != 0 && index >= (lineNumber * line)){
               /*
                // 打印最終封裝的數據
                for (List li:list) {
                    Console.log(li);
                }*/

                fileInputStream.close();
                scanner.close();
                return list;
            }

            lineList.add(scanner.next());

            // 讀取完一行數據
            if (++index % lineNumber == 0){
                list.add(lineList);
                lineList = new ArrayList();
                //System.out.println(world);
                continue;
            }
            //System.out.print(world + "   ");
        }

        fileInputStream.close();
        scanner.close();
        return list;
    }

}
package com.chuangqi.tool.readFile;

import java.util.List;

/**
 * @Description 讀取dat文件
 * @Author qizhentao
 * @Date 2020/3/12 14:08
 * @Version 1.0
 */
public class ReadDat implements ReadStrategy{

    @Override
    public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
        ReadTxt readTxt = new ReadTxt();
        return readTxt.readFileAppointLine(filePathName, line);
    }

}
package com.chuangqi.tool.readFile;

import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import java.util.List;

/**
 * @Description 讀取xls文件
 * @Author qizhentao
 * @Date 2020/3/12 14:10
 * @Version 1.0
 */
public class ReadXls implements ReadStrategy{

    @Override
    public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
        if(line == null){
            line = 51;
        }

        // 讀取xls、csv文件
        ExcelReader reader = ExcelUtil.getReader(filePathName);
        // 獲取文件中所有內容
        List<List<Object>> readAll = reader.read();
        // 返回所有數據
        if(line == 0){
            return readAll;
        }

        // 封裝指定條數內容
        List<List<Object>> subList = readAll.subList(0, (line + 1));
        /*// 打印
        for (List li : subList) {
            Console.log(li);
        }*/
        return subList;
    }

}
package com.chuangqi.tool.readFile;

import java.util.List;

/**
 * @Description 讀取csv文件
 * @Author qizhentao
 * @Date 2020/3/12 14:12
 * @Version 1.0
 */
public class ReadCsv implements ReadStrategy{

    @Override
    public List<List<Object>> readFileAppointLine(String filePathName, Integer line) throws Exception {
        ReadXls readXls = new ReadXls();
        return readXls.readFileAppointLine(filePathName, line);
    }

}
package com.chuangqi.tool.readFile;

import cn.hutool.core.lang.Console;
import java.util.List;

/**
 * @Description 讀取文件-策略封裝
 * @Author qizhentao
 * @Date 2020/3/12 14:31
 * @Version 1.0
 */
public class ReadStrategyContent {

    private ReadStrategy readStrategy;

    public ReadStrategyContent(){

    }

    public ReadStrategyContent(ReadStrategy readStrategy){
        this.readStrategy = readStrategy;
    }

    /**
     * 通過無參構造讀取txt、dat、csv、xls文件內容
     *
     * @param filePathName 文件全路徑
     * @param line 讀取行數,0表示讀取全部內容
     * @return
     */
    public List<List<Object>> getReadFile(String filePathName, Integer line){
        if (filePathName.endsWith(".txt") || filePathName.endsWith(".TXT")){
            readStrategy = new ReadTxt();
        }else if(filePathName.endsWith(".dat") || filePathName.endsWith(".DAT")){
            readStrategy = new ReadDat();
        }else if(filePathName.endsWith(".csv") || filePathName.endsWith(".CSV")){
            readStrategy = new ReadCsv();
        }else if(filePathName.endsWith(".xls") || filePathName.endsWith(".xlsx") || filePathName.endsWith(".XLS") || filePathName.endsWith(".XLSX")){
            readStrategy = new ReadXls();
        }

        return getStructureReadFile(filePathName, line);
    }

    /**
     * 通過有構造執行對應的方法
     *
     * @param filePathName 讀取文件全路徑
     * @param line 讀取行數,0表示讀取全部內容
     * @return
     */
    public List<List<Object>> getStructureReadFile(String filePathName, Integer line){
        if (readStrategy == null){
            Console.log("ReadStrategy不能爲空");
        }

        try {
            return readStrategy.readFileAppointLine(filePathName, line);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    // 測試
    public static final String DAT =  "C:\\Users\\cq\\Desktop\\Data1隨機數30.DAT";
    public static final String TXT = "C:\\Users\\cq\\Desktop\\Data1_Step_PZ.txt";
    public static final String CSV = "C:\\Users\\cq\\Desktop\\csv測試.csv";
    public static final String XLS = "C:\\Users\\cq\\Desktop\\xls測試.xls";
    public static void main(String[] args) {
        // 無參構造讀取
        long l = System.currentTimeMillis();
        ReadStrategyContent readStrategyContent = new ReadStrategyContent();
        List<List<Object>> readFile = readStrategyContent.getReadFile(TXT, 100000);
        System.out.println(System.currentTimeMillis() - l);

        // 文件行數   解析加載耗時(毫秒)
        // 10000            130
        // 100000           360
        // 1000000          3500

        /*
        for (List li:readFile) {
            Console.log(li);
        }
        Console.log("讀取行數:{}",readFile.size());
        */

        /*// 有參構造讀取
        ReadStrategyContent readStrategyContent = new ReadStrategyContent(new ReadTxt());
        List<List<Object>> readFile = readStrategyContent.getReadFile("C:\\Users\\cq\\Desktop\\項目參考文檔\\BS仿真評估\\gitLab\\測試導入文件\\Data1_Step_PZ.txt", 50);
        for (List li:readFile) {
            Console.log(li);
        }*/
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章