`
放晴览山青
  • 浏览: 3543 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java读取大文本

阅读更多

java读取大文件 超大文件的几种方法 

2013-04-23 14:46:39|  分类: java |  标签:java   |举报 |字号 订阅



java 读取一个巨大的文本文件既能保证内存不溢出又能保证性能 


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class ReadBig {
public static String fff = "C:\\mq\\read\\from.xml";

public static void main1(String[] args) throws Exception {

  final int BUFFER_SIZE = 0x300000;// 缓冲区大小为3M

  File f = new File(fff);

  /**
   *
   * map(FileChannel.MapMode mode,long position, long size)
   *
   * mode - 根据是按只读、读取/写入或专用(写入时拷贝)来映射文件,分别为 FileChannel.MapMode 类中所定义的
   * READ_ONLY、READ_WRITE 或 PRIVATE 之一
   *
   * position - 文件中的位置,映射区域从此位置开始;必须为非负数
   *
   * size - 要映射的区域大小;必须为非负数且不大于 Integer.MAX_VALUE
   *
   * 所以若想读取文件后半部分内容,如例子所写;若想读取文本后1/8内容,需要这样写map(FileChannel.MapMode.READ_ONLY,
   * f.length()*7/8,f.length()/8)
   *
   * 想读取文件所有内容,需要这样写map(FileChannel.MapMode.READ_ONLY, 0,f.length())
   *
   */

  MappedByteBuffer inputBuffer = new RandomAccessFile(f, "r")
    .getChannel().map(FileChannel.MapMode.READ_ONLY,
      f.length() / 2, f.length() / 2);

  byte[] dst = new byte[BUFFER_SIZE];// 每次读出3M的内容

  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
   // String(dst,0,length)这样可以取出缓存保存的字符串,可以对其进行操作

  }

  long end = System.currentTimeMillis();

  System.out.println("读取文件文件一半内容花费:" + (end - start) + "毫秒");

}

public static void main2(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 main(String[] args) throws Exception {
  BufferedReader br = new BufferedReader(new FileReader(fff));
  String line = null;
  while ((line = br.readLine()) != null) {
   System.out.println(line);
  }
}

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("d:\\filename","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();
    }
  }

}







java 读取大容量文件,内存溢出?怎么按几行读取,读取多次。
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;

public class TestPrint {
public static void main(String[] args) throws IOException {
String path = "你要读的文件的路径";
RandomAccessFile br=new RandomAccessFile(path,"rw");//这里rw看你了。要是之都就只写r
String str = null, app = null;
int i=0;
while ((str = br.readLine()) != null) {
i++;
app=app+str;
if(i>=100){//假设读取100行
i=0;
// 这里你先对这100行操作,然后继续读
app=null;
}
}
br.close();
}

}





当逐行读写大于2G的文本文件时推荐使用以下代码
void largeFileIO(String inputFile, String outputFile) {
        try {
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(inputFile)));
            BufferedReader in = new BufferedReader(new InputStreamReader(bis, "utf-8"), 10 * 1024 * 1024);//10M缓存
            FileWriter fw = new FileWriter(outputFile);
            while (in.ready()) {
                String line = in.readLine();
                fw.append(line + " ");
            }
            in.close();
            fw.flush();
            fw.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }







jdk本身就支持超大文件的读写。

网上的文章基本分为两大类,一类是使用BufferedReader类读写超大文件;另一类是使用RandomAccessFile类读取,经过比较,最后使用了前一种方式进行超大文件的读取,下面是相关代码,其实很简单

-------------------------------------------------------------------

File file = new File(filepath);  
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));   
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"utf-8"),5*1024*1024);// 用5M的缓冲读取文本文件 
 
String line = "";
while((line = reader.readLine()) != null){
//TODO: write your business
}
---------------------------------------------------------------------

注意代码,在实例化BufferedReader时,增加一个分配缓存的参数即可
分享到:
评论

相关推荐

    java读取超大文本文件

    ### Java读取超大文本文件的关键技术点 在处理大数据量的文本文件时,Java 提供了多种方式来实现高效、低内存占用的文件读取操作。本文将围绕标题“java读取超大文本文件”及其相关描述和部分代码片段进行深入解析...

    Java 读写文件文本文件的示例

    ### Java读取文本文件 在Java中,读取文本文件通常涉及到使用`InputStream`及其子类如`FileInputStream`,以及`Reader`接口的实现类`BufferedReader`。以下是对读取操作的详细解释: #### 方法一:读取到`...

    java文本读取方法

    ### Java文本读取方法详解 在Java编程语言中,读取文本文件是常见的操作之一,尤其是在处理大量数据或日志文件时。本文将详细介绍四种不同的Java文本读取方法:按字节读取文件内容、按字符读取文件内容、按行读取...

    Java读取TXT文本文件乱码解决方案.doc

    "Java读取TXT文本文件乱码解决方案" Java 读取 TXT 文本文件乱码解决方案中,主要讨论的是在 Java 中读取 TXT 文本文件时出现乱码的问题,并提供了解决方案。 首先,文章中提供了一个简单的读取 TXT 文件的代码,...

    Java多线程读取大文本文件并批量插入MongoDB的实战代码

    Java多线程读取大文本文件并批量插入MongoDB的代码,文本文件,csv文件,可以结合POI改造使其支持excel。 适合做大量文本数据或日志文件入库的场景,大文本被拆分成多个线程处理,速度快。 批量插入MongoDB,存在则...

    java读取txt文本

    java 读取 某目录下的txt文本,同样可以读取log文件

    java 读写文本的方法

    在Java编程语言中,读写文本文件是常见的操作。这里我们详细探讨了四种不同方法来读取文本文件:按字节读取、按字符读取、按行读取以及随机读取。 1. **按字节读取文件内容**: 这种方法通常适用于读取二进制文件...

    java解析各种文本文档

    java可以读取各种文本文档中的内容,也可以操作文本文档(word,excel,pdf,txt等格式的文档)

    java读取文本文件

    下面将详细讲解如何使用Java读取文本文件,包括多种常用的方法和注意事项。 1. 使用`BufferedReader` `BufferedReader`类是Java中用于读取字符流的常用工具,它通过内部缓冲区提高读取效率。以下是一个简单的使用...

    JAVA简单的读写文本文件的代码

    通过上述四个主要部分的分析,我们可以看到Java语言在处理文件读写方面提供了丰富的API支持。使用合适的类库可以极大地简化开发工作并提高程序的性能。例如,使用`StringBuffer`可以有效地处理字符串的动态增长;而`...

    Java大文本txt文件读取的三种方法

    很好的解决大文件读取中需要耗费大量时间的问题,三种方法各异,对不同的文本文件都能较好解决。

    Java解析JSON文本,大数据量工具包

    解决当内存资源不充足时大数据量的JSON文本解析为JSON对象会导致内存溢出的问题。 基于org.json的部分源代码,以及新增的JsonLazyer类。 原理:用时创建的规则降低传统解析器一次性将...大容量JSON文本解析为JSON对象。

    java 逐行读取文本内容

    在Java编程语言中,逐行读取文本内容是一项常见的任务,尤其在处理日志文件、配置文件或进行数据处理时。本篇文章将深入探讨如何在Java中实现这一功能,并结合提供的标签“源码”和“工具”,给出具体的代码示例和...

    文本编辑器(java)

    本文将深入探讨一个基于Java实现的文本编辑器项目,旨在帮助初学者理解如何利用Java进行图形用户界面(GUI)编程,以及如何实现基本的文本编辑功能。 首先,我们要明白Java是一种广泛使用的多平台编程语言,它具有...

    Kmeans文本聚类java实现

    在文件"**textcluster**"中,可能包含了实现这些功能的Java代码,如文本预处理类、KMeans聚类类、数据读取和输出功能等。具体实现细节,例如如何处理稀疏矩阵、如何优化距离计算等,可以通过阅读源代码来了解。 总...

    Java解析FTP服务器文本文件

    Java解析FTP服务器文本文件 Java解析FTP服务器文本文件是指使用Java语言连接FTP服务器,上传、下载、递归目录遍历等基本操作的集合。在这个过程中,我们需要引入相关的jar包,例如cpdetector.jar、jchardet-1.0.jar...

    java读写csv文件,中文乱码问题

    2. **Java读取CSV文件**: - 使用`BufferedReader`和`InputStreamReader`组合,可以指定字符编码读取文件。例如: ```java FileInputStream fis = new FileInputStream("path_to_file.csv"); InputStreamReader ...

    Java读写文本文件的示例代码.rar

    在Java编程语言中,读写文本文件是常见的操作,这对于数据存储、日志记录或配置文件处理至关重要。这个压缩包“Java读写文本文件的示例代码.rar”包含了一些示例代码,帮助开发者理解如何在Java中实现这些功能。下面...

Global site tag (gtag.js) - Google Analytics