2011-11-08 3 views
1

私のアプリケーションは、カーネル空間からいっぱいになっているcharデバイスから読み込みます。現在、私は正常に動作しているRandomAccessFileでアクセスしています。アプリケーション起動時にJavaからcharデバイスを空にする

私のアプリケーションを起動する前に、データが既にcharデバイスに書き込まれています。 (最低1秒間に一定のデータがあります)

私はアプリケーションを開始する前に挿入したデータを "無視"します。

問題は、この文字デバイスに現在どのくらいのデータがあるのか​​わかりません。それはパイプからの読書のようなものです、私はいくつかのリーダークラスを試しましたが、長さにアクセスすると、常に不正なシーク例外が発生します。

charデバイスを文字通り「空にして」データを読み込む前に、誰かが正しい方向に向けるかもしれないと思います。 私はjava.nioのように、非ブロッキングのioで作業したことがありません。もの、これは行く方法ですか?

残念ながら、掲載の準備ができていない場合は、必要な場合は教えてください。

答えて

1

OK、私はその問題を解決するための美しい方法を発見しませんでした。私が見つけた

唯一の解決策は、手動でSystem.nanoTimeの (!Scalaのコード)をチェックし、それをスキップします

var run = true 
val test = new Array[Byte](10000); //<- needs to be that big! 
var count = 0; 
device = new RandomAccessFile("/dev/mydevice", "r") 
while (run) { 
    val time = System.nanoTime(); 
    device.read(test) 
    count = count +1 
    if ((System.nanoTime() - time)>100000000) { 
    run = false 
    } 
} 
device.close 
println("Skipped ["+count+"] lines") 

誰もがよりよい解決策を持ち出すことができれば、私はそれを感謝しています。

0

私はあなたがすでにRandomAccessFile.setLength(0)を試したことを前提としています(実際にパイプが使われているのではないでしょうか? FileInputStreamを使用してskip()を呼び出すまでスキップできない場合はどうなりますか?

+0

こんにちは、私はそれを試していませんでした。 setLengthのドキュメントを読むと、lengthにアクセスしようとします。長さにアクセスするたびに、私は不正なシーク例外を取得します。 FileInputStreamを使ってみましたが、この違法シークで同じ問題が発生しました。私はスキップが私のために働くかどうかをチェックする。 – evildead

+0

もう一度、setLengthもskipも動作しません。私はいつもIllegal seek IOExceptionを得る。 – evildead

関連する問題