将所有新行分隔符从cr或crlf更改为crlf

时间:2013-07-24 12:59:59

标签: java byte bytearray newline

我需要将所有新行分隔符更改为\ r \ n。在字节表中有一些\ r和一些\ r \ n

byte[] data = (byte[]) transformedToByteObject;

数据包含那些字节,但我不知道如何处理该更改,我只需要处理字节和字节,不能转换为字符串

1 个答案:

答案 0 :(得分:3)

首先,您需要了解换行符只是相对于特定字符编码的换行符。幸运的是,几乎每个字符编码都在底端使用相同的ASCII集,而\ n和\ r \ n是其中的一部分。

有许多方法可以解决这个问题,效率与复杂程度不同。采用效率低但复杂度低的方法:

迭代transformedToByteObject数组,如果某个字符不是(byte) '\r',则将其复制到目标数组。

如果是'\r',那么您也将其复制到目标数组,但检查下一个字符是否为'\n'。如果不是,请将1插入目标数组。

一些指针:你的目标数组最多只是输入数组的2倍(最坏的情况是,你的输入数组只有'\r')。因此,您可以使用transformedToByteObject.length * 2初始化目的地。保持写入的实际字节数的计数器,一旦知道转换后的长度,使用System.arrayCopy()

将这些字节复制到精确大小的另一个字节数组中

其中一个实现可能如下所示:

final byte[] original = ...;
final byte[] transformed = new byte[original.length * 2];
int len = 0;

for (int i = 0; i < original.length; i++) // for each original byte ...
{
  transformed[len] = original[i];         // copy the byte
  len++;                                  // track the number of transformed bytes written

  if (original[i] == (byte) '\r')         // if this is a \r ...
  {
    if (i + 1 < original.length &&        // ... and there is a character that follows ...
        original[i+1] != (byte) '\n')     // ... and that character is not a \n ...
    {
      transformed[len] = (byte) '\n';     // ... insert a \n
      len++;                              // ... being sure to track the number of bytes written
    }
  }
}

final byte[] result = new byte[len];              // prepare an exact sized array
System.arrayCopy(transformed, 0, result, 0, len); // and copy the transformed bytes into it