精华内容
下载资源
问答
  • 主要介绍了Java文件转为字节数组实例详解的相关资料,需要的朋友可以参考下
  • Java文件转为字节数组

    千次阅读 2016-12-22 11:44:00
    Java文件转为字节数组 关键字:文件文件流,字节流,字节数组,二进制 摘要:最近工作中碰到的需求是,利用http传输二进制数据到服务器对应接口,需要传输userId, file(加密后)等一系列混合后的二进制数据。...

    Java将文件转为字节数组

    关键字:文件,文件流,字节流,字节数组,二进制

    摘要:最近工作中碰到的需求是,利用http传输二进制数据到服务器对应接口,需要传输userId, file(加密后)等一系列混合后的二进制数据。本文旨在记录自己在使用Java将文件转为字节数组的一些知识理解与汇总。

    FileInputStream

    利用FileInputStream读取文件

    FileInputStream是InputStream的子类,用于从文件中读取信息,构造器接收一个File类型或表示文件路径的String类型。

    File file = new File("filePath");
    FileInputStream fis = new FileInputStream(file);

    ByteArrayOutputStream

    利用ByteArrayOutputStream将FileInputStream中的文件数据读出来

    ByteArrayOutputStream是用来在内存中创建缓冲区,所有送往“流”的数据都要放置在此缓冲区中。

    ByteArrayOutputStream bos = new ByteArrayOutputStream(fis);
    byte[] b = new byte[1024];
    int len = -1;
    while((len = fis.read(b)) != -1) {
        bos.write(b, 0, len);
    }

    注意:ByteArrayOutputStream的write方法有三种重载形式:

    • write(int b)
      写入指定字节
    • write(byte[] b)
      写入整个字节数组b
    • write(byte[] b, int off, int len)
      写入字节数组b,从b的第off下标开始,写入len个字节。

    这里没有使用第二中,而是使用了第三种,在代码中每次获取读入缓冲区b中的数量,一般为1024(因为定义b的时候显示指定了长度),只有当读到结尾的时候,可能不够1024个字节了,也会读取实际的读取字节数,但是在写入缓冲区的时候,如果不指定写入的数量,即不指定len,那么就会将整个b全部写入,即使b中只有一部分内容,但是依然会写入1024个字节。这将导致使用toByteArray时,得到的字节数组不是实际长度!

    这样就将文件流从InputStream中写入了ByteArrayOutputStream中。

    利用ByteArrayOutputStream的toByteArray()方法得到文件的字节数组。

    byte[] fileByte = bos.toByteArray();

    转载于:https://www.cnblogs.com/shiyu404/p/6210562.html

    展开全文
  • import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream;... //将文件xxWord.Z压缩包转为byte字节 public
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class Test {
        //将文件xxWord.Z压缩包转为byte字节
        public static byte[] fileToByte() throws IOException{
            String filePath = "D:\\apache-maven-3.3.9\\conf\\logging\\xxWork.Z";
            File file = new File(filePath);
            InputStream is = new FileInputStream(file);
            int available = is.available();
            byte[] byteBuffer = new byte[available];
            byte[] object = byteBuffer;
            return object;
        }
    
        /**
         * 把传入的字节流转化为本地的文件
         * 
         * @param object
         * @return
         */
        private static File getFile(byte[] object) {
            String fileName = "D:\\Documents and Settings\\Workspaces\\MyEclipse 8.5\\tftp";
            String FILE_PATH = "\\xxWork.Z";
            String path = System.getProperty("user.dir"); //获取当前项目路径
            fileName = path + FILE_PATH;
            File file = new File(fileName);
            FileOutputStream fileOutStream = null;
            if (file.isFile()) {
                file.delete();
            }
            try {
    
                if (file.createNewFile() && file.canWrite()) {
                    fileOutStream = new FileOutputStream(file); //获取输出流
                    fileOutStream.write(object);  //写入
                }
            } catch (IOException e) {
                System.out.println("IOException occur");
                e.getMessage();
            } finally {
                try {
                    if (null != fileOutStream) {
                        fileOutStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            return file;
        }
    
        /**
         * 删除文件
         * 
         * @param file
         */
        private static void deleteFile(final File file) {
            new Thread(new Runnable() {
                public void run() {
                    if (file.isFile() && file.exists()) {
                        file.delete();
                    }
                }
            }).start();
        }
    }
    
    展开全文
  • 首先准备材料: 1 Winhex工具下载:http://www.x-ways.net/winhex/ Winihex用来查看class文件 ...用于结构化展现字节文件 3 java命令:javap -C 类文件名/java -verbose 类文件名 D:\zhunode_prac\demo...

    首先准备材料:

    1 Winhex工具下载:http://www.x-ways.net/winhex/
    Winihex用来查看class文件
    2 JclassLib工具下载:https://github.com/ingokegel/jclasslib
    用于结构化展现字节码文件
    3 java命令:javap -C 类文件名/java -verbose 类文件名

    D:\zhunode_prac\demo\target\classes\com\zhunode\bytecode>javap -verbose MyTest01.class
    Classfile /D:/zhunode_prac/demo/target/classes/com/zhunode/bytecode/MyTest01.class
      Last modified 2019-6-8; size 481 bytes
      MD5 checksum dc8c25bf7aa8c02cf95d1dc625ae5ee8
      Compiled from "MyTest01.java"
    public class com.zhunode.bytecode.MyTest01
      minor version: 0
      major version: 52
      flags: ACC_PUBLIC, ACC_SUPER
    Constant pool:
       #1 = Methodref          #4.#20         // java/lang/Object."<init>":()V
       #2 = Fieldref           #3.#21         // com/zhunode/bytecode/MyTest01.a:I
       #3 = Class              #22            // com/zhunode/bytecode/MyTest01
       #4 = Class              #23            // java/lang/Object
       #5 = Utf8               a
       #6 = Utf8               I
       #7 = Utf8               <init>
       #8 = Utf8               ()V
       #9 = Utf8               Code
      #10 = Utf8               LineNumberTable
      #11 = Utf8               LocalVariableTable
      #12 = Utf8               this
      #13 = Utf8               Lcom/zhunode/bytecode/MyTest01;
      #14 = Utf8               getA
      #15 = Utf8               ()I
      #16 = Utf8               setA
      #17 = Utf8               (I)V
      #18 = Utf8               SourceFile
      #19 = Utf8               MyTest01.java
      #20 = NameAndType        #7:#8          // "<init>":()V
      #21 = NameAndType        #5:#6          // a:I
      #22 = Utf8               com/zhunode/bytecode/MyTest01
      #23 = Utf8               java/lang/Object
    {
      public com.zhunode.bytecode.MyTest01();
        descriptor: ()V
        flags: ACC_PUBLIC
        Code:
          stack=1, locals=1, args_size=1
             0: aload_0
             1: invokespecial #1                  // Method java/lang/Object."<init>":()V
             4: return
          LineNumberTable:
            line 3: 0
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0       5     0  this   Lcom/zhunode/bytecode/MyTest01;
    
      public int getA();
        descriptor: ()I
        flags: ACC_PUBLIC
        Code:
          stack=1, locals=1, args_size=1
             0: aload_0
             1: getfield      #2                  // Field a:I
             4: ireturn
          LineNumberTable:
            line 6: 0
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0       5     0  this   Lcom/zhunode/bytecode/MyTest01;
    
      public void setA(int);
        descriptor: (I)V
        flags: ACC_PUBLIC
        Code:
          stack=2, locals=2, args_size=2
             0: aload_0
             1: iload_1
             2: putfield      #2                  // Field a:I
             5: return
          LineNumberTable:
            line 9: 0
            line 10: 5
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0       6     0  this   Lcom/zhunode/bytecode/MyTest01;
                0       6     1     a   I
    }
    SourceFile: "MyTest01.java"
    

    4 准备java文件:com.zhunode.MyTest01.java文件

    package com.zhunode.bytecode;
    
    public class MyTest01 {
        private int a;
        
        public int getA() {
            return this.a;
        }
        public void setA(int a) {
            this.a = a;
        }
    }
    

    5 常量表数据结构描述符
    在这里插入图片描述
    关于常量表数据结构:可以查看《Java虚拟机规范》,本章是来自Java虚拟机8,来自第四章内容。当然,关于JVM虚拟机规范也可以查看官方文档。

    第二部分:开始查看文件:

    利用Winhex工具打开class文件,内容如图:
    在这里插入图片描述
    现在来逐步认识这份字节码结构:
    首先该文件是一个16进制的文件
    在这里插入图片描述
    对于第一行的内容来说,CA FE BA BE 是一个固定值,CAFE,JAVA标志,BABE,baby。这个就是魔数,用于标识该文件是Java的二进制文件,JVM在加载class文件时,会通过魔数来检查该文件是否为java class文件。
    跟着CA FE BA BE 后面的 00 00 00 34 表示小版本号和大版本号,如00 就与下图的minor version对应,00 34就与major version对应
    在这里插入图片描述

    00 00转为10进制=0
    00 34转为10进制=3*16^1 +  4*16^0 = 52 
    

    在说常量池之前,需要注意的是,常量池不是用于存储常量的,它是一个数据资源库,用于为后面的方法表等部分的内容提供资源内容。

    后面的00 18 表示常量池的个数:转为10进制的数值为:24。表示常量池中常量的个数为24,不过因为常量池中有一个常量为保留常量,即JVM内部定义的一个常量,所以除去这个常量,常量池中的常量的个数为24 - 1 = 23。下图就是通过javap -verbose得到的常量池
    在这里插入图片描述
    常量池的个数已经知道了,那么接下来的就是常量池的内容了。根据 材料准备 的 常量池数据结构信息可知,tag项用于表示
    常量类型,一个用1bit表示。那么紧接着 00 18的 0A表示tag值为10 ,那么对应的常量类型为:Constant FieldRef info,这部分由三部分内容组成,1bit的index,2bit的用于指向Constant_Class_info类型的索引,2bit用于指向Constant_NameAndType类型的索引。那么就可以确定第一个常量池中的常量值内容了:0A 00 00 04 00 14该部分就用于描述常量池的第一个常量。
    与第一个常量类似:接下来就直接画出所有的常量的二进制标志了。
    在这里插入图片描述

    序号 二进制表示 释义 对应的常量
    1 0A 00 04 00 14 00 004 表示第一个index,00 14表示第二个index 0A对应常量类型:CONSTANT_Methodref_info,详情见常量信息。
    2 09 00 03 00 15 00 03表示第一个index,指向声明的字段的类或者是Constant_Class_info的索引项,即索引项为3;00 15表示第二个index,指向字段的描述符的Constant_TypeAndName_info的索引项,索引项为21 09对应的常量类型:Constant FieldRef info
    3 07 00 16 00 16表示索引项,指的是指向常量限定名索引,索引项为22 07对应的常量类型:Constant_Class_Info
    4 07 00 17 00 17表示索引项,指的是指向常量限定名索引,索引项为23 07对应的常量类型:Constant_Class_Info
    5 01 00 01 61 00 01指的是UTF8编码的字符串占用的字符数,61 指长度为length的UTF-8编码的字符串,转为10进制数值为97 ,表示的数值为a。 01对应的常量类型:Constant_UTF8_Info
    6 01 00 01 49 00 01指的是UTF8编码的字符串占有的字符数,只有一个字符串,49 表示的字符数值为I。 01对应的常量类型:Constant_UTF8_Info
    7 01 00 06 3C 69 6E 69 74 3E 00 06指的是UTF8编码的字符串占有的字符数为6,有6个字符,3C 69 6E 69 74 3E 表示的字符数值为<init>。 01对应的常量类型:Constant_UTF8_Info
    8 01 00 03 28 29 56 00 03指的是UTF8编码的字符串占有的字符数为3,有3个字符,28 29 56表示的字符数值为()V。 01对应的常量类型:Constant_UTF8_Info
    9 01 00 04 43 6F 64 65 00 04指的是UTF8编码的字符串占有的字符数为4,有4个字符,43 6F 64 65表示的字符数值为Code。 01对应的常量类型:Constant_UTF8_Info
    10 01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 00 0F指的是UTF8编码的字符串占有的字符数为16,有16个字符,4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65表示的字符数值LineNumberTable。 01对应的常量类型:Constant_UTF8_Info
    11 01 00 12 4C 4F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 00 12指的是UTF8编码的字符串占有的字符数为18,有18个字符,4C 4F 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65表示的字符数值LocalVariableTable 01对应的常量类型:Constant_UTF8_Info
    12 01 00 04 74 68 69 73 00 04指的是UTF8编码的字符串占有的字符数为4,有4个字符,74 68 69 73表示的字符数值this 01对应的常量类型:Constant_UTF8_Info
    13 01 00 1F 4C 63 6F 6D 2F 7A 68 75 6E 6F 64 65 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 30 31 3B 00 1F指的是UTF8编码的字符串占有的字符数为32,有32个字符,4C 63 6F 6D 2F 7A 68 75 6E 6F 64 65 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 30 31 3B表示的字符数值Lcom/zhunode/bytecode/MyTest01; 01对应的常量类型:Constant_UTF8_Info
    14 01 00 04 67 65 74 41 00 04指的是UTF8编码的字符串占有的字符数为4,有4个字符,表示的字符数值为getA 01对应的常量类型:Constant_UTF8_Info
    15 01 00 03 28 29 49 00 03指的是UTF8编码的字符串占有的字符数为3,有3个字符,表示的字符数值为()I 01对应的常量类型:Constant_UTF8_Info
    16 01 00 04 73 65 74 41 00 04指的是UTF8编码的字符串占有的字符数为4,有4个字符,表示的字符数值为setA 01对应的常量类型:Constant_UTF8_Info
    17 01 00 04 28 49 29 56 00 04指的是UTF8编码的字符串占有的字符数为4,有4个字符,表示的字符数值为(I)A 01对应的常量类型:Constant_UTF8_Info
    18 01 00 0A 53 6F 75 72 63 65 46 69 6C 65 00 0A指的是UTF8编码的字符串占有的字符数为10,有10个字符,表示的字符数值为SourceFile 01对应的常量类型:Constant_UTF8_Info
    19 01 00 0D 4D 79 54 65 73 74 30 31 2E 6A 61 76 61 00 0D指的是UTF8编码的字符串占有的字符数为13,有13个字符,表示的字符数值为MyTest01.java 01对应的常量类型:Constant_UTF8_Info
    20 0C 00 07 00 08 NameAndTypeInfo常量类型由三部分组成,第二项指向全限定名常量项索引,即第7项索引;第三项指向字符串字面量的索引,即第8八项索引 0C对应的常量类型:Constant_NameAndTypeField ,具体信息查看结构类型
    21 0C 00 05 00 06 NameAndTypeInfo常量类型由三部分组成,第二项指向全限定名常量项索引,即第5项索引;第三项指向字符串字面量的索引,即第6项索引 0C对应的常量类型:Constant_NameAndTypeField ,具体信息查看结构类型
    22 01 00 1D 63 6F 6D 2F 7A 68 75 6E 6f 6r 65 2F 62 79 74 65 63 6F 64 65 2F 4D 79 54 65 73 74 30 31 对应的UTF8类型, 63 6F 6d 2f 7a 68 75 6e 6f 6r 65 2f 62 79 74 65 63 6f 64 65 2f 4d 79 54 65 73 74 30 31表示的数值为com/zhunode/bytecode/MyTest01 01对应的常量类型:Constant_UTF8_INFO ,具体信息查看结构类型
    23 01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 对应的UTF8类型, 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74表示的数值为java/lang/Object 01对应的常量类型:Constant_UTF8_INFO ,具体信息查看结构类型

    到此为止,常量表的字节码就分析完成了,现在就开始看方法表的字节码。
    在这里插入图片描述

    字节码Access_Flag访问标志

    对常量池有初步了解之后,我们可以来看看访问标志信息了,如下:
    在这里插入图片描述
    访问标志信息包括该Class文件是类还是接口,是否被定义成public,是否是abastract,如果是类,是否被声明为final。而我们定义的源代码就知道文件是类而且是public的:
    类文件的访问标志对应的字节码信息如下:
    在这里插入图片描述
    对上面的类访问标志有了初步认识就继续往下分析,常量池之后的两个字节表示访问标志,则数两个字节。
    在这里插入图片描述

    0x0021
    对应上面的类访问修饰符可知,并没有找到对应的修饰符,这是由于Java的修饰符是可以互相组合的,这里并没有穷举每一种组合,而是为每一个基本的访问修饰符定义了一个值,那如果一个类即是public,又是final时候,此时就会取这两个修饰符的并集:

    0x0011 | 0x0010 = 0x0011
    // 所以在二进制字节码中就会记录“0x0011”,同样的,回到之前的"0x0021",可以发现是
    0x0001 | 0x0020 = 0x0021
    

    所以0x0021:是0x0020和0x0001的并集,表示ACC_PUBLIC与ACC_SUPER。表示该类是public的并能调用父类的。所以在javap -verbose中能看到:
    在这里插入图片描述
    紧接着访问标志之后两个字节则是当前类的类名,如下:
    在这里插入图片描述
    所以往后数两个字节:
    在这里插入图片描述
    注意:这是一个索引,指向常量池,所以从常量池中进行查找。
    在这里插入图片描述
    紧接着再往后两个字节则是父类类名:

    在这里插入图片描述
    在这里插入图片描述
    同样也在常量池中去找寻:
    在这里插入图片描述
    紧接着父类名称之后,则是接口信息了:

    在这里插入图片描述
    进一步展开如下:
    在这里插入图片描述
    也就是先数两个字节来看一下接口的数量:
    在这里插入图片描述
    表示当前类没有实现接口,既然接口数为0,则接口名则不会出现了,如下:
    在这里插入图片描述

    字段表

    好,往下则是字段表信息,如下:
    在这里插入图片描述
    字段表用于描述类和接口中声明的变量。这里包含了类级别变量以及实例变量,但是不包括方法内部声明的局部变量。
    接下来需要了解一下“字段表集合”,这是一个比较复杂的概念,虽说展开字段的信息是这样:
    在这里插入图片描述
    但是变量表是有自己结构的,就像常量池:
    在这里插入图片描述
    字段表的结构如下:
    在这里插入图片描述
    其中access_flags是访问标志符,占两个字符;name_index代表字段的名称索引,占两个字符;descriptor_index代表描述符的索引,占2个字节;这三个信息就可以完整的描述一个字段的信息;attributes_count:属性个数,可有可无;
    用结构体形式描述为:

    field_info{
    	u2 access_flags; // 0002
    	u2 name_index; // 0005
    	u2 descriptor_index; // 0006
    	u2 attributes_count; // 0000
    	attribute_info attributes[attributes_count];
    }
    

    好,回到二进制文件中来分析一下字段信息,先数2个字节来看一下字段的个数:
    在这里插入图片描述
    表示类中有一个字段,接下来得要根据字段表来看一下该字段的具体信息,首先数2个字节表示修饰符信息,如下:
    在这里插入图片描述
    所以往后数两个字节呗:
    在这里插入图片描述
    那它代表什么修饰符呢,上这张表去查一下:
    在这里插入图片描述
    呃~~什么鬼,木有是0x0002的修饰符嘛,其实它是ACC_PRIVATE,只是未列在此表中,对应源代码确实是嘛:
    在这里插入图片描述
    接下来两个字节表示字段名称索引,如下:
    在这里插入图片描述
    继续数数:
    在这里插入图片描述
    name_index,索引名,去常量池找:
    在这里插入图片描述
    在这里插入图片描述
    再往后两个字节则是描述符的索引:
    在这里插入图片描述
    数两个字节:
    在这里插入图片描述
    继续在常量池上找
    在这里插入图片描述
    接下来两个字节则是属性数量,如下:
    在这里插入图片描述
    说明该字段木有属性信息,所以之后的attributes也不可能出现在二进制文件当中了,至此,整个字段信息就分析完了!

    方法表结构

    这一小节来分析方法表的内容
    在这里插入图片描述
    接着来看一下方法表相关的信息:
    在这里插入图片描述
    所以往下找两个字节:
    在这里插入图片描述

    0x0003表明有三个方法,这是因为有一个为默认构造方法,可以通过Bytecode viewer作为辅助查看:
    在这里插入图片描述
    接着往下则是方法表相关的信息:
    在这里插入图片描述
    先来看一下表结构:
    在这里插入图片描述
    也就是说每个方法所对应的方法表结构如上,所以接下来看一下第一个方法的信息,往下数2个字节则是access_flags,如下:
    在这里插入图片描述
    这是就需要查看对应的方法访问修饰符了:
    在这里插入图片描述
    表示是public的方法,接下来四个字节为方法名字和索引和描述符的索引,一起看:

    在这里插入图片描述
    在这里插入图片描述
    其对应的常量池信息如下:
    在这里插入图片描述
    在这里插入图片描述
    也就是第一个方法是构造方法,接着往下则是方法的属性相关的东东,注意:这个属性跟方法的变量是两码事,如下:
    在这里插入图片描述
    所以往下数两个字节,看一下方法属性的个数:
    在这里插入图片描述
    说明有一个方法属性,而往后两个字节对是属性名称索引,如下:
    在这里插入图片描述
    对应常量池:
    在这里插入图片描述
    Code属性,对于每一个方法都有一个Code属性,如下:

    {
      public com.zhunode.jvm.MyTest01();
        descriptor: ()V
        flags: ACC_PUBLIC
        Code:
          stack=2, locals=1, args_size=1
             0: aload_0
             1: invokespecial #1                  // Method java/lang/Object."<init>":()V
             4: aload_0
             5: iconst_1
             6: putfield      #2                  // Field a:I
             9: return
          LineNumberTable:
            line 8: 0
            line 10: 4
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0      10     0  this   Lcom/zhunode/jvm/MyTest01;
    
      public int getA();
        descriptor: ()I
        flags: ACC_PUBLIC
        Code:
          stack=1, locals=1, args_size=1
             0: aload_0
             1: getfield      #2                  // Field a:I
             4: ireturn
          LineNumberTable:
            line 13: 0
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0       5     0  this   Lcom/zhunode/jvm/MyTest01;
    
      public void setA(int);
        descriptor: (I)V
        flags: ACC_PUBLIC
        Code:
          stack=2, locals=2, args_size=2
             0: aload_0
             1: iload_1
             2: putfield      #2                  // Field a:I
             5: return
          LineNumberTable:
            line 17: 0
            line 18: 5
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0       6     0  this   Lcom/zhunode/jvm/MyTest01;
                0       6     1     a   I
    }
    SourceFile: "MyTest01.java"
    

    其实就是描述了整个方法的Code信息,Code attribute的作用是保存该方法的结构,如所对应的字节码:

    Code_attribute{
    	u2 attribute_name_index;
    	u4 attribute_length;
    	u2 max_stack;
    	u2 max_locals;
    	u4 code_length;
    	u1 code[code_length];
    	u2 exception_table_length;
    	{
    		u2 start_pc;
    		u2 end_pc;
    		u2 handler_pc;
    		u2 catch_type;
    	}exception_table[exception_table_length];
    	u2 attribute_count;
    	attribute_info attributes[attribute_count];
    }
    

    其中attribute_name_index则是属性名的索引,也就是Code,接下来还有一些信息下面来解释一下:

    • attribute_length表示attribute所包含的字节数,不包含attribute_name_index和attribute_length字段。
      在这里插入图片描述
      说的是什么意思呢?比如attribute_length=50个字节,则是指往后的50个字节则为整个Code属性的信息,所以往后先数4个字节咱们来看一看长度:
      在这里插入图片描述
      0x0038转为10进制后的值为56,即属性的长度是56,所以往后56个字节为具体code属性信息,如下:
      在这里插入图片描述
      那咱们来jclasslib中来确认一下是否也是显示的56个字节,如下:

    在这里插入图片描述

    • max_stack表示这个方法运行的任何时刻所能达到的操作数栈的最大深度。

    在这里插入图片描述
    也就是在上面56个字节从头数2个字节,则是这个操作数栈的最大深度,咱们来看一下:
    在这里插入图片描述
    也就是最大的深度为2。如javap -verbose所示:

    在这里插入图片描述

    • max_locals表示方法执行期间创建的局部变量的数目,包含用来表示传入的参数的局部变量。
      在这里插入图片描述
      再继续读2个字节:
      在这里插入图片描述
      也就是局部变量的数目为1,如javap -verbose所示:
      在这里插入图片描述

    • code_length表示该方法所包含的字节码的字节数以及具体的指令码。具体指令码既是该方法被调用时,虚拟机所执行的字节码。
      在这里插入图片描述
      在这里插入图片描述
      也就是占10个字节,所以往后数10个字节:
      在这里插入图片描述
      其实这10个字节是对应在jclasslib中的代码助记符的信息,如下:
      在这里插入图片描述
      所以问题就来了,aload_0不是助记符信息么,怎么就能够跟字节码文件中的字节对应上呢?所谓助记符其实也就是帮忙我们去记忆的符合,在底层其实也是对应的一个个十六进制的数字的,其它aload_0对应的就是2A这个十六进制数字,凭什么这么说?因为有jclasslib这么好的工具能帮我们对应上,将鼠标放在助记符上发现是一个可以点的链接,点一下“aload_0”发现居然链到了oracle的官网上的说明上去了,如下:
      在这里插入图片描述
      在这里插入图片描述

    在这里插入图片描述

    所以第一个字节已经分析完了,确实是跟助记符对应上了,接着来分析第二个字节:
    在这里插入图片描述
    而在jsclasslib中对应的第二个助记符是“invokespecial”,点击链到官网看一下:

    在这里插入图片描述
    而它的作用可以理解成就是调用父类的方法,很明显对于咱们自定义的子类肯定会去调用父类的构造方法,而这个助记符是有参数的:
    在这里插入图片描述
    其实也就是往后的两个字节就是该助记符所对应的参数,如下:
    在这里插入图片描述
    对应常量池为:

    在这里插入图片描述
    也就是构造方法嘛,如jsclasslib所示:

    在这里插入图片描述
    接下来继续往下走一个字节:
    在这里插入图片描述
    对应的code结构中的aload_0,如下:
    在这里插入图片描述
    接下来再往后看一个字节:
    在这里插入图片描述
    对应的就是Code结构中的下一个属性:
    在这里插入图片描述
    为啥如此任性呢?因为点击查看以下说明就晓了:
    在这里插入图片描述
    为啥要push一个1呢?实际就是给咋们定义的成员变量a赋值,如下:
    在这里插入图片描述
    可见,该变量的赋值是再默认构造函数中进行的,而不是直接进行赋值的,这也就是分析字节码文件的好处,可以更加真实的发现底层细节。
    接下来再数一个字节:
    在这里插入图片描述
    它对应的方法中Code结构的注记符是:putfield。
    在这里插入图片描述
    点击看一下官网说明:
    在这里插入图片描述
    接下来的注记符是带有参数的,所以再往后数两个字节:
    在这里插入图片描述
    对应的常量池:
    在这里插入图片描述
    也就说给MyTest01的成员变量a赋值为1。
    接下来再数一个字节:
    在这里插入图片描述
    对应的注记符如下:
    在这里插入图片描述
    点击链接:

    在这里插入图片描述
    至此整个构造方法就执行完成了。发现通过分析字节码也能获得不少新知识嘛,仅通过这个构造函数的执行流程就能知道了对于我们定义的成员变量原来是再构造方法中进行赋值而非直接赋值的,还是挺有价值的。

    好,方法的code分析完成之后,则就得往下进行分析了,先来查看一下结构类型:
    在这里插入图片描述
    也就是再数两个字节,看一下:
    在这里插入图片描述
    说明该方法木有异常信息,所以接下来的异常表就不会显示再字节码文件当中了:

    在这里插入图片描述
    其中关于异常还需要解释一下:

    • exception_table,这里存放的是处理异常的信息。
    • 每个exception_table表项有start_pc、end_pc、handler_pc、catch_type组成。
    • start_pc和end_pc表示再code数组中的start_pc到end_pc处(包含start_pc,不包含end_pc)的指令抛出异常会由这个表项来处理。
    • handler_pc表示处理异常的代码的开始处。catch_type表示会处理异常类型,它指向常量池的异常类。当catch_type为0时,表示处理所有的异常。

    接下来就到属性相关的东东了,如下:
    在这里插入图片描述
    所以往下数2个字节:
    在这里插入图片描述
    说明该方法有两个属性,往下数两个字节则是第一个属性的名字索引,如下:
    在这里插入图片描述
    也就是对应第10的常量池,为:
    在这里插入图片描述
    该属性用来表示code数组中的字节码和Java代码行数之间的关系。这个属性可以用来在调试的时候定位代码执行的行数。而该属性的结构为:
    在这里插入图片描述
    其中attribute_name_index就是常量索引10,接下来4个字节则时属性的长度attribute_length,如下:
    在这里插入图片描述
    也就是属性的长度为10,也是就接下来10个字节则为LineNumberTable的属性信息,如下:
    在这里插入图片描述

    看一下jclasslib:
    在这里插入图片描述
    下面具体来分析一下这10个字节,根据结构体来看:
    在这里插入图片描述
    先2个字节表示属性表有几对映射,如下:
    在这里插入图片描述
    说明有两对映射,然后再回到结构体中,每对映射的内容为:
    在这里插入图片描述
    每对占4个字节,先看第一对映射:
    在这里插入图片描述
    也就是start_pc=0;line_number=8,对应于jclasslib:
    在这里插入图片描述
    由于咱们源代码木有构造方法,所以字节码对应源代码就在第8行,如下:
    在这里插入图片描述

    接下来看第二对映射:
    在这里插入图片描述
    也就是start_pc=4,line_number=8,对应于jclasslib:
    在这里插入图片描述
    因为成员变量的赋值是在构造方法中完成的,所以对应第10行代码:
    在这里插入图片描述
    好,方法的第一个属性已经完了,接下来以同样的顺序来查看方法的第二个属性信息了,走2个字节来看属性名称索引,如下:
    在这里插入图片描述
    对应第11个常量池索引,如下:
    在这里插入图片描述
    它的结构跟LineNumberTable差不多的,往后数4个字节则是局部变量表所占的长度:
    在这里插入图片描述

    在这里插入图片描述

    长度为12,如jclasslib所示:
    在这里插入图片描述
    然后往后数12个字节则是局部变量的具体信息,首先两个字节则为局部变量的个数:如下:

    在这里插入图片描述
    额,构造方法哪来的局部变量呢?好奇快,先不管,先来把其他字节分析完成,再往后四个字节表示start_pc和length,如下:
    在这里插入图片描述
    如jclasslib所示:
    在这里插入图片描述
    接下来则为局部变量的索引为0,也就是第一个局部变量:
    在这里插入图片描述
    再往后两个字节则是局部变量对应常量池的索引,如下:

    在这里插入图片描述
    在这里插入图片描述
    再接下来两个字节则是对局部变量的一个描述常量索引,如下:

    在这里插入图片描述
    所以对应jclasslib中可以看到:
    在这里插入图片描述
    那思考一下为啥构造方法中会有一个this的局部变量呢?我们知道在所有方法中我们都能使用this关键字来访问当前的对象,而从字节层面来讲其实this是作为方法的第一个参数传进来的,也就是说对于java的一个实例方法而言,最少会有一个this的局部变量存在。

    还剩最后两个字节则为stackmaptable信息,JDK1.6加入的,主要做校验检查的,因为0嘛,所以后面肯定木有相关的信息了,这里就直接忽略,如下:
    在这里插入图片描述

    这里就已经将编译器生成的默认构造方法的字节相关的分析完成了接下来继续分析自定义的方法啦,按照顺序来讲的话,应该是分析getA();
    在这里插入图片描述
    还是按照方法的结构来分析,先回忆一下方法的结构:

    method_info{
    	u2 access_flag;
    	u2 name_index;
    	u2 descriptor_index;
    	u2 attribute_count;
    	attribute_info attributes[attribute_count];
    }
    

    前两个字节表示访问修饰符,所以跟着上次分析的位置数两个字节:
    在这里插入图片描述
    根据方法表修饰符可知,0x0001的修饰符是ACC_PUBLIC,
    接着4个字节分别表示方法名称的索引记忆方法描述符的索引,如下:

    在这里插入图片描述
    所以数4个字节:
    在这里插入图片描述
    对应常量池14、15,如下:
    在这里插入图片描述
    确实如咱们的猜想,第二个方法就是getA(),好,继续往下分析:

    在这里插入图片描述
    表示方法的属性个数,所以往下数两个字节:
    在这里插入图片描述
    所以说明只有一个属性,接着再数2个字节则表示属性的名称索引,如下:
    在这里插入图片描述
    对应常量池:
    在这里插入图片描述
    如之前所述:每个方法都有一个对应的Code属性, 所以接下来就得来看一下Code属性结构体了,如下:
    在这里插入图片描述
    接着就是attribute_length了,往下数4个字节
    在这里插入图片描述
    说明整个Code长度为47个字节,对比一下jclasslib所示:
    在这里插入图片描述
    继续往下:往下两个字节为:
    在这里插入图片描述
    所以往下4个字节为:

    在这里插入图片描述

    • max_statck表示这个方法运行的任何时刻都能达到的操作数栈的最大深度为1;
    • max_locals表示方法执行期间创建的局部变量的个数为1,而getA()方法压根就没有定义局部变量,根据之前分析的默认构造方法可以得知此局部变量为编译器生成的this变量。

    继续往下:
    在这里插入图片描述
    在这里插入图片描述
    长度为5,表示往后5个字节则为对应在jclasslib中代码注记符的信息,也就是方法的执行体,如下:
    在这里插入图片描述
    第一个字节为:
    在这里插入图片描述
    刚好对应aload_0,如下:
    在这里插入图片描述
    在这里插入图片描述
    接着第二个字节

    在这里插入图片描述
    对应注记符为:
    在这里插入图片描述
    看一下官网对它的解释:

    在这里插入图片描述
    而且它是有参数的,所以往后两个字节:

    在这里插入图片描述
    对应常量为:

    在这里插入图片描述
    所以如jclasslib所看到的:

    接下来看最后一个Code的字节,如下:

    在这里插入图片描述
    对应的注记符为:
    在这里插入图片描述
    查看官网说明:
    在这里插入图片描述
    好,接下来则是异常表的信息,如下:
    在这里插入图片描述

    往后数两个字节:
    在这里插入图片描述
    因为该方法木有异常,所以为0,那异常信息就可以忽略了,如下:

    在这里插入图片描述
    接下来则到属性相关的东东了,如下:

    在这里插入图片描述
    往后数两个字节:

    在这里插入图片描述
    说明有两个属性,往下数两个字节则是第一个属性的名字索引,如下:

    在这里插入图片描述

    查看常量池:
    在这里插入图片描述

    表示的是行号表,所以此时就要看一下行号表的结构体了:
    在这里插入图片描述
    接下来4个字节则是属性的长度attribute_length,如下:
    在这里插入图片描述

    所以接下来的6个字符则为该行号表的信息,如下:
    在这里插入图片描述

    看一下jclasslib:
    在这里插入图片描述

    下面具体来分析一下这10个字节,根据结构体来看:
    在这里插入图片描述
    先2个字节表示属性表有几对映射,如下:
    在这里插入图片描述
    说明有一对映射,然后再回到结构体中,每对映射的内容为:
    在这里插入图片描述
    每对映射占4个字节,所以:
    在这里插入图片描述

    也就是start_pc=0;line_number=7,对应于jclasslib:
    在这里插入图片描述

    对应的源代码为:
    在这里插入图片描述

    好,方法的第一个属性已经完了,接下来以同样的顺序来查看方法的第二个属性信息了,走2个字节来看属性名称索引,如下:
    在这里插入图片描述
    对应的常量表:
    在这里插入图片描述

    它的结构跟LineNumberTable差不多的,往后数四个字节则是局部变量表所占的长度:

    在这里插入图片描述
    在这里插入图片描述
    长度为12,如jclasslib所示:
    在这里插入图片描述
    然后往后数12个字节则是局部变量的具体信息,如下:
    在这里插入图片描述
    首先两个字节则为局部变量的个数,如下:
    在这里插入图片描述

    说明有一个局部变量,再往后四个字节表示start_pc和length,如下:
    在这里插入图片描述
    如jclasslib所示:
    同时,局部变量的索引为0,也就是第一个局部变量,如下:

    在这里插入图片描述
    再往后两个个字节则是局部变量对应常量池的索引,如下:

    在这里插入图片描述
    在这里插入图片描述
    再接下来两个字节则是对该局部变量的一个描述常量索引,如下:

    在这里插入图片描述
    在这里插入图片描述
    即this的索引为第13行

    所以对应jclasslib中可以看到:
    在这里插入图片描述
    从这个分析又能证明,对于实例方法,都会有一个this局部变量存在的。

    还剩最后两个字节则为stackmaptable信息,JDK1.6加入的,主要做校验检查的,因为0嘛所以后面肯定木有相关的信息了,这里就直接忽略,如下:

    在这里插入图片描述

    至此getA()方法就已经完全分析完了,接着就是第二个方法setA()了:

    所以还得来依据方法表来进行分析:

    在这里插入图片描述
    前两个字节表示访问修饰符:

    在这里插入图片描述
    根据方法表修饰符可知,0x0001对应地修饰符为:ACC_PUBLIC。

    接着4个字节分别表示方法名称地索引以及方法描述符地索引,如下:
    在这里插入图片描述

    在这里插入图片描述

    对应常量池地16,17,如下:
    在这里插入图片描述

    正如我们所看到的,继续往下分析:

    在这里插入图片描述
    表示方法的属性个数,所以往下数两个字节:
    在这里插入图片描述
    所以说明只有一个属性,接着再数2个字节则表示属性的名称索引,如下:
    在这里插入图片描述

    对应常量池:

    在这里插入图片描述

    是不是对它异常的亲切了,每个方法必然会有这个属性,所以接下来就得来看一下Code属性结构体了,如下:

    在这里插入图片描述

    接着则是attribute_length了,往下数四个字节:
    在这里插入图片描述
    说明整个Code的长度为62个字节,对比一下jclasslib所示:
    在这里插入图片描述
    继续往下:往下两个字节为:

    在这里插入图片描述

    所以往后数4个字节:
    在这里插入图片描述

    max_stack表示这个方法运行的任何时刻所能达到的操作数栈的最大深度为2;max_locals表示方法执行期间创建的局部变量的数目为2,为啥这次变为2个局部变量了呢?因为第一个是隐式的this,第二个则为方法的int参数。

    继续往下:
    在这里插入图片描述
    表示该方法所包含的字节码的字节数以及具体的指令码,所以往后数4个字节:

    在这里插入图片描述
    长度为6,所以往后再数6个字节则为对应在jclasslib中的代码助记符的信息,也就是方法的执行体,如下:

    在这里插入图片描述

    第一个字节为:
    在这里插入图片描述

    刚好对应aload_0,如下:

    在这里插入图片描述

    在这里插入图片描述

    接着第二个字节:
    在这里插入图片描述
    对应助记符为:
    在这里插入图片描述
    看一下官网对它的解释:
    第三个字节:
    在这里插入图片描述

    对应的注记符为:
    在这里插入图片描述
    看一下官网对他的解释:
    在这里插入图片描述
    而且它是有参数的,所以往后数两个字节:
    在这里插入图片描述

    对应常量池为:
    在这里插入图片描述
    所以如jclasslib所看到的:
    在这里插入图片描述

    接下来最后一个Code的字节,如下:

    在这里插入图片描述

    对应助记符为:

    在这里插入图片描述

    至此setA()方法的执行体就已经分析完了。

    好,接下来则是异常表的信息,如下:

    在这里插入图片描述

    往后数2个字节:
    在这里插入图片描述
    因为该方法木有异常,所以为0,那异常信息就可以忽略了,如下:

    在这里插入图片描述

    接下来则到属性相关的东东了,如下:

    在这里插入图片描述

    往后数两个字节:

    在这里插入图片描述

    说明该方法有两个属性,往下数两个字节则是第一个属性的名字索引,如下:

    在这里插入图片描述
    也就是对应常量池10,为:
    在这里插入图片描述

    该属性用来表示code数组中的字节码和Java代码行数之间的关系。这个属性可以用来在调试的时候定位代码执行的行数。而该属性的结构为:

    在这里插入图片描述

    其中attribute_name_index就是常量索引10,接下来数4个字节则是属性的长度attribute_length,如下:

    在这里插入图片描述
    也就是属性的长度为10,也就是接下来10个字节则为LineNumberTable的属性信息,如下:

    在这里插入图片描述
    看一下jclasslib:
    在这里插入图片描述

    下面具体来分析一下这10个字节,根据结构体来看:

    在这里插入图片描述
    先2个字节表示属性表有几对映射,如下:
    在这里插入图片描述

    说明有两对映射,然后再回到结构体中,每对映射的内容为:
    在这里插入图片描述
    每对占4个字节,先看第一对映射:
    在这里插入图片描述

    也就是start_pc=0;line_number=17,对应于jclasslib:

    在这里插入图片描述

    对应源代码:

    在这里插入图片描述

    接下来看第二对映射:

    在这里插入图片描述

    也就是start_pc=5;line_number=18,对应于jclasslib:

    在这里插入图片描述
    对应源代码:

    在这里插入图片描述

    好,方法的第一个属性已经完了,接下来以同样的顺序来查看方法的第二个属性信息了,走2个字节来看属性名称索引,如下:

    在这里插入图片描述
    对应第11个常量池索引,如下:
    在这里插入图片描述
    它的结构跟LineNumberTable差不多的,往后数四个字节则是局部变量表所占的长度:
    在这里插入图片描述
    在这里插入图片描述

    长度为22,如jclasslib所示:

    在这里插入图片描述
    然后往后数12个字节则是局部变量的具体信息,首先两个字节则为局部变量的个数,如下:

    在这里插入图片描述

    先分析第一个局部变量,往后四个字节表示start_pc和length,如下:

    在这里插入图片描述

    如jclasslib所示:

    在这里插入图片描述
    接下则为局部变量的索引为0,也就是第一个局部变量,如下

    在这里插入图片描述
    再往后两个字节则是局部变量对应常量池的索引,如下:

    在这里插入图片描述
    在这里插入图片描述

    再接下来两个字节则是对该局部变量的一个描述常量索引,如下:
    在这里插入图片描述
    在这里插入图片描述

    所以对应jclasslib中可以看到:

    在这里插入图片描述
    还剩最后两个字节则为stackmaptable信息,JDK1.6加入的,主要做校验检查的,因为0嘛所以后面肯定木有相关的信息了,这里就直接忽略,如下:
    在这里插入图片描述
    再来分析第二个局部变量,往后四个字节表示start_pc和length,如下:
    在这里插入图片描述

    在这里插入图片描述

    接下来则为局部变量的索引为1,也就是第二个局部变量:

    在这里插入图片描述

    在这里插入图片描述

    再接下来两个字节则是对该局部变量的一个描述常量索引,如下:

    在这里插入图片描述
    在这里插入图片描述
    如jclasslib:

    在这里插入图片描述

    还剩最后两个字节则为stackmaptable信息,JDK1.6加入的,主要做校验检查的,这里就直接忽略,如下:
    在这里插入图片描述

    至此!!所有类中的方法相关的字节码就全部分析完了,确实够麻烦,最后则是类的属性信息了如下:
    在这里插入图片描述
    往后两个字节则表明字节码属性的长度:

    在这里插入图片描述

    有一个文件属性,往后两个字节则为属性名称的常量池索引,如下:

    在这里插入图片描述

    对应常量池:

    在这里插入图片描述

    再往后四个字节则为属性所占字节的长度:

    在这里插入图片描述
    说明attribute_length占2个字节,也就是最后剩的两个字节,如下:
    在这里插入图片描述
    对应常量:

    在这里插入图片描述

    如jclasslib所示:
    在这里插入图片描述
    至此,MyTest01字节码文件就分析完毕,好繁琐呀,好无聊呀。。。

    文章参考:https://www.cnblogs.com/webor2006/
    书本参考:《Java虚拟机规范 Java SE 8版.pdf》

    展开全文
  • 今天有一个需求,是要把一个pdf文件压缩,再进行传输,而我已经对pdf进行了本地备份,所以对zip文件不作备份,直接转为字节流,进行操作 FileInputStream fis = null; ByteArrayOutputStream bos = null; File ...

    今天有一个需求,是要把一个pdf文件压缩,再进行传输,而我已经对pdf进行了本地备份,所以对zip文件不作备份,直接转为字节流,进行操作

                    FileInputStream fis = null;
                    ByteArrayOutputStream bos = null;

                    File fileEd = new File(clientPath + "\\bak\\" + pdfFileName);
                    fis = new FileInputStream(fileEd);
                    bos = new ByteArrayOutputStream(fis.available());
                    byte[] b = new byte[fis.available()];
                    int n;
                    while ((n = fis.read(b)) != -1) {
                        bos.write(b, 0, n);
                    }
                    bos.flush();

                   byte[] buff = zip(fileName,b);

    /**

    * @param fileName zip文件名

    * @param content 文件的字节流

    */

    public static byte[] zip(String fileName,byte[] content) throws Exception  {
            byte[] b = null;

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ZipOutputStream zip = new ZipOutputStream(bos);

            ZipEntry entry = new ZipEntry(fileName);

            entry.setSize(content.length);
            zip.putNextEntry(entry);
            zip.write(content);
            zip.closeEntry();
            zip.close();
            b = bos.toByteArray();
            bos.close();

            return b;
    }

    展开全文
  • Java跨平台的本质就是中间产物.class,Java文件经过javac编译后生成字节文件(.class),再由JVM通过对字节码指令的解释执行,从而屏蔽对操作系统的依赖
  • Android: .java文件转.dex和java字节

    千次阅读 2016-12-16 15:13:43
    一、.java文件转.dex 首先将 .java 文件转成 .class 文件(例如:Hello.java) javac Hello.java —> 得到Hello.class [这里有一个坑,请大家注意:如果你的java版本是1.7的话,在转dex文件的时候很有可能会报错,请...
  • java 字节数组byte[]转为double[]数组

    千次阅读 2020-01-15 17:42:35
    读二进制文件文件里面是double型二进制数据,共32个字节,对应的十进制数是1.0,2.0,3.0,4.0)。把32字节的byte[]数组,每8个字节转一个double,转成了一个double列表。代码如下: import java.io.*; import java....
  • Java字节码详解(一) class文件结构

    千次阅读 2018-10-21 16:08:54
    java字节码详解-各个字段属性的意义
  • java文件转化为class字节文件

    千次阅读 2018-10-18 22:23:13
    1.在桌面上编写.java文件 public class calculator { public static void main(String[] args) { int num1 = 7; int num2 = 5; int _sum =num1 +num2; int minus = num1 - num2; int Sum...
  • Java 字节流转化为文件

    千次阅读 2012-02-17 15:46:20
    已知:byte[] bytes=new...上面是别人给的,转化为数组类型的二进制文件流。 下面我要实现的是,把二进制码转化为文件存储到指定的目录,代码实现如下: public int TurnFile(String fileStream,String path) {...
  • Java字节读写二进制文件

    千次阅读 2016-07-01 16:10:01
    java字节读写文件(Base64编码解码)最近在做项目时遇到这样一个需求:依次读取本地文件夹里所有文件的内容,转为JSON,发送到ActiveMQ的消息队列, 然后从MQ的消息队列上获取文件的信息,依次写到本地。...
  • java之解读class字节文件,打开jvm大门

    多人点赞 热门讨论 2020-05-12 23:37:13
    亲爱的java程序员:一定,一定,一定要学会解读class字节文件!!! 1.JVM体系结构以及class文件位置: 2.编写程序、编译、打开class文件: 3.怎么解读class文件中十六进制信息? 3.1.初步理解解读class文件组成图...
  • * 将文件转化为字节数组 * @param filePath * @return * @throws IOException */ public byte[] toByteArray(String filePath) throws IOException { InputStream inputStream = new FileInputStream(fil...
  • IO_缓冲流_转换流_字节转为字符_乱码分析_编码与解码JAVA152-154
  • java文件转为字节数组 /** * 将文件转为字节 * @param listPd * @return */ public static byte[] t3(String path){ File file = new File("F:/util02/apache-tomcat-8.5....
  • java 中如何把文件(file)转化字节数组呢? 方式一: /** * 文件转换为二进制数组 * * @param file 文件对象 * @return * @throws IOException */ public static byte[] fileTobytes(final File ...
  • 前一章讲述了java字节文件的生成以及字节码文件中各个字段代表的含义,在本章节将讲述字节码是什么运行的 JVM的一些基础概念 要理解java字节码的运行情况,首先要了解有关JVM的一些知识,这些是java字节码运行的...
  • Java 字节数组流之图片转成字节数组,相当于图片的复制 字符串可以直接读取到字节数组中用(getBytes)   问题:将一张图片读到字节数组里面(所有的东西都能够读到字节数组里面) 思路:先使用文件输入流,通过...
  • Java把一个文件转化为byte字节数组

    万次阅读 2018-10-17 18:40:29
    Java把一个文件转化为byte字节数组 /** * 把一个文件转化为byte字节数组。 * * @return */ private byte[] fileConvertToByteArray(File file) { byte[] data = null; try { File...
  • JAVA读取FTP文件转为字符串

    千次阅读 2016-03-15 10:18:17
    从FTP服务器读取文件,并以字符串形式输出内容 其中包含了FTP读文件文件转字符串两方面,需要的朋友自己拆分功能 本代码依赖commons-net-3.4.jar,请自行度娘下载 ReadFile.java package ...
  • java将pdf文件转为word

    2018-07-30 18:13:00
    import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.Writer; import org.apache.pdfbox.pdmodel.PDDocument;import org.apach...
  • 让编译器把C语言代码中对数组的相关操作编译成java字节
  • 将Jar包中的.class(字节码)文件转成.java源码文件       给大家安利一个隐藏形福利,通过一个工具快速的将jar包中的字节文件(.class)转换成java源文件(.java),说起来我要介绍的...
  • Java Excel文件生成后转化为字节数组

    千次阅读 2018-09-12 15:24:45
    Java Excel 使用 POI组件, HSSFWorkbook workBook = new HSSFWorkbook();  对于workBook生成字节流,有一个workBook .getBytes(),但是这个方法下载以后打不开,因为它只保存了HSSF部分字节(API文档说明...
  • 修改Java字节

    千次阅读 2019-03-24 17:04:20
    下载工具asmtools 下载链接:...提取码:72ke 操作字节 public class Foo { public static void main(String[] args) { boolean flag = true; if (flag) { System.out.prin...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,216
精华内容 12,086
关键字:

java字节转为文件

java 订阅