java中利用RandomAccessFile读取超大文件

超大文件我们使用普通的文件读取方式都很慢很卡,在java中为我提供了RandomAccessFile函数,可以快速的读取超大文件并且不会感觉到卡哦,下面看我的一个演示实例。

服务器的日志文件往往达到400多M,简单的文件读取实在太慢,太占用机器资源。

特别是如果你需要5分钟就扫描一次日志文件,来统计一些即时数据。比如刚才10分钟的来访客户(大型网站用户统计系统例如51.la 会经常用到吧。)即时扫描大数据文件中的一部分显得非常之重要。
本文讲述了如果使用java的RandomAccessFile方法从一个很大的文件来读取部分字节

测试文件总大小46085个字节

读取文件最后85个字节

文件大小:46085
85

测试效果

扩展功能 —> 优酷视频 
其他的如奇艺,土豆之类操作顺序相同。当然我们也可以读取从46000只读取20个字节,看个人需要,这里仅仅作为示例

package com.javaer.examples.file;

import java.io.IOException;
import java.io.RandomAccessFile;

public class ReadBigFile {
 public static void readBigFile() throws IOException{
  String fileName = "/Users/mc2/Desktop/youku.txt";
  RandomAccessFile randomFile = null;
  randomFile = new RandomAccessFile(fileName, "r");
        long fileLength = randomFile.length();
        System.out.println("文件大小:" + fileLength);
        int start = 46000;
        randomFile.seek(start);
        byte[] bytes = new byte[91];
        int byteread = 0;
        // 一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。
        // 将一次读取的字节数赋给byteread
        while ((byteread = randomFile.read(bytes)) != -1) {
           // System.out.write(bytes, 0, byteread);
        }
        System.out.println(bytes.length);
        System.out.println(new String(bytes,"UTF-8"));
        if (randomFile != null) {
         randomFile.close();
        }

 }
 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
   ReadBigFile.readBigFile();
 }

}

即使很大的文件,从里面读取一点数据,速度也很快。全部读取出来,也会占用很少的内存。

核心提示: randomFile.seek(start);

跳跃读取,从这里开始读。指针直接指到start这个位置开始读取文件。

bytes获取可以作如下替换,不同场合,不同使用

byte[] bytes = new byte[91];
        int byteread = 0;
        // 一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。
        // 将一次读取的字节数赋给byteread
        while ((byteread = randomFile.read(bytes)) != -1) {
           // System.out.write(bytes, 0, byteread);
        }
        System.out.println(bytes.length);byte[] bytes ;
        int byteread = 0;

        ByteArrayOutputStream byteout = new ByteArrayOutputStream();
      byte tmp[] = new byte[1024];
      byte context[];
      int i = 0;
      int has=0;
      while ((i = randomFile.read(tmp)) != -1) {
     byteout.write(tmp, 0, i);
     has +=i;
     if(has > 10240)
       break;
     }
    bytes = byteout.toByteArray();
时间: 2024-08-26 08:12:28

java中利用RandomAccessFile读取超大文件的相关文章

java中利用dom4j解析XML文件

官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回List<Student>集合 需要解析的XML: <?xml version="1.0" encoding="UTF-8"?> <classes> <class name="ST01"> <stud

Java中动态加载jar文件和class文件

概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类文件,这个技术可以实现一个容器,容纳各类不同的子应用. Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,不像C加载动态链接库只要一个文件名就可以搞定,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 动态加载jar文件 // 系统类库路径 File libPath =

Java使用相对路径读取xml文件

java使用相对路径读取xml文件 博客分类: java javaXMLJavaWeb 一.xml文件一般的存放位置有三个: 1.放在WEB-INF下: 2.xml文件放在/WEB-INF/classes目录下或classpath的jar包中: 3.放在与解析它的java类同一个包中,不一定是classpath: 二.相对应的两种使用相对路径的读取方法: 方法一:(未验证) 将xml文件放在WEB-INF目录下,然后 程序代码: InputStream is=getServletContext(

利用XPath读取Xml文件

之所以要引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素.可以把XPath比作文件管理路径:通过文件管理路 径,可以按照一定的规则查找到所需要的文件:同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点. 不过,由于XPath可应用于不止一个的标准,因此W3C将其独立出来作为XSLT的配套标准颁布,它是XSLT以及我们后面要讲到的XPointer的重要组成部分. 在介绍XPath的匹配规则之前,我们先来看一些有关XPath的基

如何判断java.io.File所读取的文件编码

如何判断java.io.File所读取的文件编码 问题 java中涉及到文件读取,就经常要考虑文件编码问题.虽然程序中一般都指定UTF-8编码,但是用户总可能提交各种编码的文件(特别是windows下用户),如果对这些文件不做判断就直接按照UTF-8的方式读取的话,是肯定会乱码的. 解决方案 java原生并不支持文件编码的判断,一般都是read文件的前几个字节来判断,需要自己编写工具类,判断的编码类型也比较少.最近找到了个开源的项目juniversalchardet,能比较优雅的完成这个任务.

PHP读取超大文件的实例代码

数据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机 去年年底的各种网站帐号信息的数据库泄漏,很是给力啊,趁机也下载了几个数据库,准备学学数据分析家来分析一下这些帐号信息.虽然这些数据信息都已经被“整理”过的,不过自己拿来学习也挺有用的,毕竟有这么大的数据量. 数 据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机.用MSSQL的客户端也打不开这么大的SQL文件,直接 报内存不足,原因据说是MSSQL在读取数据的时候

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

[转] C#实现在Sql Server中存储和读取Word文件

出处 C#实现在Sql Server中存储和读取Word文件 要实现在Sql Server中实现将文件读写Word文件,需要在要存取的表中添加Image类型的列,示例表结构为: CREATE TABLE CONTRACTS ( ID VARCHAR (50), CONTRACT_FILE IMAGE ); 要将Word文件存储到数据库的CONTRACT_FILE字段中,需要将文件转换为byte数组,具体代码如下: /// 将文件转换为byte数组 /// <summary> /// 将文件转换

Java中动态生成当前日期的文件

1.Java中动态生成当前日期的文件名称并且将控制台的输出信息输入到文件中     public static void SaveClonseToFile() throws IOException, FileNotFoundException {         File f = new File(getCurrentDateFileName() + ".txt");         f.createNewFile();         FileOutputStream fileOut