問題タブ [randomaccessfile]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - RandomAccessFile を使用して null 位置を確認する
ランダム アクセス ファイル内の位置が書き込まれていないかどうかを確認する必要があります。これに関する問題は、位置が実際に書き込まれていない場合に、(予想どおり) EOFException が発生することです。この問題を解決するために RandomAccessFile のドキュメントを読んでいて、オンラインで調べてみました。
私が試したこと:
try-catch ブロックを使用し、EOFException が発生するたびにキャッチします (try-catch を条件ステートメントとして使用します)。それは機能しますが、それは恐ろしい習慣であり、非常に非効率的です。私の場合、ほとんどの場合 EOF です。
BufferReader を使用してループし、位置を確認します。私は多くの問題に遭遇し、より良い方法があるに違いないと判断しました。
あるファイルを別のファイルにコピーしたり、その他の回避策を実行したりしたくありません。これを行うには直接的な方法が必要であることはわかっていますが、正しい解決策を見つけることができないようです。
java - Java Random File Access: 行頭のバイトオフセットを取得
テキスト (ASCII) ファイル内の特定のレコードにランダムにアクセスし、特定の「停止シーケンス」(レコード区切り文字) が見つかるまでそこから読み取る必要があります。ファイルには複数行のレコードが含まれており、各レコードは区切り記号で区切られています。各レコードは、異なる量の行も必要とします! これは特定の専門分野で一般的に知られているファイル形式であり、変更することはできません。
要求されたレコードにすばやくジャンプできるように、ファイルのインデックスを作成したいと考えています。
のような同様の質問で
とその中のリンク、答えは常にのseek()
ようなさまざまなクラスのメソッドを参照しRandomAccessFile
ます。私はそれについて知っています!
私が抱えている問題は、シークに必要なオフセットを取得する方法です! (ファイルの索引付け)
BufferedReader
getFilePointer()
ファイルの先頭から現在のバイトオフセットを取得する方法やその他の方法はありません。RandomAccessFile
メソッドはありますreadLine()
が、そのパフォーマンスはひどいものです。私の場合はまったく使えません。
ファイルを 1 行ずつ読み取る必要があり、レコード区切り文字が見つかるたびにバイト オフセットを取得する必要があります。どうすればこれを達成できますか?
android - この RandomAccessFile オブジェクトに対して close() 関数を呼び出す場所
View を拡張する GraphView というクラスがあり、このクラスの側でいくつかの計算を行います。このクラス
のオブジェクトは、画面に表示するカスタム グラフを表します。これは MainActivity ファイルに作成されます
拡張 View クラス内に配列の値を保存する必要があるため、クラス内に RandomAccessFile オブジェクトを作成したいのですが、おそらく GraphView のコンストラクター内でこのオブジェクトを初期化しますが、close() 関数はどこで指定すればよいでしょうか?
プログラムが実行されている限り、グラフは画面に表示されたままになるため、Java にはデストラクタがないように見えるため、close() 関数がどこにあるべきかわかりません。
java - Android:InputStreamからランダムアクセスするには?
InputStream と、相対ファイル名とサイズがあります。
InputStream のランダムな (増加する) 位置にアクセス/読み取る必要があります。この位置は整数配列 (名前付きオフセット) に格納されます。
さて、InputStream が与えられた場合、ファイルのランダムな (増加する) 位置にジャンプするための可能な解決策は 2 つしか見つかりませんでした。
1 つ目は、 InputStreamのskip()メソッドを使用することです (ファイル ポインターをmark()およびreset()する必要があるため、実際にはBufferedInputStreamを使用していることに注意してください)。
問題は、私のテスト中に、いくつかの (通常は大きな) オフセットについて、正しいバイト数をスキップする前に 5 回以上循環したことです。それは正常ですか?そして、何よりも、skip()を突き刺すことができますか? (つまり、常に正しいオフセットに到達することを確認するには、10 サイクルで十分ですか?)
私が見つけた唯一の代替方法は、File.createTempFile (prefix, suffix, directory)と次の関数を使用して、 InputStreamからRandomAccessFileを作成する方法です。
RandomAccessFileを持つことは、実際にははるかに優れたソリューションですが、パフォーマンスは指数関数的に悪化します (何よりも、複数のファイルがあるため)。
編集: byte[] buffer = new byte[fileSize]を使用すると、RandomAccessFile の作成が (そして大幅に) 高速化されます!
さて、InputStream から「ランダムな」アクセスを行うためのより良い (またはよりエレガントな) ソリューションはありますか?
java - RandomAccessFile: すべてのアイテムを同じバイト数に設定しますか?
上記の例がすべて int の場合、レコード サイズを 12 に設定することもできます (3 int * 4 バイト = 12 なので)。
java - RandomAccessFile: Java.io.EOFException の取得
私はコードを持っています:
実行すると、null であるというエラー メッセージが表示されます。なぜこれが起こっているのかわかりましたが、ボブのデータを読み取ることができるように、どのバイトを探すべきかをどのように知ることができますか? seek(12) は null を与えています。
javascript - ブラウザでホストされたアプリからのファイルへのランダム アクセス (または少なくともインクリメンタル) 書き込み
ブラウザで実行することを目的としたアプリケーションを設計しています。このアプリケーションは、ファイルに保存されるデータを生成しています。場合によっては、このデータの量が使用可能な RAM の量を超える可能性があるため、すべてのデータが作成されるまで待ってから、一度にディスクに書き込むことはできません。
ランダム アクセス、または (少なくとも) ブラウザー ベースのアプリケーションからのファイルへのインクリメンタル (追加) 書き込みが必要です。
私の調査では、次のことがわかりました。
- HTML5 FileSystem API : 必要なものを正確に提供しますが、現時点では、Webkit ベースのブラウザー (Chrome、Opera) でのみ利用できます。このドキュメントに記載されているように、Firefox は最も近いバージョンでの実装を計画していません。IE11 または Safari 7 に関する情報はありません。
- 私が見つけたファイル保存手順のすべてのjsベースの実装は、これをサポートしていません(予想通り)。
- Flash にはクラスFileStreamがありますが、ブラウザー内の Flash プレーヤーでは使用できません。
- Silverlight にもFileStream クラスがありますが、それを使用するアプリケーションは昇格された信頼のアプリケーションである必要があります。ブラウザーベースの Silverlight アプリケーションは、Windows レジストリにそのように記載されている場合にのみ、昇格された信頼のアプリケーションにすることができます。これは明らかに Web アプリケーションのオプションではありません。さらに、これはおそらく Mac OS では実行できません。
ここに表示されるその他のオプションは、ActiveX と Java です。
では、js、Flash、または Silverlight で何か不足していますか? ActiveX または Java で行うことは可能ですか? 他のオプションはありますか?