RandomAccessFile では、文字コードの指定はできない。
Shift-JISも扱いたいので、別項のソースに手を加えてみたよ。
public long head_pos = 0; //現在のseekヘッド位置
public String readline_RA( String path, long readPos, String code ) {
// Log.d("TEST", "readline_RA : "+path );
String result = "";
//--
try{
File file = new File( path );
RandomAccessFile ra = new RandomAccessFile( file, "r" );
ra.seek( readPos );
String str = ra.readLine();
if ( str!= null ){
result = str;
// }else{
// result = "";
// Log.d("Err", "// readline_RA : read is null //" );
}
head_pos = ra.getFilePointer();
//
if ( code != "UTF-8" ){
// 改行コード判定
// CR : 0x0D : \r
// LF : 0x0A : \n
// UNIX = LF : Mac = CR : DOS = CR+LF
byte[] buffer = new byte[ 2 ]; // 行末2バイトを読み込む
ra.seek( head_pos -2 );
ra.read(buffer);
long RT = 1;
if ( ( buffer[0] == 0x0D )&&( buffer[1] == 0x0A ) ){ //DOS
RT = 2;
}
//--
ra.seek( readPos );
buffer = new byte[ (int)( head_pos -RT -readPos ) ]; // 読み込む量
int r = ra.read(buffer);
if ( -1 != r ){
result = new String( buffer, code );
}
}
//--
ra.close();
}catch( Exception e ){
Log.d("Err", "// readline_RA : read ERR //" );
}
//--
return result;
}
仕組み
手を加えた部分のは、23行~46行。
1. readLine で読み込んだ範囲を、byte 配列で読み込み直す。 2. byte 配列を文字コードを指定して、String に変換。
readLine のデータを直接変換するのがシンプルなんだけど…。
そのデータは、すでにUTF-8のためのbyte を差し挟まれちゃってる。
そんなbyte 配列をプレーンな状態にするより、もう一度読み込んだ方が、結果的にシンプルなんだよね。
直接変換するようなものがあるのかもしれないけど。
だもんで、readLine は「一行の範囲を調べる」だけになってる。(^_^;
読み込み範囲
最初の位置からgetFilePointer までを読み込むと、改行コードがbyte 配列に含まれてしまう。
これをそのままTextView へ表示すると、不明文字のトウフが表示されちゃう。
それは都合がわるいので、改行コードを調べて、読み込み範囲を補正する必要がある。(30~36行目)
調べた値は long RT に格納し、読み込み範囲の補正に使っている(39行目)
文字コード指定
指定した文字コードで変換するのは、難しくない。
byte から、文字コードを指定して、String を作るだけ。(43行目)
result = new String( buffer, code );
by the way…
引数 code は、String で文字コードを指定することにしている。
シフトJISなら、”Shift_JIS”。
試してないけど、EUC-JPにも対応してるハズ。


![著作権フリー背景素材集[家]](http://img.dlsite.jp/modpub/images2/work/doujin/RJ089000/RJ088095_img_mini.jpg)





migimaki.com











![著作権フリー背景素材集[家]](http://img.dlsite.jp/modpub/images2/work/doujin/RJ089000/RJ088095_img_sam.jpg)
右巻きソフトウェア
