NIO入门之轻松读取大文件
今天同事碰到了一个问题,从游戏服务器下载下来的输出log有一个多G大。用记事本打不开,EditPlus也打不开,都提示文件太大。用word也打不开,提示文件大于512M。打不开怎么查找错误啊。于是他问我解决办法。我想了想,决定写一个简单的程序读取这个log,把这个log切分成一些小的可以用Editplus打开的文本。正好前段时间看了一些NIO的东西,所以决定用NIO来写。没想到,10几行代码就搞定了。下面附上源代码:
ReadLargeTextWithNIO.java
2
3import java.io.FileInputStream;
4import java.io.FileOutputStream;
5import java.io.IOException;
6import java.nio.ByteBuffer;
7import java.nio.channels.FileChannel;
8
9/**
10 *
11 * 用NIO读取大文本(1G以上)
12 *
13 * @author landon
14 *
15 */
16public class ReadLargeTextWithNIO
17{
18 public static void main(Stringargs) throws IOException
19 {
20 FileInputStream fin = new FileInputStream("d:\\temp\\outlineA1.log");
21 FileChannel fcin = fin.getChannel();
22
23 ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024 * 50);
24
25 while(true)
26 {
27 buffer.clear();
28
29 int flag = fcin.read(buffer);
30
31 if(flag == -1)
32 {
33 break;
34 }
35
36 buffer.flip();
37
38 FileOutputStream fout = new FileOutputStream("d:\\temp\\" + Math.random() + ".log");
39 FileChannel fcout = fout.getChannel();
40
41 fcout.write(buffer);
42 }
43 }
44}
45
46
下面简单说几个注意的地方:
a.因为要把超大文本切分成小的部分,所以分配buffer的时候尽量大一些,这里我分配的大小是50M,不过如果太大了,可能会报内存溢出。
b.说一下clear和flip的方法,直接上源码:
2 {
3 position = 0;
4 limit = capacity;
5 mark = -1;
6 return this;
7 }
8
9 public final Buffer flip()
10 {
11 limit = position;
12 position = 0;
13 mark = -1;
14 return this;
15 }
一看便知二者的区别。
c.跳出循环也即读完的判断是read返回的flag是-1
利用NIO确实方便,以后继续研究->NIO网络编程
NIO入门之轻松读取大文件的更多相关文章
- Java多线程读取大文件
前言 今天是五一假期第一天,按理应该是快乐玩耍的日子,但是作为一个北漂到京师的开发人员,实在难想出去那玩耍.好玩的地方比较远,近处又感觉没意思.于是乎,闲着写篇文章,总结下昨天写的程序吧. 昨天下午朋 ...
- Java NIO内存映射---上G大文件处理(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果 ...
- java 分次读取大文件的三种方法
1. java 读取大文件的困难 java 读取文件的一般操作是将文件数据全部读取到内存中,然后再对数据进行操作.例如 Path path = Paths.get("file path&qu ...
- java读取 500M 以上文件,java读取大文件
java 读取txt,java读取大文件 设置缓存大小BUFFER_SIZE ,Config.tempdatafile是文件地址 来源博客http://yijianfengvip.blog.163.c ...
- java 读取txt,java读取大文件
java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File;import java.io.RandomAccessFile;i ...
- PHP如何快速读取大文件
在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...
- java读取大文件
1 多线程 2 java内存映射读取大文件
- php使用file函数、fseek函数读取大文件效率分析
php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接 ...
- PHP读取大文件的几种方法介绍
读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办 ...
随机推荐
- html5--6-24 css3前缀
html5--6-24 css3前缀 学习要点 掌握css3前缀的使用 CSS3目前很多新增属性尚未被W3C列为标准,对这些暂时未被公布为标准的属性,各家浏览器会在属性前加上前缀词,也将其称之为浏览器 ...
- ORACLE 创建表空间及用户
/*创建存放原始数据的表空间*/ create tablespace Djzh_original datafile 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\Djzh_or ...
- 一步一步学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)
述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- Fleck websocket官方事例
Fleck websocket官方事例 server: using Fleck;using System;using System.Collections.Generic;using System.L ...
- ETL的考虑
做数据仓库系统,ETL是关键的一环.说大了,ETL是数据整合解决方案,说小了,就是倒数据的工具.回忆一下工作这么些年来,处理数据迁移.转换的工作倒还真的不少.但是那些工作基本上是一次性工作或者很小数据 ...
- NSString -- UILabel中字体有多种颜色,字符串自动计算高度/换行
一:UILabel中字体有多种颜色 UILabel *label = [[UILabel alloc] init]; label.frame = CGRectMake(, , , ); label.b ...
- AtCoder3857:Median Sum (Bitset优化背包&&对称性求中位数)
Median Sum You are given N integers A1, A2, ..., AN. Consider the sums of all non-empty subsequences ...
- [Selenium] waitUntilAllAjaxRequestCompletes
private static final String JQUERY_ACTIVE_CONNECTIONS_QUERY = "return $.active == 0;"; pri ...
- c++11实现DLL帮助类
用过DLL的人都会发现,在C++中调用dll中的函数有点繁琐,调用过程如下:在加载dll后还要定义一个对应的函数指针类型,接着调用GetProcAddress获取函数地址,再转成函数指针,最后调用函数 ...
- ML 徒手系列说明
徒手系列正确打开方式: 1.徒手撸公式 2.徒手撸代码