9
回答
java如何读取20多G的txt文档
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
我现在想读取20多g的日志文件用java 用了很多方法都不行 缓冲也不行 有木有人解决过这个问题啊!!!求助啊!
	   URL url=new URL(strUrl); 
	   BufferedReader br=new BufferedReader(new InputStreamReader(url.openStream(),"utf-8"),6*1024*1024); 
	   String s=""; 
	   StringBuffer sb=new StringBuffer(""); 
	   while((s=br.readLine())!=null) 
	   {     
	    System.out.println(s+"\r\n");    
	   } 
	   br.close();
//这样不行 不知道加了缓冲还是不行




	public static String fff = "C:/xxxx/xxxx.log";
	public static void main1(String[] args) throws Exception {
		final int BUFFER_SIZE = 0x300000;
		File f = new File(fff);
				MappedByteBuffer inputBuffer = new RandomAccessFile(f, "r").getChannel().map(FileChannel.MapMode.READ_ONLY,
		        f.length() / 2, f.length() / 2);
		byte[] dst = new byte[BUFFER_SIZE];
		long start = System.currentTimeMillis();
		for (int offset = 0; offset < inputBuffer.capacity(); offset += BUFFER_SIZE) {
			if (inputBuffer.capacity() - offset >= BUFFER_SIZE) {
				for (int i = 0; i < BUFFER_SIZE; i++)
					dst[i] = inputBuffer.get(offset + i);
			} else {
				for (int i = 0; i < inputBuffer.capacity() - offset; i++)
					dst[i] = inputBuffer.get(offset + i);
			}
			int length = (inputBuffer.capacity() % BUFFER_SIZE == 0) ? BUFFER_SIZE : inputBuffer.capacity()
			        % BUFFER_SIZE;
			System.out.println(new String(dst, 0, length));// new
					}
		long end = System.currentTimeMillis();
		
	}

	public static void main(String[] args) throws Exception {
		int bufSize = 1024;
		byte[] bs = new byte[bufSize];
		ByteBuffer byteBuf = ByteBuffer.allocate(1024);
		FileChannel channel = new RandomAccessFile(fff, "r").getChannel();
		while (channel.read(byteBuf) != -1) {
			int size = byteBuf.position();
			byteBuf.rewind();
			byteBuf.get(bs); 			System.out.print(new String(bs, 0, size));
			byteBuf.clear();
		}
	}

	public static void main2(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new FileReader(fff));
		String line = null;
		while ((line = br.readLine()) != null) {
			System.out.println(line);
		}
	}

//这个方法也不行 怎么解决啊 无助啊!

举报
stevenliu
发帖于5年前 9回/7K+阅
共有9个答案 最后回答: 5年前

引用来自“BarryWey”的答案

试试NIO读写啊,传统的IO读写肯定会出问题,在FAT32分区下单个文件超过2G貌似都会出问题,别说你那20G的怪兽呢。

 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
 *
 * 用NIO把20g的文件分割开 生成到temp文件里
 * 然后再用传统的方法去读取每一个小文件
 */
public class ReadLargeTextWithNIO
{
 public static void main(String args[]) throws IOException
 {
  FileInputStream fin = new FileInputStream("C:\\TDDOWNLOAD\\query.log.td");
  FileChannel fcin = fin.getChannel();
  ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024 * 50);
  while(true)
  {
   buffer.clear();
   int flag = fcin.read(buffer);
   if(flag == -1)
   {
    break;
   }
   buffer.flip();
   FileOutputStream fout = new FileOutputStream("d:\\temp\\" + Math.random() + ".log");
   FileChannel fcout = fout.getChannel();
   fcout.write(buffer);
   System.out.println(buffer);
  }
 }
}

--- 共有 4 条评论 ---
hopana回复 @stevenliu : 可以贴出代码看看么,分享分享 2年前 回复
hopana建立一个索引是什么意思? 2年前 回复
stevenliu@BarryWey 嗯 嗯 终于解决了 也有个办法就是建立一个索引! 5年前 回复
BarryWey原来已经在这里了,不错呀。 5年前 回复
试试NIO读写啊,传统的IO读写肯定会出问题,在FAT32分区下单个文件超过2G貌似都会出问题,别说你那20G的怪兽呢。
--- 共有 4 条评论 ---
一号男嘉宾FAT32的话,单个文件不能超过4G的。 5年前 回复
PYPlusfat是不能超过4G吧? 5年前 回复
stevenliu谢谢了亲 解决方案找到了 用nio分割日志文件 然后再去读取所有文件输出数据 谢谢啦!不过文件有点多了 呵呵 5年前 回复
stevenliu好的 谢谢 我试试 先 用了缓冲也不行 5年前 回复
有没有想过会出现20多G的日志文件本身就是系统上设计的问题呢?:)
--- 共有 1 条评论 ---
stevenliu这个是失误 n年前元老做的 后来就没改 导致生产那么大的文件 之后没办法 想分析日志 就倒霉了! 5年前 回复
你电脑内存多大?
--- 共有 3 条评论 ---
stevenliu现在关键是读取都费劲!!! 只能用分割了!!!暂时没找到好的其他办法 5年前 回复
喜之郎读一部分处理一部分啊。如果非要作整个数据的分析处理,可以读出来,然后保存到数据库再利用数据库处理。 5年前 回复
stevenliu3g 的内存 jdk虚拟机 没加! 5年前 回复
这个在windows下实在是太难处理了,先分割成n块然后再逐个解析才行。如果在linux下用awk,sed神马的方便死了,还快的不行。
--- 共有 1 条评论 ---
stevenliu可以对大数据操作嘛?你说的这个 我没用过 呵呵!! 5年前 回复

楼上上,就因为linux上面有这些工具,就说Windows系统不行?要是哪天Windows上面出现了人工智能,你是不是又要说

"这个在linux下实在是太难处理了,还得用awk,sed这些工具,在Windows上面,我只要眨眨眼神就搞定了,哦,还快的不行"...

真搞不懂,你竟然用工具软件的好坏来评定操作系统...

--- 共有 3 条评论 ---
stevenliu@徐斌 呵呵 嗯! 5年前 回复
铂金小马回复 @stevenliu : 所以才不能用某些软件来评判操作系统呀 5年前 回复
stevenliu不是的 比如backtrack 5里面出了很多安全测试软件 但是windows 就没有那么多 但是用户体验度 大人群来说 windows有的 linux也没有 这个……!!! 5年前 回复
顶部