zoukankan      html  css  js  c++  java
  • 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("
    ");
            
            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("
    ---------使用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。

      致谢:感谢您的阅读!

  • 相关阅读:
    selenium 学习(-)
    阿里百川SDK初始化失败 错误码是203
    sql-如何提高SQL查询的效率?
    索引失效原因总结
    索引失效原因总结
    sql-优化-大表关联小表
    sql-优化-大表关联小表
    C#-How to get series point info when mouse is over chartcontrol
    C#-How to get series point info when mouse is over chartcontrol
    C#-ILookup 初始化
  • 原文地址:https://www.cnblogs.com/0201zcr/p/5009975.html
Copyright © 2011-2022 走看看