- 浏览: 2095003 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (366)
- hadoop (91)
- DB (2)
- vmware (0)
- python (49)
- Java (72)
- Linux (57)
- 多线程 (2)
- hive (1)
- hbase (3)
- mongodb (5)
- Hibernate (3)
- nodejs (1)
- 模式与重构 (1)
- 持续集成CI (4)
- Mysql (2)
- chorme (1)
- 软件开发 (0)
- 敏捷 (5)
- maven (3)
- windows (7)
- 测试驱动 (1)
- scala (3)
- Jetty (0)
- android (1)
- eclipse (1)
- 设计模式 (1)
- 面向对象设计 (2)
- oracle (3)
- cassandra (15)
- pig (3)
- rails (1)
- redis (4)
- ruby (1)
- storm (0)
- 实时运算 (3)
- scribe (1)
- hadoop源码 (3)
- cassandra jna (1)
- Kafka (2)
- Sublime (2)
- C++ (2)
- C (1)
- 版本控制 (1)
- 服务器 (1)
- docker (0)
- flink (1)
最新评论
-
伍大都督:
解释太到位了,感谢分享
理解Linux系统中的load average(图文版) -
rfjian123:
非常感谢,用你的方法解决了问题。
Server sent unexpected return value (403 Forbidden) in response to OPTIONS -
yuhaifei12:
今天遇到同样的问题了。设置的是每分钟执行一次。结果发现每分钟执 ...
解决Linux下crontab同一时间重复执行问题 -
BigBird2012:
想问一下,使用ExecutorService每次都要调用 sh ...
spring quartz使用多线程并发“陷阱” -
zhuqx1130:
有用,谢谢
解决Sublime Text 3中文显示乱码(tab中文方块)问题
下面代码使用两种方式读取日志文件,一种是流方式,一种是内存映射:
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.nio.CharBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.util.Scanner; import java.util.zip.GZIPInputStream; public class Test { static String path = "D:\\log\\proclog\\loganalysis\\0108161331_CHN-MY-1_1021235501.log"; public static void main(String[] s) throws IOException { stream(); mem(); } public static void stream() throws FileNotFoundException, IOException { Long startTime = System.currentTimeMillis(); BufferedReader reader = getReader(new File(path)); String line; while ((line = reader.readLine()) != null) { // 空转 } Long estimatedTime = System.currentTimeMillis() - startTime; System.out.printf("stream Diff: %d ms\n", estimatedTime); } public static BufferedReader getReader(File f) throws FileNotFoundException, IOException { BufferedReader reader = null; if (f.getName().endsWith(".gz")) { reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(f)))); } else { reader = new BufferedReader(new InputStreamReader(new FileInputStream(f))); } return reader; } public static void mem() throws IOException { Long startTime = System.currentTimeMillis(); FileChannel fc = new FileInputStream(path).getChannel(); MappedByteBuffer byteBuffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()); //Charset charset = Charset.forName("US-ASCII"); Charset charset = Charset.forName("iso-8859-1"); CharsetDecoder decoder = charset.newDecoder(); CharBuffer charBuffer = decoder.decode(byteBuffer); Scanner sc = new Scanner(charBuffer).useDelimiter(System.getProperty("line.separator")); while (sc.hasNext()) { sc.next(); } fc.close(); Long estimatedTime = System.currentTimeMillis() - startTime; System.out.printf("mem Diff: %d ms", estimatedTime); } }
输出:
stream Diff: 147 ms
mem Diff: 2470 ms
mem Diff: 2470 ms
从输出来看流方式要远远快于内存映射读取,看来逐行读取文本还是继续使用steam api吧。
PS. 测试文件大小23MB,使用一个100MB的文件,mem方式报内存溢出,有点尴尬,先做个记号吧。
参考:
http://hi.baidu.com/limin040206/blog/item/92763dfcd301ff0008244d48.html
http://jiangzhengjun.iteye.com/blog/515745
http://stackoverflow.com/questions/1045632/bufferedreader-for-large-bytebuffer
-- end --
评论
7 楼
cyb_rc
2013-11-18
PS. 测试文件大小23MB,使用一个100MB的文件,mem方式报内存溢出,有点尴尬,先做个记号吧。
至于这个,mem默认大小是跟堆的大小一样,可以自己设置mem大小
至于这个,mem默认大小是跟堆的大小一样,可以自己设置mem大小
6 楼
cyb_rc
2013-11-18
至于这个
PS. 测试文件大小23MB,使用一个100MB的文件,mem方式报内存溢出,有点尴尬,先做个记号吧。
PS. 测试文件大小23MB,使用一个100MB的文件,mem方式报内存溢出,有点尴尬,先做个记号吧。
5 楼
cyb_rc
2013-11-18
映射方式 输出的地方时间消耗太大
映射文件 速度比流快很多,文件越大越明显
映射文件 速度比流快很多,文件越大越明显
4 楼
test_lockxxx
2012-02-08
我估计卡在这里:
Scanner sc = new Scanner(charBuffer).useDelimiter(System.getProperty("line.separator"));
Scanner sc = new Scanner(charBuffer).useDelimiter(System.getProperty("line.separator"));
3 楼
test_lockxxx
2012-02-08
拿 BufferedReader 与 MappedByteBuffer 相比,这本身就不公平。
至少也应该拿 BufferedInputStream 与 MappedByteBuffer 相比。
至少也应该拿 BufferedInputStream 与 MappedByteBuffer 相比。
2 楼
heipark
2011-10-18
lindakun 写道
请问楼主,逐行读取有没有更快的方法呢?
到目前为止除了BufferedReader,我不知道用其它了,这块sun/oracle已经做过优化,踏实用吧,如果还有问题,或许要转变解决问题的思路。
1 楼
lindakun
2011-09-29
请问楼主,逐行读取有没有更快的方法呢?
发表评论
-
shell下使用log4j 1.x “No appenders could be found for logger”问题两个处理办法
2018-05-25 23:25 1640错误: log4j:WARN No appenders c ... -
通过java class文件确定其编译器版本
2016-06-23 10:45 1074方法一: hexdump -C XXX.class ... -
字符编码笔记:ASCII,Unicode和UTF-8(转)
2014-11-06 17:29 1237今天中午,我突然想搞 ... -
Server sent unexpected return value (403 Forbidden) in response to OPTIONS
2014-10-10 15:01 5553之前用的好好的,忽然某天再次svn up时候就报下面的错误: ... -
netbeans下优秀sublinme主题
2014-09-29 10:13 3631推荐站点:http://netbeansthemes.com ... -
将netbeans项目放到jenkins上做持续集成
2014-07-25 15:20 1230netbeans项目本质是通过ANT来管理的,只不 ... -
关于jvm中Xmx参数默认值
2014-05-08 09:19 2014我的机器win7 64bit 8GB内存,通过jconso ... -
Eclipse代码自动完成功能无法使用问题记录
2014-04-28 10:15 1139使用Alt+/无法补齐Java代码,现象时没有反应。解决方 ... -
thrift0.9.1简单教程(包含Java服务端和Java、python客户端)
2014-04-25 15:55 6404一、Thrift Java服务端和客户端 官 ... -
使用sublime text3开发scala
2014-04-04 16:49 3761打开菜单栏Tool->build system-> ... -
netbeans下打开本地文件夹插件(explorer)
2014-04-02 14:44 20281. 在线安装 工具->插件->可用插 ... -
关闭Sublime自动更新
2014-03-09 21:42 835每次启动都提示更新,可以关闭它。 找到Prefere ... -
使用log4j.properties配置slf4j输出LOG
2014-01-09 08:57 6647完成配置需要以下文件: slf4j-log4j12-x ... -
正确使用java -cp通配符
2013-11-21 17:05 10185JDK6支持java -cp后面跟通配符'*',试了一下发 ... -
强制Java使用东八时区方法
2013-11-15 15:37 1834今天线上有台服务器时区错误,导致很多使用new Da ... -
谨慎使用java的PrintWriter类
2013-10-23 12:31 1362public void test() throws Fil ... -
记录Java ShutdownHook
2013-08-30 11:40 1071public class TestMe { stat ... -
eclipse + maven + jetty + spring web 开发环境简要笔记
2013-08-27 11:25 1608环境准备 确保安装maven3 确保安装eclip ... -
Eclipse(IDE for Java Developers)、maven、jetty、spring web集成
2013-08-27 08:53 0方法一: http://wiki.eclipse.o ... -
关于数据压缩
2013-08-23 14:26 1132常用压缩 quicklz zlib snappy/ ...
相关推荐
- Java的`MappedByteBuffer`类允许将文件映射到内存,使得文件操作如同访问内存一样快速,适合处理大型文件。 9. **大数据量文件读取策略** - **分块读取**:对于大文件,不一次性加载到内存,而是按需分块读取。...
在Java中,没有内置的库来直接处理Ini文件,但我们可以利用Java的I/O流和字符串处理功能来实现读取Ini文件的功能。下面将详细介绍如何在Java中读取Ini文件。 首先,我们需要了解Ini文件的基本结构。Ini文件由多个节...
在处理大数据量的文本文件时,Java 提供了多种方式来实现高效、低内存占用的文件读取操作。本文将围绕标题“java读取超大文本文件”及其相关描述和部分代码片段进行深入解析,探讨如何有效地读取大型文本文件。 ###...
这段代码将映射整个文件到内存,然后逐字节读取。 这些方法各有优缺点,开发者应根据实际需求选择最合适的读取方式。例如,字节流适合二进制文件,字符流适合文本文件,而NIO则适用于大文件和高并发场景。理解这些...
### jsp+java类+servlet实现文件读取、写入的功能 #### 一、概述 在Web开发领域,特别是基于Java的技术栈中,文件的读取与写入是一项基础但非常重要的功能。本文将详细介绍如何利用JSP、Java类以及Servlet技术在...
本篇将深入探讨如何在Java中读取和操作INI文件,以及相关工具的使用。 首先,Java标准库并没有直接支持读写INI文件的API,因此我们需要依赖第三方库或者自定义方法来实现这一功能。在给定的链接中,博主提供了有关...
5. **内存映射文件**:Java的`MappedByteBuffer`实现了内存映射文件功能,它将文件的部分或全部映射到进程的虚拟内存空间,使得可以直接通过内存访问文件,避免了I/O操作。但是需要注意,如果文件过大,可能会导致...
- 文件映射可能导致内存占用增加,尤其是在处理大文件时,因此需要权衡内存使用和性能提升之间的平衡。 总的来说,上述代码提供了一个自定义的NIO解决方案来按行读取文件,尽管Java NIO本身并不直接支持这个功能。...
`Files.lines()`方法可以创建一个文件行的流,便于使用流式操作。 ```java try (Stream<String> lines = Files.lines(Paths.get("largefile.txt"))) { lines.forEach(System.out::println); } ``` Spliterator...
`java.nio`包下的`FileChannel`和`Files`类提供了更高级的文件操作,如映射内存到文件(MMap),以及异步文件操作。 例如,使用`Files`类移动文件: ```java Path sourcePath = Paths.get("sourceFile.txt"); Path...
在项目`java1.java`和`java2.java`中,可能分别实现了读取文件和处理数据的不同部分,或者对原始代码进行了优化或功能扩展。通过分析这些文件,你可以深入理解如何在实际项目中处理CSV数据,以及如何构建一个简单的...
- **FileReader**与**InputStreamReader**:两者结合使用,可以以字符流的方式读取文件,FileReader用于处理字符流,InputStreamReader处理字节流。 2. **二进制文件读取**: - **FileInputStream**:Java的...
本文将详细介绍如何使用Java来读取和写入TXT文件,通过一个简单的实例来帮助理解这个过程。 首先,我们需要引入相关的Java IO类库,这包括`File`、`InputStreamReader`、`BufferedReader`、`FileOutputStream`、`...
5. **FileChannel**:`java.nio.channels.FileChannel`接口提供了一种更高效的方式处理文件,支持大块数据的传输和内存映射。`transferTo()`和`transferFrom()`方法可以实现文件间的高效复制。 6. **NIO (New Input...
- 使用Java的`java.io`包中的`FileReader`和`BufferedReader`类来读取文件内容。例如: ```java File file = new File("E:\\work\\json\\xx.json"); FileReader fr = new FileReader(file); BufferedReader br ...
使用`BufferedReader`,我们可以通过`readLine()`方法逐行读取文件,而`Scanner`则提供了更灵活的方式,可以按字符、单词或整行读取。 写入文件时,可以使用`BufferedWriter`或者`PrintWriter`。`BufferedWriter`...
`BufferedReader` 是一个字符流类,用于提高读取文本文件的效率,`readLine()` 方法可以读取文件的一行内容。 12. 对于数据文件进行缓冲输入操作,通常使用 `BufferedInputStream` 类。在题目提供的句子中,下划线...
可以使用`BufferedReader`类来逐行读取文件,对每一行进行分词处理。 2. **分词**:对每一行内容进行分词,可以使用Java的内置字符串操作,如`split()`函数,或者使用第三方库如Apache Lucene的Analyzer进行更复杂的...
除了上述的基本方法,还有高级技术如内存映射文件(Memory-Mapped Files)和异步读取。内存映射文件允许将整个文件映射到进程的虚拟地址空间,简化了大文件处理。异步读取则在多线程和并发环境中提高性能,避免阻塞...
} } }}总结Java实现实时监控文件行尾内容的关键在于使用`java.nio.file.WatchService`接口。这个接口允许我们注册到某个目录,监听文件系统中的事件,比如文件的创建、修改和删除。在这个例子中,我们关注的是文件...