2010年2月21日日曜日

[java][io]RandomAccessFileのreadLineをUTF-8に対応させる

オリジナルのreadLineは1バイト読み込んで1つのcharに変換し、
最後にStringとして返しますが、そうすると日本語とか復元できません。
これはAPIにも書いてあります。
そこでreadLineのコードをちょこっと改造してみました。
---
/**
 * <code>RandomAccessFile.read</code>で読み込んだバイト配列を
 * UTF-8エンコードした<code>String</code>で返します。
 * EOFに達するとnullを返します。
 * @param f
 * @return
 * @throws IOException
 */
public static String readLineRandomAccessFileUTF(final RandomAccessFile f) 
  throws IOException {
  List<Byte> input = new ArrayList<Byte>();
  int c = -1;
  boolean eol = false;
  while (!eol) {
    switch (c = f.read()) {
    case -1: //EOFに達した場合
    case '\n':
      eol = true;
      break;
    case '\r':
      eol = true;
      long cur = f.getFilePointer();
      if ((f.read()) != '\n') {
        f.seek(cur);
      }
      break;
    default:
      input.add((byte)c);
      break;
    }
  }


  if ((c == -1) && (input.size() == 0)) {
    return null;
  }
  byte[] bytes = new byte[input.size()];
  for(int i=0;i<input.size();i++){
    bytes[i]=input.get(i);
  }
  return new String(bytes, "utf8");
}
---
今回はテストケース無しです。

0 件のコメント:

コメントを投稿