A. 如何利用java高效读取大文件

可以使用BufferedReader解决高效读取大文件:
具体如下:

例如:BufferedReader br = new BufferedReader(newInputStreamReader(inputStream)

B. java中有没有 读取大文本文件(500MB以上),指定行数的某一行数据的类库 有的话请给出教程,谢谢~

解决这种问题,
简单说,设那个大文件为big.txt
写一个程序生成一个big.idx数据文件,记录big.txt每一行的结束位置+1,每个位置用long类型存储。
比如得到数据内容(非文本):
[10][22][34][84] ....[2345312].....[50000000]
扫描一遍,生成这500MB的长度文件,比如有10万行,这个big.idx文件就有800KB左右。
就根据big.idx可以查找指定行数了,比如查第1234行
已知一个long占8个字节,打开
第1234行的起始位置的存储位置p=(1234-2)*8=9856
第1234行的长度len的位置lp=(1234-1)*8=9864
寻道big.idx的p处,在p处读取一个long为pos
寻道big.idx的lp处,在p处读取一个long为npos
pos中就记录big.txt中第1234行的起始位置
该行长度len=npos-pos;
打开big.txt,查找pos位置,读len个字节,转换成字符串,
就读出了指定的1234行
把这个不大的big.idx的内容整理到内存中间,读取速度更快。

引经据典说,以上属于数据库基础的ISAM方法。

C. JAVA如何读取大容量TXT文件

java读取txt文件内容。可以作如下理解:
首先获得一个文件句柄。File file = new File(); file即为文件句柄。两人之间连通电话网络了。接下来可以开始打电话了。
通过这条线路读取甲方的信息:new FileInputStream(file) 目前这个信息已经读进来内存当中了。接下来需要解读成乙方可以理解的东西
既然你使用了FileInputStream()。那么对应的需要使用InputStreamReader()这个方法进行解读刚才装进来内存当中的数据
解读完成后要输出呀。那当然要转换成IO可以识别的数据呀。那就需要调用字节码读取的方法BufferedReader()。同时使用bufferedReader()的readline()方法读取txt文件中的每一行数据哈。

D. java怎样读取大文件

读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:

Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));

这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。
例如:读取一个大约1G的文件:

@Testpublic void givenUsingGuava_whenIteratingAFile_thenWorks() throws IOException { String path = ... Files.readLines(new File(path), Charsets.UTF_8);}

这种方式开始时只占用很少的内存:(大约消耗了0Mb内存)

[main] INFO org.baelng.java.CoreJavaIoUnitTest - Total Memory: 128 Mb[main] INFO org.baelng.java.CoreJavaIoUnitTest - Free Memory: 116 Mb

然而,当文件全部读到内存中后,我们最后可以看到(大约消耗了2GB内存):

[main] INFO org.baelng.java.CoreJavaIoUnitTest - Total Memory: 2666 Mb[main] INFO org.baelng.java.CoreJavaIoUnitTest - Free Memory: 490 Mb

这意味这一过程大约耗费了2.1GB的内存——原因很简单:现在文件的所有行都被存储在内存中。
把文件所有的内容都放在内存中很快会耗尽可用内存——不论实际可用内存有多大,这点是显而易见的。
此外,我们通常不需要把文件的所有行一次性地放入内存中——相反,我们只需要遍历文件的每一行,然后做相应的处理,处理完之后把它扔掉。所以,这正是我们将要做的——通过行迭代,而不是把所有行都放在内存中。

E. 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();
}

}

F. 怎样使用Java处理大文件

以下将从常规方法谈起,通过对比来说明应该如何使用java读取大文件。

