【IT168 技术文档】一个读取Class文件的示例程序
1package bytecodeResearch; 2 3import java.io.BufferedInputStream; 4import java.io.BufferedWriter; 5import java.io.FileInputStream; 6import java.io.FileWriter; 7import java.io.IOException; 8 9public class ReadAndWriteClass { 10 11 //16进制数字字符集 12 private static String hexString = "0123456789ABCDEF"; 13 14 /** *//** 15 * 将字节数组的指定长度部分编码成16进制数字字符串 16 * @param buffer 待编码的字节数组 17 * @param length 指定的长度 18 * @return 编码后连接而成的字符串 19 */ 20 public static String encode(byte[] buffer,int length) 21 { 22 StringBuilder sbr = new StringBuilder(); 23 //将字节数组中每个字节拆解成2位16进制整数 24 for(int i=0;i 25 { 26 sbr.append(hexString.charAt((buffer[i]&0xf0)>>4)); 27 sbr.append(hexString.charAt(buffer[i]&0x0f)); 28 sbr.append(" "); 29 } 30 return sbr.toString(); 31 } 32 33 /** *//** 34 * 读取一个Class文件,将其所有字节转换为16进制整数,并以字符形式输出 35 * @param inputPath 输入文件的完整路径 36 * @param outputPath 输出文件的完整路径 37 * @throws IOException 读写过程中可能抛出的异常 38 */ 39 public static void rwclass(String inputPath, String outputPath) throws IOException 40 { 41 //读取Class文件要用字节输入流 42 BufferedInputStream bis = new BufferedInputStream( 43 new FileInputStream(inputPath)); 44 //输出转换后的文件要用字符输出流 45 BufferedWriter bw = new BufferedWriter( 46 new FileWriter(outputPath)); 47 48 int readSize = 16; 49 byte[] buffer_read = new byte[readSize]; 50 String line; 51 String lineNumber = "0000000"; 52 String strReplace; 53 int i = 0; 54 while ((readSize = bis.read(buffer_read,0,readSize))!= -1) 55 { 56 line = encode(buffer_read,readSize); 57 strReplace = Integer.toHexString(i); 58 lineNumber = lineNumber.substring(0, 7-strReplace.length()); 59 lineNumber = lineNumber+strReplace; 60 line = lineNumber+"0h: "+line; 61 bw.write(line); 62 bw.newLine(); 63 i++; 64 } 65 bis.close(); 66 bw.close(); 67 } 68 69 /** *//** 70 * 程序的入口方法 71 * @param args 72 * @throws IOException 73 */ 74 public static void main(String[] args) 75 { 76 //指定输入、输出文件的完整路径 77 String inputPath = "L:/HelloWorld/HelloWorld.class"; 78 String outputPath = "L:/HelloWorld/HelloWorld_ByteCode.txt"; 79 80 try { 81 rwclass(inputPath, outputPath); 82 System.out.println("Successfully !"); 83 } catch (IOException ioe) { 84 System.err.println("Something wrong with reading or writing !"); 85 ioe.printStackTrace(); 86 } 87 88 } 89 90} 91