java100m大文件读取|java 读取大容量文件内存溢出怎么分段读取(按一定容量读取)

㈠ java 读取大文件时怎么样才能加快速度

可以试试RandomAccessFile 随机输入流类下面是API文档上摘下来的:java.io 类 RandomAccessFilejava.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 如何“快速”读取 100M 的TXT文件,求代码,别整虚的

提示一下 用缓冲流bufferedreader(new FileReader(new File(filepathStr))) 比字节流效率上要快将近1000倍这个说的“你可以按行来读取,然后当达到一定的行数时,调用写的方法,一边读一边写其实并不是很快”是个很好的思路还有如果向第一个回答的用字节流来读的话,要注意设置字符编码,否则会有乱码的可能不会的话 在找我 我在给你做Demo

㈢ java读取文件的文件大小有限制吗

按常理来说是没有限制的,但这个看你的硬件,还有java虚拟机的内存配置,一般100M朝上就有点困难了。注:当然了,我的电脑比较次

㈣ 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 { path = "你要读的文件的路径";RandomAccessFile br=new RandomAccessFile(path,"rw");//这里rw看你了。要是之都就只写rString 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();}}

㈤ 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); }}

㈥ java 读取大容量文件,内存溢出怎么按几行读取,读取多次。

将文件一次性全部读入内存中本来就是一种极其危险和蹩脚的操作,应该立刻给予纠正才对否则以后如果程序扩大3倍,文件也跟着扩大3倍?java 读取一个巨大的文本文件既能保证内存不溢出又能保证性能参考

㈦ JAVA如何读取大容量TXT文件

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

㈧ 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); } }}

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

读取文复件行的标准方式是在内存制中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。

㈩ 怎样使用Java处理大文件

以下将从常规方法谈起,通过对比来说明应该如何使用java读取大文件。1、常规:在内存中读取读取文件行的标准方式是在内存中读取,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内存)然而,当文件全部读到内存中后,我们最后可以看到(大约消耗了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 exceptionsif (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内存)


赞 (0)