java大文件读取(java大文件读取内存溢出)
华为云服务器特价优惠火热进行中! 2核2G2兆仅需 38 元;4核4G3兆仅需 79 元。购买时间越长越优惠!更多配置及优惠价格请咨询客服。
合作流程: |
本篇文章给大家谈谈java大文件读取,以及java大文件读取内存溢出对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
微信号:cloud7591如需了解更多,欢迎添加客服微信咨询。
复制微信号
本文目录一览:
- 1、java读取大文件内存溢出怎么解决
- 2、java读取大文件怎么解决页面加载速度慢
- 3、JAVA读取文件夹大小的几种方法实例
- 4、Java中如何高效的读取大文件
- 5、Java 读取大文件有什么可以优化的吗
- 6、解决java读取大文件内存溢出问题,如何在不
java读取大文件内存溢出怎么解决
我有一迅雹瞎个csv文件,大约有80多万条记录,用下面的代码读取时亩空,一般读到70多万条记录时就出肆悄现内存溢出问题。求各位好人给出解决方法,感激不尽!!! public DataCSV(String fileName) throws Exception { File file = new File(fileName); fis = new B...展开
错误如下:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.init(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at com.zyx.lab2.DataCSV.init(DataCSV.java:29)
at com.zyx.lab2.DataCSV.main(DataCSV.java:136)
29行是while循环那一行

java读取大文件怎么解决页面加载速度慢
下面是API文档上摘下来的:
java.io类RandomAccessFile
java.lang.Object
??java.io.RandomAccessFile
所有已实现的接口:
Closeable, DataInput, DataOutput
--------------------------------------------------------------------------------
public class RandomAccessFileextends Objectimplements DataOutput, DataInput, Closeable此类的实例支持对随机存取文件的读取和写入。随机存取文件的行为类似存储在文件系统中的一个大型字节数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机存取文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException。从以下版本开始:JDK1.0
JAVA读取文件夹大小的几种方法实例
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
public class Test {
public static void main(String[] args) throws Exception {
String searchStr = "APPTYPEID";
File searchDir = new File("D:\\xampp\\htdocs\\discuz"迹租亏);
ListSearch list = new ArrayListSearch();
CollectionFile files = FileUtils.listFiles(searchDir, null, true);
List型运String lines = null;
for (File file : files) {
lines = FileUtils.readLines(file);
for (int i = 0; i lines.size(); i++) {
if (lines.get(i).indexOf(searchStr) != -1) {
Search s = new Search();
s.setFilename(file.getName());
s.setLine(i + 1);
s.setContent(lines.get(i));
list.add(s);
}
}
}
StringBuffer sb = new StringBuffer();
for (Search s : list) {
sb.append(s.getFilename() + " , " + s.getLine() + " , " + s.getContent()).append(
IOUtils.LINE_SEPARATOR);
}
FileUtils.writeStringToFile(new File("D:\姿神\search.txt"), sb.toString(), "UTF-8");
}
}
class Search {
private String filename;
private int line;
private String content;
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public void setLine(int line) {
this.line = line;
}
public int getLine() {
return line;
}
}
Java中如何高效的读取大文件
读取文件行的标准方式是在内存中读取陆滑,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:
Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));
这种方法带来的问题是文件的所腊宴有行都被存放在内存中,当文件足够大时很快就会导致程早局腊序抛出OutOfMemoryError 异常。
Java 读取大文件有什么可以优化的吗
优化一:采用内存硬盘(RamDisk)
内存硬盘可以极大地提高文件的读写速度,行情的读写是应用内存硬盘的绝好情况:
1,可以把行情小站的行情文件地址配置在内存硬盘上。这样可以加速行情小站写文件的速度。
2,本系统再从内存硬盘读取,又可以加快读取速度。
3,内存硬盘掉电后会丢失文件,这里基本不在乎这个缺点,因为渣耐行情文件本来就是临时的,如果有持久化的需要,大部分内存硬盘也支持持久化的功能。
优化二:禅梁中采用JNotify,用通知替代轮询
由于行情小站会不断的更新行情dbf文件,系统需要探测到一旦行情文件被更新,就立即读取。传统的策略是不断轮询行情文件的状态,如果发现行情文件的最后修改日期(或者再加上文件大小)改变时,就认为文件被更新。但是这种方式既低效,时延又高且不稳定。假设即使把轮询时间设置为10ms一次(这意味着1秒钟就要轮询100次), 平均时延也要5ms。
JNotify库支持Windows,Linux和MacOS,允许监视一个文件夹,当这个文件夹下的文件被增删改时,发起回调通知。代码示例如下:
以上代码:
1,只要监视文件修改,因此只要设置mask = JNotify.FILE_MODIFIED
2,不需要递归地监视子目录,设置watchSubtree = false
3,由于监视的是文件夹,而不是文件,在fileModified方法中,要判断修改的是不是关心的文件(即行情文件),如果不是,则忽略。如果是,就调用readHangqingFile开始读取。
JNotify是基于贺山操作系统API实现的,即使用JNI实现的,因此除了jar文件,还包含.dll文件和.so文件。用eclipse开发时,需要指定这些本地库的目录,如下图所示:
部署时,需要将本地库放在执行根目录下,或者用-Djava.library.path=/native/library/path 指定本地库的位置。
采用JNotify,用(基于操作系统的)通知而不是轮询,可以非常快地发现文件被更新,根据测试时间1ms (我觉得应该远小于1ms,但是由于文件修改时间单位是毫秒,没办法更精确的测量)。
解决java读取大文件内存溢出问题,如何在不
1、传统的在内存中读取
读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:
这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。
例如:读取一个大约1G的文件:
这种方式开始时只占用很少的内存:纤镇(大约消耗了0Mb内存)
然而,当文件全部毁漏粗读到内存中后,我们最后可以看到(大约消耗了2GB内存):
这意味这一过程大约耗费了2.1GB的内存——原因很简单:现在文件的所有行都被存储在内存中。
把文件所有的内容都放在内存中很快会耗尽可用内存——不论实际可用内存有多大,这点是显而易见的。
此外,我们通常不需要把文件的搜搏所有行一次性地放入内存中——相反,我们只需要遍历文件的每一行,然后做相应的处理,处理完之后把它扔掉。所以,这正是我们将要做的——通过行迭代,而不是把所有行都放在内存中。
2、文件流
现在让我们看下这种解决方案——我们将使用Java.util.Scanner类扫描文件的内容,一行一行连续地读取:
这种方案将会遍历文件中的所有行——允许对每一行进行处理,而不保持对它的引用。总之没有把它们存放在内存中:(大约消耗了150MB内存)
3、Apache Commons IO流
同样也可以使用Commons IO库实现,利用该库提供的自定义LineIterator:
由于整个文件不是全部存放在内存中,这也就导致相当保守的内存消耗:(大约消耗了150MB内存)
4、结论
这篇短文介绍了如何在不重复读取与不耗尽内存的情况下处理大文件——这为大文件的处理提供了一个有用的解决办法。
关于java大文件读取和java大文件读取内存溢出的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
