请教怎样从文件读到的内容一行行分析

wannaspring 2012-12-01 03:59:51
如下代码:
1、怎样把读到的内容(在BUFFER里)一行一行进行分析? 也就是 getline操作
2、如下的读法,可以只读一部分文件的内容吗?也就是分批读取?
谢谢

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class test
{

public static void main(String[] args) throws IOException
{
FileInputStream fileInputStream = new FileInputStream("tconfirmdetail.txt");
FileChannel inChannel = fileInputStream.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(57972956);
while(true)
{
int eof = inChannel.read(byteBuffer);
if(eof == -1 ) break;
byteBuffer.flip();
byteBuffer.clear();
}
inChannel.close();
}
}
...全文
538 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
SkyJS 2014-10-24
  • 打赏
  • 举报
回复
NIO:是文件映射内存的方式,可以方便你处理大文件。不用担心由于文件过大一次读到内存中造成内存溢出 BufferedReader ,这个方式应该比没有缓冲区的读速度快。因为他是从文件中分批读取内容的。 传统的没有缓冲区的文件读取速度最慢。 如果是小文件很显然BufferedReader要更快,但是大文件我想目前只能用NIO去处理了。
wapigzhu 2012-12-02
  • 打赏
  • 举报
回复
引用 24 楼 wannaspring 的回复:
引用 22 楼 wapigzhu 的回复:引用 20 楼 wannaspring 的回复: 引用 18 楼 wapigzhu 的回复:什么叫做比BufferedReader慢, 你说的慢是因为平时用的时候,它的底层数据是从FileInputStream里面来的, BufferedReader本身是跟Stream什么都没有关系的, 它只负责操作你给它的数据, 你给……
你是怎么测的? 我刚试过了,一个11M的小说txt文件, 读出来转码并存到ArrayList, 用nio只用50ms左右 用FileReader花了235ms 代码在下面你可以试试看? nio的

		RandomAccessFile file = new RandomAccessFile("b.txt", "r");
		FileChannel fileChannel = file.getChannel();
		ByteBuffer buffer = ByteBuffer.allocateDirect((int) fileChannel.size());
		fileChannel.read(buffer);
		buffer.flip();
		CharBuffer charBuffer = Charset.forName("utf-8").decode(buffer);
		file.close();
		BufferedReader bufferedReader = new BufferedReader(new StringReader(charBuffer.toString()));
		List<String> list = new ArrayList<String>();
		long time = System.currentTimeMillis();
		String str = null;
		while((str = bufferedReader.readLine()) != null){
			list.add(str);
		}
		System.out.println(System.currentTimeMillis() - time);
FileReader

BufferedReader bufferedReader = new BufferedReader(new FileReader("b.txt"));
		String str = null;
		long time = System.currentTimeMillis();
		List<String> list = new ArrayList<String>();
		while((str = bufferedReader.readLine()) != null){
			list.add(str);
		}
		System.out.println(System.currentTimeMillis() - time);
wannaspring 2012-12-01
  • 打赏
  • 举报
