【问题标题】:append bytes to string in java在java中将字节附加到字符串
【发布时间】:2013-09-28 16:04:26
【问题描述】:

我必须处理 ascii 结构化文件,我需要将这两个常量字节放在每一行的末尾,以便我可以尊重给我的文件结构:

private final static int ENDRECORD = 0x0d;
private final static int ENDLINE = 0x0a;

我不知道是不是经典的“\n”,有没有办法可以把这两个变量放在字符串的末尾? 喜欢:

字符串 line = line + ENDRECORD + ENDLINE; //我现在这是错的

【问题讨论】:

    标签: java string append


    【解决方案1】:

    您必须将数据类型更改为char

    String myFullLine = line + (char)ENDRECORD + (char)ENDLINE;
    

    如果您打算在多条线路上执行此操作,我建议您使用 StringBuilder

    【讨论】:

    • 这仍然会给出错误的答案,因为它将附加整数的文本表示。除非有 涉及循环,否则在这里使用 StringBuilder 是没有意义的。单个连接操作很好。
    • 现在有了编辑,它就可以工作了——但 StringBuilder 部分仍然是一个完整的红鲱鱼。
    • 是的,看到了我的错误。我放置 StringBuilder 的原因是因为我假设最终会有更多的在线,并且在这一点上它会比字符串连接更有效。
    • 从帖子中不清楚是否需要任何进一步的连接 is - 当然,您的回答并没有区分使用 StringBuilder 的建议和“修复数据类型” " 真正重要的部分。
    • 好吧,我想我有点跑题了。修好了。
    【解决方案2】:

    只需将常量改为字符串即可:

    private final static String ENDRECORD = "\r";
    private final static String ENDLINE = "\n";
    

    那么你现有的串联应该没问题。

    char 也可以:

    private final static char ENDRECORD = '\r'; // Or (char) 0x0d
    private final static char ENDLINE = '\n';   // Or (char) 0x0a
    

    您应该将字符视为字符,而不是字节或整数值。它将使您的文本处理更加简单。

    【讨论】:

      【解决方案3】:

      你已经接近了。是'\r''\n'

      System.out.println((int) '\r');
      System.out.println((int) '\n');
      

      输出:

      13
      10
      

      分别是0x0d0x0a。使用chars:

      private final static char ENDRECORD = '\r';
      private final static char ENDLINE = '\n';
      

      String line = line + ENDRECORD + ENDLINE;
      

      此外,您可以使用StringBuilder 来提高效率而不是串联。没有必要让它工作,但使用它来构建字符串而不是与+ 连接是标准的。

      【讨论】:

      • 对我们目前看到的代码使用 StringBuilder 并不会更有效。 StringBuilder 非常适合避免 repeated 连接,但是对于我们这里的 single(多值)连接操作,它是没有意义的。
      【解决方案4】:

      您希望这些值是字符而不是整数。

      所以,你可以这样做:

      private static final char ENDRECORD = (char)0x0d;
      private static final char ENDLINE = (char)0x0a;
      ...
      line = line + ENDRECORD + ENDLINE;
      

      我假设您有不止一条记录,因此更好的方法是为每条记录创建一个循环并使用StringBuilder

      StringBuilder buffer = new StringBuilder(4096);
      for (final String record: records) {
        buffer.setLength(0);
        buffer.append(record).append(ENDRECORD).append(ENDLINE);
        String line = buffer.toString();
        ...
      }
      

      如果您要做的只是将记录输出,则无需将其放入StringBuilder;只需将其写入您的 Stream 或 Writer:

      OutputStream out = new FileOutputStream("records.dat");
      for (final String record: records) {
         out.write(record.getBytes());
         out.write(ENDRECORD);
         out.write(ENDLINE);
      }
      

      【讨论】:

      • 直接对文本数据使用 OutputStream 不是一个好主意;将其包装在 OutputStreamWriter 中。 (或者使用 FileWriter,但我不喜欢这样,因为你不能指定编码。)
      • 如果这是一种数据记录格式,您可能不需要语言字符转换。
      • 他正在处理字符串。将绝对进行文本到二进制转换,无论发生什么其他情况。没有其他方法可以从内存中的字符串开始并在磁盘上获取文件(本质上是二进制数据)。您当前的代码仅使用平台默认编码,这几乎是总是错误的 IMO 方法。
      • 如果需要特定的编码,可以随时使用getBytes(encoding)
      • 是的,但为什么不直接通过OutputStreamWriter 这样做呢?除此之外,您的代码当前假定 ENDRECORDENDLINE 已经采用适当的编码 - 这不是一个好主意。 (想象一下,如果我们想要 UTF-16。)这主要是一个原则问题:如果你想写出文本,请使用 Writer
      猜你喜欢
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2019-08-25
      • 2019-02-13
      相关资源
      最近更新 更多