【问题标题】:How to avoid individual casting to byte during initialization of byte array in Java如何在Java中初始化字节数组期间避免单独转换为字节
【发布时间】:2015-10-21 10:44:09
【问题描述】:

我正在使用字节数组在文件系统之外存储一个文本文件。

看起来像这样:

private static final byte[] CDRIVES = new byte[] {
        (byte)0xe0, 0x4f, (byte)0xd0, 0x20, (byte)0xea, 0x3a, 0x69, 0x10,
        (byte)0xa2, (byte)0xd8, 0x08, 0x00, 0x2b, 0x30, 0x30, (byte)0x9d,
        (byte)0xba, (byte)0x8a, 0x0d, 0x45, 0x25, (byte)0xad, (byte)0xd0, 0x11,
        (byte)0x98, (byte)0xa8, 0x08, 0x00, 0x36, 0x1b, 0x11, 0x03,
        (byte)0x80, 0x53, 0x1c, (byte)0x87, (byte)0xa0, 0x42, 0x69, 0x10,
        (byte)0xa2, (byte)0xea, 0x08, 0x00, 0x2b, 0x30, 0x30, (byte)0x9d
        ...
        ...
        ...
        };

有没有办法避免转换为(字节)以获得更好的视觉解释?

我不介意使用其他数据类型,但我需要能够用它构建一个 InputStream 并尽可能以最快的方式完成它。 (例如将文本文件存储到 String 变量中并不是最好的方法......)

【问题讨论】:

标签: java file casting stream bytearray


【解决方案1】:

一种简单的方法是使用 base64 - 但在类初始化时执行转换,因此您只需要一次性能损失:

private static final byte[] CDRIVES = Base64.decode("YOURBASE64HERE");

或者如果它是真正的文本,以类似的方式执行一次编码:

private static final byte[] CDRIVES =
    "Your constant text here".getBytes(StandardCharsets.UTF_8);

同样,性能损失恰好发生一次,然后您可以多次使用字节。如果在类初始化时将文本编码为字节的成本真的是您的瓶颈,我会感到非常惊讶。

【讨论】:

  • 哇,Jon Skeet 本人的回答 :) 嗯...使用 Base64 不是一个坏主意,问题是使用 Base64.decode 方法将 Base64 字符串转换为字节数组需要一些时间,直接初始化成字节数组更快。 Base64 字符串更难“管理”,因为它不可读且单行。但仍然感谢您跳出框框思考:)
  • @arenaq:这仅在类初始化时执行一次。您的性能要求究竟是什么?您是如何确定这些要求的?在管理方面,这些数据从哪里来?在许多情况下(例如,如果它是一个文件),如果数据发生变化,将其重新编码为 base64 并将该字符串复制/粘贴到代码中会更容易,而不是单独指定每个字节......
  • 嗯...直接使用字节数组初始化,解码将执行零次;)而且由于我的文本文件可能有 1 MB 大并且此代码在 Android 上运行,因此时间很宝贵;)数据将来自一个脚本,该脚本将在输入上有文件,在输出上有这个问题的最佳答案;)
  • @arenaq:如果您的文本文件可能有 1MB 大,那么您真的真的不想在数组初始化程序中这样做。哎呀,到那时你可能会破坏 Java 的各种恒定限制。我建议您查看为数组初始值设定项发出的字节码。我不确定 dex 文件中会发生什么,但在纯 Java 中这是一个非常糟糕的主意。我会非常强烈地敦促您从资源中加载它。当然,时间很宝贵——但这并不意味着你应该忽略更直接的选择。您是否尝试过从资源中加载数据?
  • @arenaq:换一种说法:考虑 Android 上用于游戏的所有资源。它们将比 1MB 大得多。你认为它们都是硬编码的吗?
猜你喜欢
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多