A. java 读取 500M文件中间的内容
以下方案切实可行~import java.io.File;import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;public class t { public static void main(String[] args) throws Exception { final int BUFFER_SIZE = 0x300000;// 缓冲去大小为3M File f = new File("C:\\Documents and Settings\\XHY\\桌面\\a.txt"); /** * 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) */ 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)+"毫秒"); }}
B. 关于java读取大文件的问题(本人菜鸟)
提个意见,不一下子将内容全部加载,比如当文件大于3m得时候,你每次只读取3m得内容,当点击下拉条得时候再读取3m得内容,在读取得过程中分段加载,这样可以解决你遇到得问题.当然,你也可以一次性读取所有内容,使用MappedByteBuffer这个地址有例子.http://qzone.qq.com/blog/85869124-1210956488
C. JAVA怎么快速读取一个大文件(1G多有500万行)
java NIO除了异步非阻塞特性外,另外一个重要特性就是文件读取,原理是专文件地址直接映射在线程属内存,不要经过操作系统,可以大大提高响应速度。下面是例子:http://blog.csdn.net/chenleixing/article/details/44207469
D. 如何利用Java高效读取大文件
可以使自用BufferedReader解决高效读取大文件:具体如下:例如:BufferedReader br = new BufferedReader(newInputStreamReader(inputStream)
E. 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 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内存)
F. 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为npospos中就记录big.txt中第1234行的起始位置该行长度len=npos-pos;打开big.txt,查找pos位置,读len个字节,转换成字符串,就读出了指定的1234行把这个不大的big.idx的内容整理到内存中间,读取速度更快。 引经据典说,以上属于数据库基础的ISAM方法。
G. 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); } }}
H. Java中如何高效的读取大文件
读取文复件行的标准方式是在内存制中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。
I. JAVA如何读取大容量TXT文件
java读取txt文件内容复。可以作如制下理解:首先获得一个文件句柄。File file = new File(); file即为文件句柄。两人之间连通电话网络了。接下来可以开始打电话了。通过这条线路读取甲方的信息:new FileInputStream(file) 目前这个信息已经读进来内存当中了。接下来需要解读成乙方可以理解的东西既然你使用了FileInputStream()。那么对应的需要使用InputStreamReader()这个方法进行解读刚才装进来内存当中的数据解读完成后要输出呀。那当然要转换成IO可以识别的数据呀。那就需要调用字节码读取的方法BufferedReader()。同时使用bufferedReader()的readline()方法读取txt文件中的每一行数据哈。
J. 如何利用Java高效读取大文件,利用Java读取文件
可以使用BufferedReader解决高效读取大文件:
具体如版下权:
例如:BufferedReaderbr=newBufferedReader(newInputStreamReader(inputStream)
未经允许不得转载:山九号 » java文件读取大文件内容|JAVA怎么快速读取一个大文件(1G多有500万行)