问题1:关于格式化说明符公式的理解
%[argument_index$][flage][width][.precision]conversion 这个格式化说明符的公式
f.format("%-15.15s %5d %10.2f\n", name ,qty , price);
对应公式的部分:
%:就是开头的%-15.15s
[argument_index$]:不知道是什么东西
[flage]:%-15.15s 猜的不知道对不对(意思我知道)
[width]:%-15.15s
[.precision]:%-15.15s
conversion:%-15.15s
请帮我看下理解的是否正确,并且请指出[argument_index$]等于什么.
问题2:下面代码有2个地方看不懂,请帮忙解释下
import java.io.*;public class Hex {
  public static String format(byte[] data) {
    StringBuilder result = new StringBuilder();
    int n = 0;
    for(byte b : data) {
      if(n % 16 == 0)
        result.append(String.format("%05X: ", n));  //问题2.1:这里的n第一次循环是0,第二次1..可是这里的%05X什么意思呢?
      result.append(String.format("%02X ", b));
      n++;
      if(n % 16 == 0) result.append("\n");
    }
    result.append("\n");
    return result.toString();
  }
  public static void main(String[] args) throws Exception {
    if(args.length == 0)  //问题2.2:我对args.length这句代码不太理解,args表示 main 方法命令行,可是这要有这句话它就是
//true了,那么他的意义在哪呢?
      System.out.println(
        format(BinaryFile.read("Hex.class")));
    else
      System.out.println(
        format(BinaryFile.read(new File(args[0]))));
  }
} /* Output: (Sample)
00000: CA FE BA BE 00 00 00 31 00 52 0A 00 05 00 22 07
00010: 00 23 0A 00 02 00 22 08 00 24 07 00 25 0A 00 26
00020: 00 27 0A 00 28 00 29 0A 00 02 00 2A 08 00 2B 0A
00030: 00 2C 00 2D 08 00 2E 0A 00 02 00 2F 09 00 30 00
00040: 31 08 00 32 0A 00 33 00 34 0A 00 15 00 35 0A 00
00050: 36 00 37 07 00 38 0A 00 12 00 39 0A 00 33 00 3A
...
*/

解决方案 »

  1.   

    可选的 argument_index 是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由 "1$" 引用,第二个参数由 "2$" 引用,依此类推。
    可选的 flags 是修改输出格式的字符集。有效标志的集合取决于转换类型。
    可选 width 是一个非负十进制整数,表明要向输出中写入的最少字符数。
    可选 precision 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。
    所需的 conversion 是一个表明应该如何格式化参数的字符。给定参数的有效转换集合取决于参数的数据类型。
    ================================================
     
    %[flags][width]conversion可选 flags 和 width 的定义同上。
    所需的 conversion 是一个表明要在输出中所插内容的字符。
    =====================================================转换'b', 'B'  常规  如果参数 arg 为 null,则结果为 "false"。如果 arg 是一个 boolean 值或 Boolean,则结果为 String.valueOf() 返回的字符串。否则结果为 "true"。 
    'h', 'H'  常规  如果参数 arg 为 null,则结果为 "null"。否则,结果为调用 Integer.toHexString(arg.hashCode()) 得到的结果。 
    's', 'S'  常规  如果参数 arg 为 null,则结果为 "null"。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。 
    'c', 'C'  字符  结果是一个 Unicode 字符 
    'd'  整数  结果被格式化为十进制整数 
    'o'  整数  结果被格式化为八进制整数 
    'x', 'X'  整数  结果被格式化为十六进制整数 
    'e', 'E'  浮点  结果被格式化为用计算机科学记数法表示的十进制数 
    'f'  浮点  结果被格式化为十进制数 
    'g', 'G'  浮点  根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。 
    'a', 'A'  浮点  结果被格式化为带有效位数和指数的十六进制浮点数 
    't', 'T'  日期/时间  日期和时间转换字符的前缀。请参阅日期/时间转换。 
    '%'  百分比  结果为字面值 '%' ('\u0025') 
    'n'  行分隔符  结果为特定于平台的行分隔符 
    ===========================================标志标志 常规 字符 整数 浮点 日期/时间 说明 
    '-' y     y     y     y     y 结果将是左对齐的。 
    '#' y1     -     y3     y     -     结果应该使用依赖于转换类型的替换形式 
    '+' -     -     y4     y     -     结果总是包括一个符号 
    '   ' -     -     y4     y     -     对于正值,结果中将包括一个前导空格 
    '0' -     -     y     y     -     结果将用零来填充 
    ',' -     -     y2     y5     -     结果将包括特定于语言环境的组分隔符 
    '(' -     -     y4     y5     -     结果将是用圆括号括起来的负数 
    ==================================================================
    %-15.15s对应参数name
    [argument_index$]:无
    [flage]:-(结果左对齐) 
    [width]:15 (最小长度为15)
    [.precision]:.15(精度为15)
    conversion:s(如果参数 arg 为 null,则结果为 "null"。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。) 
    %5d 对应参数为qty
    [width]:5 (最小长度为5)
    conversion:d (整数 结果被格式化为十进制整数)%10.2f对应参数price
    [width]:10(最小长度为10)
    [.precision]:.2(精度为2)
    conversion:f(浮点  结果被格式化为十进制数)最后的\n是添加到后面的换行符
    =======================================================
    问题2.1 当n为16的整倍数时,将n转化为"%05X:"格式,其实就是00000: 
    问题2.2 args.length == 0为true就是你运行main函数时没有输入参数哈,这时就读取Hex.class这个文件
    当不等于0时,就读取参数的文件new File(args[0]) args[0]是命令的第一个参数
    要给我分哦
      

  2.   

    与参数不对应的格式说明符的语法如下:
    %[flags][width]conversion可选 flags 和 width 的定义同上。
    所需的 conversion 是一个表明要在输出中所插内容的字符。 
    改个地方