① java读取解析大文件 40G左右求出name重复次top10的信息并输出求教高手,怕以后遇到类似问题
1、首先大文件统计词频如果不依赖第三方组件的话实现起来很麻烦没有回相关经验的话很容易出问题答2、若要使用java原生库的话建议使用多线程构建一个MapRece模型,多线程逐行或者按块读将各自任务下的词频统计到DB3、若使用第三方的话建议使用solr或者flink这种高度封装的组件既可以保证结果的正确性也可以保证性能
② 如何利用Java高效读取大文件,利用Java读取文件
可以使用BufferedReader解决高效读取大文件:
具体如版下权:
例如:BufferedReaderbr=newBufferedReader(newInputStreamReader(inputStream)
③ 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中用scanner逐行读取文件,但某一行的数据太大,可以达到上千万个字符
如果是这样的话,不建议通过scanner来读取那么大量的字符数,建议您把原本要输入的数据存内储到一个文件中,容然后scanner读取的只是一个文件路径,然后在你的程序中来解析这个文件的数据即可,这样也好维护好扩展,不至于在命令行下输入一大堆东西,有时候都搞不清楚了,而且你直接输入命令行,还会出现各种问题,假设你的数据中包含空格什么的,会被拆分成多个,总之这种做法是极其不推荐的,希望你能考虑使用我上面提到的方法试试。
⑤ 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内存)
⑥ Java中如何高效的读取大文件
读取文复件行的标准方式是在内存制中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。
⑦ 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)+"毫秒"); }}
⑧ JAVA如何读取大容量TXT文件
java读取txt文件内容复。可以作如制下理解:首先获得一个文件句柄。File file = new File(); file即为文件句柄。两人之间连通电话网络了。接下来可以开始打电话了。通过这条线路读取甲方的信息:new FileInputStream(file) 目前这个信息已经读进来内存当中了。接下来需要解读成乙方可以理解的东西既然你使用了FileInputStream()。那么对应的需要使用InputStreamReader()这个方法进行解读刚才装进来内存当中的数据解读完成后要输出呀。那当然要转换成IO可以识别的数据呀。那就需要调用字节码读取的方法BufferedReader()。同时使用bufferedReader()的readline()方法读取txt文件中的每一行数据哈。
⑨ JAVA怎么快速读取一个大文件(1G多有500万行)
java NIO除了异步非阻塞特性外,另外一个重要特性就是文件读取,原理是专文件地址直接映射在线程属内存,不要经过操作系统,可以大大提高响应速度。下面是例子:http://blog.csdn.net/chenleixing/article/details/44207469
⑩ 如何利用Java高效读取大文件
可以使自用BufferedReader解决高效读取大文件:具体如下:例如:BufferedReader br = new BufferedReader(newInputStreamReader(inputStream)
未经允许不得转载:山九号 » java读取大文件内容|JAVA怎么快速读取一个大文件(1G多有500万行)