【问题标题】:Appending Chars to a file将字符附加到文件
【发布时间】:2014-01-25 00:07:11
【问题描述】:

我有以下String[]

63,64,65,66,67,68,69,6A,73,74,75,76,77,78,79,7A,
83,84,85,86,87,88,89,8A,92,93,94,95,96,97,98,99

每个元素都是一个字符的 HEX ASCII 码:

63 -> 'c'
64 -> 'd'
etc..

所以这里是我代码的 relevant 部分,它应该在文件中写入相应的 ASCII 字符:

private static HashMap<String, Integer> HEXMAP;
static {
    HEXMAP = new HashMap<String, Integer>();
    HEXMAP.put("0", 0);
    HEXMAP.put("1", 1);
    HEXMAP.put("2", 2);
    HEXMAP.put("3", 3);
    HEXMAP.put("4", 4);
    HEXMAP.put("5", 5);
    HEXMAP.put("6", 6);
    HEXMAP.put("7", 7);
    HEXMAP.put("8", 8);
    HEXMAP.put("9", 9);
    HEXMAP.put("A", 10);
    HEXMAP.put("B", 11);
    HEXMAP.put("C", 12);
    HEXMAP.put("D", 13);
    HEXMAP.put("E", 14);
    HEXMAP.put("F", 15);
}


public static void main(String[] args) {
    try {
        PrintWriter writer = new PrintWriter("resultFile");
        for (String str : myString) {
            append(str, writer);
        }
        writer.close();
    }
    catch(Exception e) {

    }
}

private static int strToHex(String str) {
    return HEXMAP.get(str.substring(0, 1)) * 16 + HEXMAP.get(str.substring(1, 2));
}

private static void append(String hex, PrintWriter writer) {
    writer.print((char) strToHex(hex));
}

问题是,而不是这样:

我的结果文件中有以下内容:

(以上截图来自十六进制编辑器)

【问题讨论】:

  • 什么是HEXMAP?这肯定是相关的。
  • 不是真的,但是给你。我确定我的 Str 到 Hex 转换没问题 (strToHex("99") -> 153, strToHex("98") -> 152)。

标签: java hex ascii


【解决方案1】:

java.io.Writer 执行从 Java 'char' 到文件中特定字符编码的转换。如果未明确指定此编码,它将是您计算机的默认编码(取决于您的操作系统的“国家和语言”设置)

在您的情况下,您已经知道要写入文件的字节,因此不应使用Writer 字节,而应使用java.io.OutputStream。写入文件的OutputStream 的子类是java.io.FileOutputStream

在您的示例中将Writer 替换为FileOutputStream,并将对writer.print( 的调用替换为.write(,它应该可以工作。

或者,如果您知道数据所在的编码,则可以将该编码作为第二个参数添加到 new PrintWriter 构造函数调用中。看起来你可能正在使用 ISO-8859-1 编码,所以你也可以说new PrintWriter("resultFile", "ISO-8859-1")。但是,只有当您真的打算以该编码编写字符时才应该这样做,而不是因为它恰好可以工作 - Writer 和 OutputStream 之间有明显的区别。

【讨论】:

    【解决方案2】:

    您需要使用 Eclipse 中的调试器对其进行调试。我想问题在于您将输入解析为 myString 数组。结果,在 7A 之后你会得到一个意外的值,然后你的 append 函数会抛出,并且由于你有一个空的 catch 块,所以异常被吞没了。您可以先将 e.printStackTrace() 添加到 catch 块中。

    【讨论】:

    • 我确实在用Eclipse,而且我的catch块不是空的,我只是放了相关代码而已。
    猜你喜欢
    • 2014-11-18
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 2014-02-25
    • 2014-04-15
    • 2023-01-11
    相关资源
    最近更新 更多