java快速读取文件

Java (5) 2024-05-12 19:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说java快速读取文件,希望能够帮助你!!!。

       java读取文件的方式有多种,有些慢,有些快,当读取大量的文件时,速度尤为重要。以下是鄙人做项目时发现读取文件过慢时,对两种读取文件方式快慢的测试。

开门见山:这是快速读取的代码:

static public String readFile(File file) {      

    try {

            FileInputStream fileInputStream = new FileInputStream(file);
            // 把每次读取的内容写入到内存中,然后从内存中获取
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            // 只要没读完,不断的读取
            while ((len = fileInputStream.read(buffer)) != -1) {

                outputStream.write(buffer, 0, len);
            }
            // 得到内存中写入的所有数据
            byte[] data = outputStream.toByteArray();
            fileInputStream.close();
            return new String(data);
            //return new String(data, "GBK");//以GBK(什么编码格式)方式转
        } catch (FileNotFoundException e) {

            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {

            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

这是比较慢读取的代码:

static public String getContent(File file) {

        StringBuffer result = new StringBuffer();
        try {

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    new FileInputStream(file), Charset.forName("GBK")));// 构造一个BufferedReader类来读取文件
            String s = null;
            while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行
                result.append(s).append("\n");
            }
            br.close();
        } catch (Exception e) {

            e.printStackTrace();
        }

        return result;
    }


这是不可取的读取的代码:

static public String getContent(File file) {

//在着再次强调一个“+”号,数据多的时间绝对不能用“+”

        String result = "";

        try {

            BufferedReader br = new BufferedReader(new InputStreamReader(

                    new FileInputStream(file), Charset.forName("GBK")));// 构造一个BufferedReader类来读取文件

            String s = null;

            while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行

                result = result + "\n" + s;

            }

            br.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

        return result;

    }

测试结果:

java快速读取文件_https://bianchenghao6.com/blog_Java_第1张

测试类:


package com.atgeretg.test;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Test {

    public static void main(String[] args) {

        findFile("J:\\lhc");
    }
    
    static public void findFile(String path) {

        // Dao dao = new Dao();
        File folder = new File(path);// 获取文件夹路径
        if (folder.isDirectory()) {

            String[] nameS = folder.list();// 获取文件名
            String pathWindows = folder.getAbsolutePath();
            System.out.println("path = " + pathWindows);
            String[] cont = new String[nameS.length];
            long millisRead = System.currentTimeMillis();
            for (int i = 0; i < nameS.length; i++) {

                String filePath = pathWindows + "\\" + nameS[i];
                //System.out.println(filePath);
                File f = new File(filePath);
                String content = readFile(f);
                // getNeedData(content);
                cont[i] = content;
            }

            System.out.println("read 快的 time = "
                    + (System.currentTimeMillis() - millisRead)+"ms; 共:"+nameS.length+"个文件");
            millisRead = System.currentTimeMillis();
            for (int i = 0; i < nameS.length; i++) {

                String filePath = pathWindows + "\\" + nameS[i];
                //System.out.println(filePath);
                File f = new File(filePath);
                String content = getContent1(f);
                // getNeedData(content);
                cont[i] = content;
            }

            System.out.println("read 没有加号的 time = "
                    + (System.currentTimeMillis() - millisRead)+"ms; 共:"+nameS.length+"个文件");
            millisRead = System.currentTimeMillis();
            for (int i = 0; i < nameS.length; i++) {

                String filePath = pathWindows + "\\" + nameS[i];
                //System.out.println(filePath);
                File f = new File(filePath);
                String content = getContent(f);
                // getNeedData(content);
                cont[i] = content;
            }
            System.out.println("read 带有加号的 time = "
                    + (System.currentTimeMillis() - millisRead)+"ms; 共:"+nameS.length+"个文件");
        }
    }

    static public String getContent(File file) {

        String result = "";
        try {

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    new FileInputStream(file), Charset.forName("GBK")));// 构造一个BufferedReader类来读取文件
            String s = null;
            while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行
                result = result + "\n" + s;
            }
            br.close();
        } catch (Exception e) {

            e.printStackTrace();
        }
        return result;
    }
    
    static public String getContent1(File file) {

        StringBuffer result = new StringBuffer();
        try {

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    new FileInputStream(file), Charset.forName("GBK")));// 构造一个BufferedReader类来读取文件
            String s = null;
            while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行
                result.append(s).append("\n");
            }
            br.close();
        } catch (Exception e) {

            e.printStackTrace();
        }
        // result.getBytes(charset)
        return result.toString();
    }

    static public String readFile(File file) {

        try {

            FileInputStream fileInputStream = new FileInputStream(file);
            // 把每次读取的内容写入到内存中,然后从内存中获取
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            // 只要没读完,不断的读取
            while ((len = fileInputStream.read(buffer)) != -1) {

                outputStream.write(buffer, 0, len);
            }
            // 得到内存中写入的所有数据
            byte[] data = outputStream.toByteArray();
            fileInputStream.close();
            //return new String(data);
            return new String(data, "GBK");//以GBK方式转,不会出现中文乱码就不在加,加上速度会相对慢一些
        } catch (FileNotFoundException e) {

            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {

            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    
    static public String readFile1(File file) {

        try {

            FileInputStream fileInputStream = new FileInputStream(file);
            // 把每次读取的内容写入到内存中,然后从内存中获取
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            // 只要没读完,不断的读取
            while ((len = fileInputStream.read(buffer)) != -1) {

                outputStream.write(buffer, 0, len);
            }
            // 得到内存中写入的所有数据
            byte[] data = outputStream.toByteArray();
            fileInputStream.close();
            return new String(data);
//            return new String(data, "GBK");//以GBK方式转,不会出现中文乱码就不在加,加上速度会相对慢一些
        } catch (FileNotFoundException e) {

            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {

            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复