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。
致谢:感谢您的阅读!
java 读取文件——按照行取出(使用BufferedReader和一次将数据保存到内存两种实现方式)的更多相关文章
- Java读取文件-BufferedReader/FileReader/InputStreamReader/FileInputStream的关系和区别
一.Java读取和存储文件数据流 Java读取文件,实际是将文件中的字节流转换成字符流输出到屏幕的过程 这里面涉及到两个类:InputStreamReader和OutputStreamWriter ...
- [Java]读取文件方法大全(转)
[Java]读取文件方法大全 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** ...
- java读取文件:文本文件
一般使用串行方式读出或者写入文件.总的来说,使用输入流把文件内容读入内存,使用输出流把内存中的信息写出到文件.这些类位于java.io包下.输入和输出的类和方法往往是对应的 文本文件 先了解如何读写文 ...
- matlab文件读写处理实例(三)——读取文件特定行
(1) 读取文件特定行 CODE: ; ; if nline==line fprintf(fidout,'%s\n',tline); data ...
- Java 读取文件的内容
Java 读取文件的内容 1) CLASS_NAME: 换成自己真实的类名 2) /page/test.json: 换成自己真实的page 3) FileUtils: 来自于org.apache.co ...
- 使用Perl批量读取文件最后行
使用Perl批量读取文件最后行 面对成百上千个文件,有时我们需要查看它的最后行,单个文件打开将耗费大量时间,而通过Perl提取出最后行,将快速的帮助我们处理繁琐的事务. 特性 整个目录完全遍历,自动提 ...
- python读取文件指定行内容
python读取文件指定行内容 import linecache text=linecache.getline(r'C:\Users\Administrator\Desktop\SourceCodeo ...
- python3读取文件指定行的三种方案
技术背景 考虑到深度学习领域中的数据规模一般都比较大,尤其是训练集,这个限制条件对应到实际编程中就意味着,我们很有可能无法将整个数据文件的内容全部都加载到内存中.那么就需要一些特殊的处理方式,比如:创 ...
- Java学习-014-文本文件写入实例源代码(两种写入方式)
此文源码主要为应用 Java 读取文本文件内容实例的源代码.若有不足之处,敬请大神指正,不胜感激! 第一种:文本文件写入,若文件存在则删除原文件,并重新创建文件.源代码如下所示: /** * @fun ...
随机推荐
- CI框架源码阅读笔记2 一切的入口 index.php
上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中, ...
- java集合-HashTable
概述 和 HashMap 一样,Hashtable 也是一个散列表,它存储的内容是键值对. Hashtable 在 Java 中的定义为: public class Hashtable<K,V& ...
- AE,按照属性值关系选择要素
if(axMapControl2.LayerCount<=0) { MessageBox.Show("请加载图层后使用该功能","系统提示",Messag ...
- NMAP实用手册
nmap在网络和渗透中使用相当频繁,相关教程也层出不穷.在此,我只整理出最实用的,言简意赅,方便自己,方便他人. 一.nmap介绍 NMAP,也就是Network Mapper,最早是Linux下的网 ...
- SharePoint 2010 匿名访问开启后不能访问Allitems.aspx或DisplayForm.aspx
Body: Full Credit goes to Pet Stilgoe: http://www.petestilgoe.com/2010/02/allowed-anonymous-access-o ...
- AWS EC2 复制实例后,自定义指标无法显示数据
从一个实例创建了一个AMI,然后通过这个AMI创建新的EC2实例,结果发票自定义指标不会显示: 系统一直在邮件中提示: print() on closed filehandle MDATA at Cl ...
- Android布局优化策略
我们要知道布局是否合理,可以通过Hierarchy Viewer这个工具.打开Hierarchy Viewer(定位到tools/目录下,直接执行hierarchyviewer的命令,选定需要查看的P ...
- Python学习01 Hello World
Python学习之Hello World 准备工作 去官网http://www.python.org/ 下载python的安装包: http://www.python.org/download/ 当前 ...
- git 新建服务器的版本以及项目的用户
一, git客户端账号生成 1. git的客户端的公钥生成 ssh-keygen -t rsa -C "test@gmail.com" mac机器会在 /Users/用户/.ssh ...
- CAGradientLayer渐变效果
属性 startPoint和endPoint 决定渐变方向,以单位坐标系定义.左上角{0,0},右下角{1,1} colors 渐变的颜色,是一个CGColorRef的数组. locations 定义 ...