回复
引用 23 楼 wapigzhu 的回复:
引用 19 楼 wannaspring 的回复: 引用 15 楼 wapigzhu 的回复:Java code?? 12345678910111213 public static void main(String[] args) throws IOException { RandomAccessFile file = new RandomAccessFile(……
不只是判断一个字符,有好几个,如果正则是很慢的,不考虑 但是如果 indexOf N次,就会遍历字符串N次,也慢
wannaspring 2012-12-01
  • 打赏
  • 举报
回复
引用 22 楼 wapigzhu 的回复:
引用 20 楼 wannaspring 的回复: 引用 18 楼 wapigzhu 的回复:什么叫做比BufferedReader慢, 你说的慢是因为平时用的时候,它的底层数据是从FileInputStream里面来的, BufferedReader本身是跟Stream什么都没有关系的, 它只负责操作你给它的数据, 你给它数据的时候慢,当然它给你结果就慢 你把一个内存里面的字符串直接让……
我已经糊涂了,NIO,DIRECT BUFFER(ALLOCATEDIRET) CHANNEL 简单说吧,如下代码是我目前知道的最快的方式了,是否有更快的? NIO结合channel我测试了,比下面的快13%,但是是读到buffer,然后从buffer解码,再读成一行一行,貌似反而更慢了 BufferedReader reader = new BufferedReader(new FileReader("test.txt")); reader.readLine(); String line = null; String item[]; while ((line = reader.readLine()) != null) { }
wapigzhu 2012-12-01
  • 打赏
  • 举报
回复
引用 19 楼 wannaspring 的回复:
引用 15 楼 wapigzhu 的回复:Java code?? 12345678910111213 public static void main(String[] args) throws IOException { RandomAccessFile file = new RandomAccessFile("1.txt", "r")……
indexOf不能满足这个需求么?
wapigzhu 2012-12-01
  • 打赏
  • 举报
回复
引用 20 楼 wannaspring 的回复:
引用 18 楼 wapigzhu 的回复:什么叫做比BufferedReader慢, 你说的慢是因为平时用的时候,它的底层数据是从FileInputStream里面来的, BufferedReader本身是跟Stream什么都没有关系的, 它只负责操作你给它的数据, 你给它数据的时候慢,当然它给你结果就慢 你把一个内存里面的字符串直接让BufferedReade……
当然用nio的更快咯,他是一整块内存直接读的 new FileReader("test.txt"))这个是按stream读的 底层操作会比nio的多很多
wapigzhu 2012-12-01
  • 打赏
  • 举报
回复
引用 17 楼 wannaspring 的回复:
引用 15 楼 wapigzhu 的回复:Java code?? 12345678910111213 public static void main(String[] args) throws IOException { RandomAccessFile file = new RandomAccessFile("1.txt", "r")……

public static void main(String[] args) throws IOException {
		RandomAccessFile file = new RandomAccessFile("1.txt", "r");
		FileChannel fileChannel = file.getChannel();
		//这个地方要按文件大小来,如果实在要定长就只能按先前说的,继续往后读到换行符
		//或者把已经读过但是没有凑成正行的put回去,然后compact,再继续读
		ByteBuffer buffer = ByteBuffer.allocateDirect((int) fileChannel.size());
		fileChannel.read(buffer);
		buffer.flip();
		CharBuffer charBuffer = Charset.forName("utf-8").decode(buffer);
		file.close();
		BufferedReader bufferedReader = new BufferedReader(new StringReader(charBuffer.toString()));
		String str = null;
		while((str = bufferedReader.readLine()) != null){
			System.out.println(str);
		}
	}
你是要这样?
wannaspring 2012-12-01
  • 打赏
  • 举报
回复
引用 18 楼 wapigzhu 的回复:
什么叫做比BufferedReader慢, 你说的慢是因为平时用的时候,它的底层数据是从FileInputStream里面来的, BufferedReader本身是跟Stream什么都没有关系的, 它只负责操作你给它的数据, 你给它数据的时候慢,当然它给你结果就慢 你把一个内存里面的字符串直接让BufferedReader读,那还会觉得慢?
谢谢,我的意思是和下面代码比,哪个更快? BufferedReader reader = new BufferedReader(new FileReader("test.txt")); reader.readLine(); String line = null; String item[]; for (String line = null; (line = reader.readLine()) != null;) { }
wannaspring 2012-12-01
  • 打赏
  • 举报
回复
引用 15 楼 wapigzhu 的回复:
Java code?? 12345678910111213 public static void main(String[] args) throws IOException { RandomAccessFile file = new RandomAccessFile("1.txt", "r"); FileChannel fileChannel ……
另外想再请教一下,readline 后 怎样以最快的方式判断这一行是否含有比如:“你”,“我”等字符串? 特征是“你”“我”等字符串总是出现在行的比较靠右边的位置,比如 "8457TRGDF","FSAFDFFDF","FSFKJDHFSF","哦你好啊","AA"
wapigzhu 2012-12-01
  • 打赏
  • 举报
回复
什么叫做比BufferedReader慢, 你说的慢是因为平时用的时候,它的底层数据是从FileInputStream里面来的, BufferedReader本身是跟Stream什么都没有关系的, 它只负责操作你给它的数据, 你给它数据的时候慢,当然它给你结果就慢 你把一个内存里面的字符串直接让BufferedReader读,那还会觉得慢?
wannaspring 2012-12-01
  • 打赏
  • 举报
回复
引用 15 楼 wapigzhu 的回复:
Java code?? 12345678910111213 public static void main(String[] args) throws IOException { RandomAccessFile file = new RandomAccessFile("1.txt", "r"); FileChannel fileChannel ……
谢谢,能不能把那个allocatedirect 也就是 direct buffer也包装进去? 谢谢
wannaspring 2012-12-01
  • 打赏
  • 举报
回复
引用 15 楼 wapigzhu 的回复:
Java code?? 12345678910111213 public static void main(String[] args) throws IOException { RandomAccessFile file = new RandomAccessFile("1.txt", "r"); FileChannel fileChannel ……
这样能比BUFFERRADER快吗?如果不能快,就没意思了 文件有1.2G吧
wapigzhu 2012-12-01
  • 打赏
  • 举报
回复

public static void main(String[] args) throws IOException {
		RandomAccessFile file = new RandomAccessFile("1.txt", "r");
		FileChannel fileChannel = file.getChannel();
		ByteBuffer buffer = fileChannel.map(MapMode.READ_ONLY, 0, fileChannel.size());
		CharBuffer charBuffer = Charset.forName("utf-8").decode(buffer);
		file.close();
		BufferedReader bufferedReader = new BufferedReader(new StringReader(charBuffer.toString()));
		String str = null;
		while((str = bufferedReader.readLine()) != null){
			System.out.println(str);
		}
	}
用BufferedReader包装一下就行了, 不过文件大了受不了, 你可以考虑每次读定长, 然后再往后一直读到换行符为止
wannaspring 2012-12-01
  • 打赏
  • 举报
回复
引用 5 楼 AA5279AA 的回复:
楼主用的方法不常用。不评论,发一种常用的方法,可以一行一行的读取。 Java code?? 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 package com.briup.ch11; //第一个……
谢谢,测试了你的第二种方法,很慢,比bufferreader慢3.5倍
wannaspring 2012-12-01
  • 打赏
  • 举报
回复
引用 6 楼 caoniaozhilu 的回复:
直接看java一下BufferedReader中的readLine方法源代码,自己分析一下,就OK了。
怎么个OK了?
平凡_幸福 2012-12-01
  • 打赏
  • 举报
回复
引用 6 楼 caoniaozhilu 的回复:
直接看java一下BufferedReader中的readLine方法源代码,自己分析一下,就OK了。
同意
wannaspring 2012-12-01
  • 打赏
  • 举报
回复
引用 7 楼 AA5279AA 的回复:
另外FileInputStream这个流貌似不提供定位的功能。 分批读取的意思是一次读取一部分,这样多线程读取大数据量的信息是么? 如果那样的需要用到 PipedInputStream PipedOutputStream 管道流,记得还有一个是可以定位读取的流,临时忘了,帮你查查API吧
是得,不过没打算多线程同时读一个文件,因为是单硬盘 只想1个线程读文件,然后每读10万行,把这10万行内容分发给别的线程处理 比如3个线程好了,一个线程负责读,另外两个线程负责处理
wannaspring 2012-12-01
  • 打赏
  • 举报
回复
引用 8 楼 huntor 的回复:
Java code?? 12345 import java.nio.file.Files; import java.nio.file.Paths; import java.nio.charset.Charset; List<String> lines = Files.readAllLines(Paths.get("D:/Temp", "examples.txt"), Cha……
谢谢,这个我看不懂的
wannaspring 2012-12-01
  • 打赏
  • 举报
回复
引用 5 楼 AA5279AA 的回复:
楼主用的方法不常用。不评论,发一种常用的方法,可以一行一行的读取。 Java code?? 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 package com.briup.ch11; //第一个……
谢谢,第一种方法我测试过,读50M的文本文件大约1.2秒 第二种没用过,更快?
huntor 2012-12-01
  • 打赏
  • 举报
回复
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.charset.Charset;

List<String> lines = Files.readAllLines(Paths.get("D:/Temp", "examples.txt"), Charset.defaultCharset());
加载更多回复(7)
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 ### TDS 2014示波器使用手册知识点总结 #### 一、TDS 1000B 和 TDS 2000B 系列数字存储示波器概述 - **产品系列**: TDS 1000B 和 TDS 2000B 是由 Tektronix 公司所研发并推出的数字存储示波器产品线。 - **功能定位**: 主要致力于为电子工程师以及研发人员提供具备高性能与高精度的信号测量设备。 - **应用领域**: 此类设备被普遍应用于教育机构、研发实验室以及工业生产过程中的测试环节。 #### 二、TDS 2014示波器基本操作与使用 - **开机与基本设置**: - 在启动设备时,必须确保仪器已经正确接地。 - 在使用之前,需要根据观察需求设定合适的屏幕亮度、对比度等显示参数。 - **通道选择与配置**: - 可以通过触摸显示屏或设备前面板上的按钮来选定需要进行的测量通道。 - 可依据实际需求来调整垂直灵敏度、水平时间基准等设置项。 - **触发设置**: - 触发模式包括自动、常态、单次等多种选择。 - 触发源与阈值设定涉及确定触发信号的具体来源及其电压阈值水平。 - **测量与分析功能**: - 提供多种自动测量功能选项,涵盖电压峰峰值、频率等参数的测量。 - 支持对波形进行数学运算,例如执行两个波形的相加或相减操作。 #### 三、TDS 2014示波器高级特性 - **波形捕获率**: - 波形捕获率越高,意味着在检测偶发事件方面的能力越强。 - **波形存储与回放**: - 支持将波形数据存储到内部存储单元或外部存储设备中。 - 用户能够随时调取先前保存的波形数据,以进行深入分析。 - *...
内容概要:本文聚焦2026年高教社杯全国大学生数学建模竞赛B题“无线电干扰源的快速自动定位与清除”,同时整合了多个数学建模与工程技术仿真研究资源,涵盖SEM广告投放策略优化、无人机协同路径规划、电力系统无功优化、微电网调度、负荷预测、电动汽车响应率建模等多个领域。其中重点详述了SEM广告投放策略的系统性建模,构建了从问题诊断、关键词分类、预算优化到不确定性环境下鲁棒决策的完整框架。提出基于成本—效益二维归一化的五类关键词划分方法(黄金词、重点词、潜力词、问题词、无效词),并建立了0-1整数规划与CVaR鲁棒优化模型,实现注册转化最大化与风险控制的平衡。文档还汇集了大量基于Matlab/Simulink的仿真资源,涉及智能优化算法、机器学习、信号处理、路径规划等方向,并配套提供代码与论文支持,形成跨学科的技术资源共享平台。; 适合人群:具备一定数据分析与建模基础,正在准备数学建模竞赛或从事科研工作的本科生、研究生及工程技术人员。; 使用场景及目标:①应用于数学建模竞赛备赛,学习多目标优化、分类模型、鲁棒决策等建模范式;②开展广告投放、电力调度、路径规划等领域的科研项目时借鉴模型构建与算法实现方法;③通过提供的Matlab/Python代码快速复现经典或前沿研究成果,提升科研效率与实践能力。; 阅读建议:此资源集合了多个独立研究主题,建议读者根据自身研究方向选择性阅读,重点关注模型构建逻辑与算法实现细节,并结合所提供的Matlab/Python代码进行实践验证,以加深理解与应用能力。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