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 ...
随机推荐
- 十一个行为模式之责任链模式(Responsible Chain Pattern)
定义: 将具有相同接口的责任类串行在一起,解耦请求的发送者和处理者.沿着这条链进行请求,直到有对象处理它为止. 结构图: Handler:抽象处理类,定义了所有责任类处理方法的接口,不同的处理方法在子 ...
- javax.el.PropertyNotFoundException: Property 'name' not found on type java.lang.String
javax.el.PropertyNotFoundException: Property 'name' not found on type java.lang.String javax.el.Bean ...
- C# 泛型的协变和逆变
1. 可变性的类型:协变性和逆变性 可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用.如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量.协变和逆变是两个相互对立的概念: 如 ...
- Spirit - 腾讯移动 Web 整体解决方案
Spirit 并不是一个具体的框架或者工具,但是她是移动端一系列解决方案的整合与聚拢.她是腾讯 Alloyteam 开发团队在移动开发项目中通过大量实践.归纳.总结提炼而成,最终沉淀下来的一个体系,真 ...
- CSV.js – 用于 CSV 解析和编码的 JS 工具库
逗号分隔值(CSV )文件用于以以纯文本的形式存储表格化数据(数字和文本). CSV 文件包含任意数量的记录,通过某种换行符分隔,每条记录由字段,其他一些字符或字符串分隔,最常用的是文字逗号或制表符. ...
- 移动端事件touchstart、touchmove、touchend
关于这三个移动端的事件,详细的资料网上一搜一大片,我就不浪费时间了 1.移动端长按事件 var timer = null; $(ele).on('touchstart',function(){ tim ...
- 用Phaser来制作一个html5游戏——flappy bird (二)
在上一篇教程中我们完成了boot.preload.menu这三个state的制作,下面我们就要进入本游戏最核心的一个state的制作了.play这个state的代码比较多,我不会一一进行说明,只会把一 ...
- DOM事件类型详解
一.表单事件: input事件当<input>.<textarea>的值发生变化时触发.此外,打开contenteditable属性的元素,只要值发生变化,也会触发input事 ...
- cell重用的几种方式
1.使用xib重用 //ios6 之后推荐大家使用的重用方式 //动态的使用self获得当前类名,来作为唯一的标示 NSString * identifier = NSStringFromClass( ...
- VSTO开发,转帖
http://www.cnblogs.com/oneivan/p/4243574.html