java 读取文件——按照行取出(使用BufferedReader和一次将数据保存到内存两种实现方式)详解编程语言

1、实现目标

  读取文件,将文件中的数据一行行的取出。

2、代码实现

1)、方式1:

  通过BufferedReader的readLine()方法。

/** 
     * 功能:Java读取txt文件的内容 步骤:1:先获得文件句柄 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取 
     * 3:读取到输入流后,需要读取生成字节流 4:一行一行的输出。readline()。 备注:需要考虑的是异常情况 
     *  
     * @param filePath 
     *            文件路径[到达文件:如: D:/aa.txt] 
     * @return 将这个文件按照每一行切割成数组存放到list中。 
     */ 
    public static List<String> readTxtFileIntoStringArrList(String filePath) 
    { 
        List<String> list = new ArrayList<String>(); 
        try 
        { 
            String encoding = "GBK"; 
            File file = new File(filePath); 
            if (file.isFile() && file.exists()) 
            { // 判断文件是否存在 
                InputStreamReader read = new InputStreamReader( 
                        new FileInputStream(file), encoding);// 考虑到编码格式 
                BufferedReader bufferedReader = new BufferedReader(read); 
                String lineTxt = null; 
 
                while ((lineTxt = bufferedReader.readLine()) != null) 
                { 
                    list.add(lineTxt); 
                } 
                bufferedReader.close(); 
                read.close(); 
            } 
            else 
            { 
                System.out.println("找不到指定的文件"); 
            } 
        } 
        catch (Exception e) 
        { 
            System.out.println("读取文件内容出错"); 
            e.printStackTrace(); 
        } 
 
        return list; 
    }

2)、方式2

  通过文件byte数组暂存文件中内容,将其转换为String数据,再按照 “回车换行” 进行分割。

/** 
     * 读取filePath的文件,将文件中的数据按照行读取到String数组中 
     * @param filePath    文件的路径 
     * @return            文件中一行一行的数据 
     */ 
    public static String[] readToString(String filePath) 
    { 
        File file = new File(filePath); 
        Long filelength = file.length(); // 获取文件长度 
        byte[] filecontent = new byte[filelength.intValue()]; 
        try 
        { 
            FileInputStream in = new FileInputStream(file); 
            in.read(filecontent); 
            in.close(); 
        } catch (FileNotFoundException e) 
        { 
            e.printStackTrace(); 
        } catch (IOException e) 
        { 
            e.printStackTrace(); 
        } 
         
        String[] fileContentArr = new String(filecontent).split("/r/n"); 
         
        return fileContentArr;// 返回文件内容,默认编码 
    }

3)、测试

public static void main(String[] args) 
    { 
 
         
        List<String> stringList = readTxtFileIntoStringArrList("C://soft//java//tomcat//apache-tomcat-7.0.40//webapps//appDataGenerate//log4j//lepai_recognize_cache.log"); 
         
        System.out.println("-------使用BufferedReader读取-----------"); 
        for(String str : stringList) 
        { 
            System.out.println(str); 
        } 
         
        System.out.println("/n---------使用byte直接缓存整个文件到内存----------------"); 
         
        String[] stringArr = readToString("C://soft//java//tomcat//apache-tomcat-7.0.40//webapps//appDataGenerate//log4j//lepai_recognize_cache.log"); 
        for(int i = 0 ; i < stringArr.length ; i ++) 
        { 
            System.out.println(stringArr[i]); 
        } 
         
         
    }

结果:

-------使用BufferedReader读取----------- 
[2015-11-30 13:21:28] [RecognizeCache] [INFO] : RecogizeCache init 
[2015-11-30 13:21:28] [RecognizeCache] [INFO] : RecogizeCache init 
[2015-11-30 13:21:28] [RecognizeCache] [INFO] : RecogizeCache init 
[2015-11-30 13:21:28] [RecognizeCache] [INFO] : RecogizeCache init 
[2015-12-01 14:52:04] [RecognizeCache] [INFO] : 读取文件:4209bad42de0f6e55c0daf0bd24b635a.txt 
 
---------使用byte直接缓存整个文件到内存---------------- 
[2015-11-30 13:21:28] [RecognizeCache] [INFO] : RecogizeCache init 
[2015-11-30 13:21:28] [RecognizeCache] [INFO] : RecogizeCache init 
[2015-11-30 13:21:28] [RecognizeCache] [INFO] : RecogizeCache init 
[2015-11-30 13:21:28] [RecognizeCache] [INFO] : RecogizeCache init 
[2015-12-01 14:52:04] [RecognizeCache] [INFO] : 读取文件:4209bad42de0f6e55c0daf0bd24b635a.txt

3、比较

  方式1是将文件的一部分或全部数据读取出来用BufferReader缓存起来,需要再冲缓存中取数据,这样比要得时候去文件中读取要快一些。

  方式2是一次把文本的原始内容直接读取到内存中再做处理(暂时不考虑内存大小),这样做效率也会提高。同时,可以处理当你使用第1方式用readLine()方法时,文件又有线程在不断的向文件中写数据【只处理现在已经在文件中的数据】。另外,用readline()之类的方法,可能需要反复访问文件,而且每次readline()都会调用编码转换,降低了速度,所以,在已知编码的情况下,按字节流方式先将文件都读入内存,再一次性编码转换是最快的方式。

  有错误的希望大牛不吝赐教。 想了解一下,

  1、通过ftp取一个文件到本地,我如何判断对方的文件是否已经写完了。

  2、当我使用上面的BufferedReader的readLine()方法一行行读取文件的时候,我还向文件中添加数据,会不会出现文件读取结束不了的情况。

源码下载:

https://github.com/zcr1007391008/demo 的TestReadAllFileToMemory。

  致谢:感谢您的阅读!

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15126.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论