精华内容
下载资源
问答
  • 思路:记住每一行开始的位置(相对文件开始的偏移byte数),用随机访问类RandomAccessFile打开文件根据行号,得到对应的位置。定位到该位置,整行内容。下面是代码,在eclipse调试通过。public class RFile {public ...

    主要是测试技术上是否可行,没有做任何结构上的设计,代码可能有不严密或者错误的地方,只供参考,不能直接应用在生产环境。

    思路:

    记住每一行开始的位置(相对文件开始的偏移byte数),用随机访问类RandomAccessFile打开文件

    根据行号,得到对应的位置。定位到该位置,读整行内容。下面是代码,在eclipse调试通过。

    public class RFile {

    public static void main(String[] args) throws Exception {

    Map map = new HashMap();

    PrintWriter writer = new PrintWriter("1.txt", "UTF-8");

    Random random = new Random();

    long pos = 0;

    int linecount = 5000000;

    int maxFieldCount = 5;

    for (int i = 0; i < linecount; i++) {

    if (i % 30000 == 0)

    System.out.println(i);

    StringBuffer line = new StringBuffer();

    line.append("_id:");

    line.append(i + 1);

    line.append("|");

    int r = random.nextInt(maxFieldCount);

    for (int k = 0; k <= r; k++) {

    if (k > 0)

    line.append("|");

    line.append("字段:" + k);

    }

    line.append("\n");

    writer.print(line);

    map.put(i + 1, pos);

    pos += line.toString().getBytes("UTF-8").length;

    }

    writer.flush();

    writer.close();

    System.out.println("pos :" + pos);

    RandomAccessFile file = new RandomAccessFile("1.txt", "r");

    long tt=System.currentTimeMillis();

    for (int i = 0; i < 100000000; i++) {

    long t1 = System.currentTimeMillis();

    int rnum = random.nextInt(linecount);

    long pos1 = map.get(rnum);

    file.seek(pos1);

    String s = readline(file);

    if(i%100000==0){

    System.out.println("rnum: " + rnum);

    System.out.println("pos1: " + pos1);

    System.out.println("line: " + s);

    long t2 = System.currentTimeMillis();

    System.out.println("t2-t1:" + (t2 - t1));

    }

    }

    long tt2=System.currentTimeMillis();

    System.out.println("tt2-tt:"+(tt2-tt));

    }

    private static String readline(RandomAccessFile file) throws IOException {

    ByteArrayOutputStream stream = new ByteArrayOutputStream();

    while (true) {

    byte b = file.readByte();

    stream.write(b);

    if (b == '\n')

    break;

    }

    String s = stream.toString("UTF-8");

    stream.close();

    return s;

    }

    }

    展开全文
  • 客户端先与NameNode通信,获取block位置...数据本地化读取是分布式计算中计算向数据移动的一大特征,block块有偏移量和位置信息,HDFS分布式文件系统优化了读取性能,客户端会根据block的信息来分辨这些副本中,哪些...

    客户端先与NameNode通信,获取block位置信息,之后线性地先取第一个块,然后接二连三地获取,取回一个块时会进行MD5验证,验证通过后会使read顺利进行完,当最终读完所有的block块之后,拼起来就是一个完整的源文件,数据本地化读取是分布式计算中计算向数据移动的一大特征,block块有偏移量和位置信息,HDFS分布式文件系统优化了读取性能,客户端会根据block的信息来分辨这些副本中,哪些副本距离客户端自身最近,那么本地、同机架、以及其他DataNode会是一个由近及远的排序,后面我们再分析MapReduce源代码的时候,会再进行分析这一优化特性。请先记住HDFS读流程的两个重要特性:

    (1)           block信息的MD5验证

    (2)           读取block时距离优先顺序的优化。

    d0fc5291b6a66741f5d64983ab4e8b0d.png

    图1.8 HDFS读流程来自《Hadoop:The Definitive Guide》一书

    读取文件的具体方式如下:

    1. 从Hadoop URL读取数据

    要从Hadoop文件系统中读取文件,最简单的方法是使用java.net.URl对象打开数据流,从中读取文件。但是,如何让java程序能够识别Hadoop的hdfs URL呢?这里采用的方法是通过调用java.net.URL对象的setURLStreamHandlerFactory方法,方法中传入FsUrlStreamHandlerFactory的一个实例,就可以让java程序可以识别hadoop的hdfs URL。每个java虚拟机只能调用一次这个setURLStreamHandlerFactory方法,因此通常将其卸载静态方法中。

    示例程序:在hdfs中存在着/install.log,

    public class test {

    static {

    URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());

    }

    @Test

    public void readByUrl() {

    InputStream in = null;

    try {

    in = new URL("hdfs://node1:9000/install.log").openStream();

    } catch (IOException e) {

    }finally{

    IOUtils.closeStream(in);

    }

    }

    }

    连不上集群。需要将core-site和hdfs-site放入到src目录下。

    2.通过FileSysem API读取数据

    正如前一小节所解释,有时不可能在应用程序中设置URLStreamhandlerFactory实例,这种情况下,需要用到FileSystem API来打开一个文件的输入流。Hadoop文件系统中通过Hadoop Path对象来代表文件。FileSystem是一个通用的文件系统API,这个类第一步是检索我们需要使用的文件系统实例,这里是HDFS。利用FileSystem.get()获取FilsSystem实例。Configuration对象封装了客户端或服务器的配置,一般讲hdfs的配置文件(将core-site.xml和hdft-site.xml放到项目的src目录下,configuration实例化的时候就会自动获取)。具体代码如下。

    示例程序:在hdfs中存在着/install.log,

    @Test

    public void readByFileSystem() throws Exception{

    String Url = "hdfs://node1:9000/install.log";

    //FileSystem fs = FileSystem.get(URI.create(Url), conf);

    Configuration conf = new Configuration();

    FileSystem fs = FileSystem.get(conf);

    InputStream in = null;

    in = fs.open(new Path(Url));

    IOUtils.copyBytes(in, System.out, 4096,true);

    }

    展开全文
  • 一、读文件BufferedInputStreamBufferedInputStream必须传入一个InputStream(一般是FileInputStream)常用方法://从该输入流中读取一个字节 public int read();//从此字节输入流中给定偏移量处开始将各字节读取到指定...

    一、读文件 BufferedInputStream

    BufferedInputStream必须传入一个InputStream(一般是FileInputStream)

    常用方法:

    //从该输入流中读取一个字节 public int read();

    //从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中。

    public int read(byte[] b,int off,int len)

    应用实例:

    importjava.io.BufferedInputStream;importjava.io.FileInputStream;/*** BufferedInputStream:缓冲输入流

    * FileInputStream:文件输入流*/

    public classFileReadToString {public static voidmain(String[] args){try{

    FileInputStream fis=new FileInputStream("WynnNi.txt");

    BufferedInputStream bis=newBufferedInputStream(fis);

    String content=null;//自定义缓冲区

    byte[] buffer=new byte[10240];int flag=0;while((flag=bis.read(buffer))!=-1){

    content+=new String(buffer, 0, flag);

    }

    System.out.println(content);//关闭的时候只需要关闭最外层的流就行了

    bis.close();

    }catch(Exception e) {

    e.printStackTrace();

    }

    }

    }

    二、写文件  BufferedOutputStream

    创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

    常用方法:

    //向输出流中输出一个字节

    public void write(int b);

    //将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。

    public void write(byte[] b,int off,int len);

    //刷新此缓冲的输出流。这迫使所有缓冲的输出字节被写出到底层输出流中。

    public void flush();

    应用实例

    /*** BufferedOutputStream:缓冲输出流* FileOutPutStream:文件输出流*/

    public classStringOutPutToFile {public static voidmain(String[] args){try{

    FileOutputStream fos=new FileOutputStream("WynnNi.txt");

    BufferedOutputStream bos=newBufferedOutputStream(fos);

    String content="xxxxxxxxx!";

    bos.write(content.getBytes(),0,content.getBytes().length);

    bos.flush();

    bos.close();

    }catch(Exception e) {

    e.printStackTrace();

    }

    }

    }

    三、实际应用场景

    被调用方如何将文件传输给调用方并在本地输出文件

    1、被调用方将文件读入缓冲区byte[]

    2、将缓冲区数据转换成String传递,String str = Base64.getEncoder().encodeToString(bytes);

    3、接收方将String反转为byte[],bytes=Base64.getDecoder().decode(str);

    4、接收方将缓冲区输出到文件

    展开全文
  • java card cap文件分析.doc还剩5页未,继续阅读下载文档到电脑,马上远离加班熬夜!亲,喜欢就下载吧,价低环保!内容要点:中的 install()在 Method 组件 info[]中的偏移。推荐的 CAP 组件安装顺序:COMPONENT_...

    java card cap文件分析.doc

    bfc5525881182072eba352c5676e17f2.gif

    还剩

    5页未读,

    继续阅读

    下载文档到电脑,马上远离加班熬夜!

    亲,喜欢就下载吧,价低环保!

    内容要点:

    中的 install()在 Method 组件 info[]中的偏移。推荐的 CAP 组件安装顺序:COMPONENT_HeaderCOMPONENT_DirectoryCOMPONENT_ImportCOMPONENT_AppletCOMPONENT_ClassCOMPONENT_MethodCOMPONENT_StaticFieldCOMPONENT_ExportCOMPONENT_ConstantPoolCOMPONENT_ReferenceLocationCOMPONENT_Descriptor (optional)COMPONENT_Debug 组件不需要下载到卡内。fos.close();}} catch (Exception e) {Log.e(TAG, "loadCap: " + e.getMessage());}}public List getCapFileList() {return mCapFileList;}}使用方法:Cap cap = new Cap();cap.loadCapFile("HelloWorld.cap");就可以解压出各个组件,他们也是 cap 文件。所有的组件均有通用结构格式,如下:component {u1 tag //u1 表示无符号单字节类型的数据变量类型;tag 为组件索引号,按照上面组件名称的顺序从 1 至 12 排列u2 size //u2 表示无符号双字节的数据变量类型;size 为可变长度数组 info[]的元素个数u1 info[] //数组 info[]中含了组件的所有信息,依据各组件属性不同而各不相同}比如 Applet.cap 的十六进制数据是: 0300090105c0c1c2c3c40085第一个 03 是 tag,然后是 0009 是 size,说明 info 为 9 个字符,01 标示了这是包中的第一个 applet,05 为该 Applet 的 AID 的长度,后面的 c0c1c2c3c4 即为applet 的 AID,后面的 0085 是该 Applet 的 install_method_offset,即当前 AppletEnumeration e = zipfile.entries();while (e.hasMoreElements()) {entry = (ZipEntry) e.nextElement();String fileName = entry.getName();if (fileName.endsWith(".MF"))continue;if (fileName.contains("/")) {int dir = fileName.lastIndexOf("/");String root = CAP_DIRECTORY + fileName.substring(0, dir);File path = new File(root);if (!path.exists()) {path.mkdirs();}}int count;byte data[] = new byte[READ_LENGTH];mCapFileList.add(CAP_DIRECTORY + entry.getName());FileOutputStream fos = new FileOutputStream(CAP_DIRECTORY+ entry.getName());dest = new BufferedOutputStream(fos, READ_LENGTH);is = new BufferedInputStream(zipfile.getInputStream(entry));while ((count = is.read(data, 0, R

    发表评论

    暂无评论,赶快抢占沙发吧。

    展开全文
  • 分段处理,计算出每个线程读取文件的开始与结束位置(文件大小/线程数)*N,N是指第几个线程,这样能得到每个线程在读该文件的大概起始位置使用"大概起始位置",作为读文件的开始偏移量(fileChannel...
  • 分段处理,计算出每个线程读取文件的开始与结束位置(文件大小/线程数)*N,N是指第几个线程,这样能得到每个线程在读该文件的大概起始位置使用"大概起始位置",作为读文件的开始偏移量(fileChannel...
  • 1.shx文件的基本情况shx文件又叫索引文件,主要包含坐标文件的索引信息,文件中每个记录包含对应的坐标文件记录距离坐标文件的初始位置的偏移量。通过索引文件可以很方便地在坐标文件中定位到指定目标的坐标信息。2....
  • Java InputStream从文件读取示例

    千次阅读 2017-08-14 16:16:57
    2,很重要的一个方法是read(byte[] buffer,int offset,int length),三个参数分别代表到哪,从当前位置开始读取的偏移,读取长度。3,一定要注意编码,比如UTF-8中中文一般占3个字节,数字和英文字母占一个字节,...
  • 本代码思路来源于hadoop tail命令源码,tail只能读取偏移1024字符的数据,当需要的倒序的字段大于1024的一种通用办法。有时候我们不需要完全读取文件,只需解析正序一部分,最后一部分数据。 代码如下 public ...
  • 用lucene写了一个抓包程序,在检索文件过程中,我通过数据包偏移量来读取指定内容并写入新文件,但是根据偏移量单次去可以找到文件内容,但是使用循环只能到第一次循环的内容后面的都读取不到,我根据生成的偏移...
  • Java核心编程四:文件流与正则匹配

    千次阅读 2013-09-19 07:49:00
    Java.io中定义了抽象基类InputStream和OutputStream。分别支持基本的和写操作。 int read(int n) 读取指定字节,结束返回-1; int read(byte[] b,int offset,int len); long skip(long n) 路过指定的偏移 int ...
  • Java RandomAccessFile seek()方法java.io.RandomAccessFile.seek(long pos)方法将文件指针偏移量,从这个文件开始测量,进行下一个或写操作。偏移量可以被设置为超出文件的末尾。设置偏移超出了文件的末尾不会...
  • 文件输入流将文件内容读取(程序读取文件内容,暂存在内存中); 文件输出流,将程序读取到的内容写入到一个文件中; 一:FileOutputStream类常用方法介绍 ... len:如果没有文件末尾:len的值就是实际...
  • Java RandomAccessFile getFilePointer()方法java.io.RandomAccessFile.getFilePointer()方法返回当前在此文件中的偏移。1 语法public long getFilePointer()2 参数无3 返回值此方法返回从文件开始的偏移量,以字节...
  • 关于Java中RandomAccessFile类的seek方法

    千次阅读 2019-07-11 11:43:23
    文件的开头开始测量,在此位置进行下一步的或写。 需要说明的一点是,seek方法中的参数单位是字节,而非字符。所以调用seek方法时,需要了解当前环境的编码格式,再进行指针偏移量的确定。(主要是对中文字符的...
  • java的代码需要编译成class文件,class文件保存的是java的操作码(opcode),操作码又被称为java字节码,因为每条java的操作码都是一个字节。java的操作码可以被反汇编成人类能懂的指令: # 最左列是偏移;中间
  • 全屏java.io.BufferedInputStream.read(byte[] b, int off, int len)...该迭代继续进行,直到下列条件之一为真:len字节读取返回-1,表示文件结束 - 。如果缓冲输入available()方法返回0声明以下是java.io.Buff...
  • RandomAccessFile的实例支持对随机文件的读取和写入,这里的随机,值的是可以用RandomAccessFile对...它的常用方法是:getFilePointer(),返回此文件中的当前偏移量,即返回指针位置;length(),返回此文件的...
  • 数据,也不要自己去seek指定偏移量,而是按顺序read(因为read时会预读取后续一部分数据,而不是仅读取当前位置的数据,所以顺序可以充分利用预读机制。如果自己seek,那么就无法预读,每次都要去操作本地磁盘) ...
  • 据说DPI信息在jpg文件中用5个字节表示,直接读取二进制流就可以了 偏移 13 的1个字节: X和Y的密度单位 units=0:无单位 units=1:点数/英寸 units=2:点数/厘米 偏移15的2字节: 水平方向像素密度 偏移16的2字节...
  • JVM在装载class文件的时候,会有一步是将符号引用解析为直接引用的过程。 那么这里的直接引用到底是什么呢? 对于指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的本地指针。 指向...
  • Java开发实战1200例.第2卷.part3

    热门讨论 2013-05-08 22:46:34
    实例227 柱形图阴影偏移 358 实例228 设置柱形的颜色 360 实例229 绘制3D柱形图 361 实例230 标记柱形图区间 363 实例231 多系列柱形图 365 实例232 多系列3D柱形图 367 第9章 扩展图表技术 369 9.1 区域图 370 实例...
  • Java开发实战1200例.第2卷.part2

    热门讨论 2013-05-08 22:45:35
    实例227 柱形图阴影偏移 358 实例228 设置柱形的颜色 360 实例229 绘制3D柱形图 361 实例230 标记柱形图区间 363 实例231 多系列柱形图 365 实例232 多系列3D柱形图 367 第9章 扩展图表技术 369 9.1 区域图 370 实例...
  • Java开发实战1200例.第2卷.part1

    热门讨论 2013-05-08 22:44:13
    实例227 柱形图阴影偏移 358 实例228 设置柱形的颜色 360 实例229 绘制3D柱形图 361 实例230 标记柱形图区间 363 实例231 多系列柱形图 365 实例232 多系列3D柱形图 367 第9章 扩展图表技术 369 9.1 区域图 370 实例...
  • 书名:《Java开发实战1200例(第II卷)》(清华大学出版社.李钟尉,陈丹丹) PDF格式扫描版,全书分为6篇21章,共905页。2011年6月出版。 全书压缩打包成2部分,这是第1部分。 注:本电子版缺失了第19-21章的部分,仅...
  • 书名:《Java开发实战1200例(第II卷)》(清华大学出版社.李钟尉,陈丹丹) PDF格式扫描版,全书分为6篇21章,共905页。2011年6月出版。 全书压缩打包成2部分,这是第2部分。 注:本电子版缺失了第19-21章的部分,仅...
  • 书名:《Java开发实战1200例(第II卷)》(清华大学出版社.李钟尉,陈丹丹) PDF格式扫描版,全书分为6篇21章,共901页。2011年6月出版。 注:原书仅含前18章的内容(824页536个实例),为方便学习,本人添加进后3章变成...
  • 书名:《Java开发实战1200例(第II卷)》(清华大学出版社.李钟尉,陈丹丹) PDF格式扫描版,全书分为6篇21章,共901页。2011年6月出版。 注:原书仅含前18章的内容(824页536个实例),为方便学习,本人添加进后3章变成...
  • 实例227 柱形图阴影偏移 实例228 设置柱形的颜色 实例229 绘制3D柱形图 实例230 标记柱形图区间 实例231 多系列柱形图 实例232 多系列3D柱形图 第9章 扩展图表技术 9.1 区域图 实例233 基本区域图 实例234 显示多...

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
关键字:

java读文件偏移

java 订阅