1、常规:在内存中读取
读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:
Files.readLines(new File(path), Charsets.UTF_8);
FileUtils.readLines(new File(path));
这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。
例如:读取一个大约1G的文件:
@Test
public void givenUsingGuava_whenIteratingAFile_thenWorks() throws IOException {
String path = ...
Files.readLines(new File(path), Charsets.UTF_8);
}
这种方式开始时只占用很少的内存:(大约消耗了0Mb内存)
然而,当文件全部读到内存中后,我们最后可以看到(大约消耗了2GB内存):
这意味这一过程大约耗费了2.1GB的内存——原因很简单:现在文件的所有行都被存储在内存中。
把文件所有的内容都放在内存中很快会耗尽可用内存——不论实际可用内存有多大,这点是显而易见的。
此外,我们通常不需要把文件的所有行一次性地放入内存中——相反,我们只需要遍历文件的每一行,然后做相应的处理,处理完之后把它扔掉。所以,这正是我们将要做的——通过行迭代,而不是把所有行都放在内存中。

2、文件流
FileInputStream inputStream = null;
Scanner sc = null;
try {
inputStream = new FileInputStream(path);
sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine()) {
String line = sc.nextLine();
// System.out.println(line);
}
// note that Scanner suppresses exceptions
if (sc.ioException() != null) {
throw sc.ioException();
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (sc != null) {
sc.close();
}
}
这种方案将会遍历文件中的所有行——允许对每一行进行处理,而不保持对它的引用。总之没有把它们存放在内存中:(大约消耗了150MB内存)

3、Apache Commons IO流
同样也可以使用Commons IO库实现,利用该库提供的自定义LineIterator:
LineIterator it = FileUtils.lineIterator(theFile, "UTF-8");
try {
while (it.hasNext()) {
String line = it.nextLine();
// do something with line
}
} finally {
LineIterator.closeQuietly(it);
}
由于整个文件不是全部存放在内存中,这也就导致相当保守的内存消耗:(大约消耗了150MB内存)

G. Java中如何高效的读取大文件

读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:

Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));
这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。

H. java如何读取大容量的txt文件

package com.campu;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;

/**
* @author 码农小江
* H20121012.java
* 2012-10-12下午11:40:21
*/
public class H20121012 {
/**
* 功能:Java读取txt文件的内容
* 步骤:1:先获得文件句柄
* 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取
* 3:读取到输入流后,需要读取生成字节流
* 4:一行一行的输出。readline()。
* 备注:需要考虑的是异常情况
* @param filePath
*/
public static void readTxtFile(String filePath){
try {
String encoding="GBK";
File file=new File(filePath);
if(file.isFile() && file.exists()){ //判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file),encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bufferedReader.readLine()) != null){
System.out.println(lineTxt);
}
read.close();
}else{
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}

}

public static void main(String argv[]){
String filePath = "L:\\Apache\\htdocs\\res\\20121012.txt";
// "res/";
readTxtFile(filePath);
}

}

I. Java 读取大文件有什么可以优化的吗

优化一:采用内存硬盘(RamDisk)

内存硬盘可以极大地提高文件的读写速度,行情的读写是应用内存硬盘的绝好情况:

1,可以把行情小站的行情文件地址配置在内存硬盘上。这样可以加速行情小站写文件的速度。

2,本系统再从内存硬盘读取,又可以加快读取速度。

3,内存硬盘掉电后会丢失文件,这里基本不在乎这个缺点,因为行情文件本来就是临时的,如果有持久化的需要,大部分内存硬盘也支持持久化的功能。

优化二:采用JNotify,用通知替代轮询

由于行情小站会不断的更新行情dbf文件,系统需要探测到一旦行情文件被更新,就立即读取。传统的策略是不断轮询行情文件的状态,如果发现行情文件的最后修改日期(或者再加上文件大小)改变时,就认为文件被更新。但是这种方式既低效,时延又高且不稳定。假设即使把轮询时间设置为10ms一次(这意味着1秒钟就要轮询100次), 平均时延也要5ms。

JNotify库支持Windows,Linux和MacOS,允许监视一个文件夹,当这个文件夹下的文件被增删改时,发起回调通知。代码示例如下:

部署时,需要将本地库放在执行根目录下,或者用-Djava.library.path=/native/library/path指定本地库的位置。

采用JNotify,用(基于操作系统的)通知而不是轮询,可以非常快地发现文件被更新,根据测试时间<1ms (我觉得应该远小于1ms,但是由于文件修改时间单位是毫秒,没办法更精确的测量)。