2016-06-18 28 views
-1

Androidに接続されたUSBフラッシュドライブの大きなファイルにアクセスしています。ファイルが大きいので、私は全体の中でロードするのではなく、ファイルの中で "シーク"する必要があります。Javaランダムアクセスファイル入力ストリーム

C言語では、シークは1行のコードですが、これを達成するにはアンドロイドで叙事詩のコーディングが必要なようです。

インターネットでこのクラスを見たところ、ストリームでシークできますが、コンストラクタに "File Object"を渡す必要があります。

https://github.com/vitalidze/justdlna/blob/master/src/main/java/su/litvak/justdlna/util/RandomAccessFileInputStream.java

私はUSBドライブ上のファイルにアクセスする必要があるコードは以下のとおりです。

InputStream in=getContentResolver().openInputStream(uri); 

または

ParcelFileDescriptor pfd= getContentResolver().openFileDescriptor(uri,"rw"); 

しかし、どのように私はからファイルオブジェクトを取得しますContentResolverので、これをRandomAccessFileInputStreamクラスに渡すことができます(上記リンク先)

答えて

0

イム問題がある可能性がありますAndroidの

に差し込まれたUSBフラッシュドライブ上の大きなファイルにアクセスします。

ファイルが大きいので、ファイル全体を読み込むのではなく、ファイル内を「シーク」する必要があります。

これは大きな問題である可能性があります。 C言語では

、シークコード

必ずしも

ないのちょうど1行です。

は、今私は、USBドライブ上のファイルにアクセスする必要があるコードは、私はあなたが ACTION_OPEN_DOCUMENTからこの Uriやストレージアクセスの枠組みに縛られ、いくつかの同様のAPIを取得していると仮定しています

です。もしそうなら、Uriが実際のURIであると思うなら、あなたはもっと良い運があるでしょう。 URLなどのURIは、必ずしもローカルリソースを表すとは限らず、「シークするのは単なるコード行である」というものを表すとは限りません。

InputStreammark()reset()は、真のランダムシーク機能に最も近いものです。また、すべてのストリームがそれらをサポートするわけではありません。たとえば、reset()ストリームをTCP/IPソケットでバックアップする必要はありません。

しかし、どのように私はあなたがいくつかにそれを書き出す、Uriによって表される全ての内容を読み込むことInputStreamを使用する以外、ないContentResolverの

からファイルオブジェクトを取得しますあなたがコントロールするFileの場合はFileOutputStreaminternal storagegetFilesDir())、次に結果のファイルを使用してください。

それとも、あなたはmark()reset()とによって得ることができるかどうか、また、(それはあなたのケースにする必要がありますが、私はそれを保証することはできません)それがInputStreamで可能であるかどうかを確認するためにmarkSupported()を呼び出します。

または、直接ファイルにアクセスできるデバイスのオンボードフラッシュファイルシステムの一部にUSBフラッシュドライブからファイルをコピーする必要があります(例:external storage)。

の特定の場所にファイルがあることを前提条件として設定します(つまり、getExternalFilesDirs())。その場合、2番目以降のエントリは、リムーバブルメディア上の場所です読み書きはできません)。

+0

こんにちは、助けてくれてありがとう、はい私は外付けUSBドライブの固定位置(ルート)にファイルを置くことができます。私があなたを理解しているように、もし私がusb内の固定された場所にファイルを置くと、そのファイル(ex mount pointなど)を見つけて、その場所を取得するために使用するapiと、 – programmer3

+0

@dreadlocks: "はい、外部USBドライブの固定位置(ルート)にファイルを置くことができます" - ファイルシステム経由でUSBドライブのルートに直接アクセスすることはできません。 ** Android **からあなたのアプリにアクセス権があることを示すファイルを置く必要があります。それはデバイスとデバイスのユーザーによって異なる場合があります。そのデバイスとユーザーのために、ドライブを差し込み、 'Context'に' getExternalFilesDirs() 'を呼び出し、そして2番目(以降)の場所を見てその場所を見つけます。これは、アプリが場所に独自のものを書き込んだり、シナリオではなく後で読み込んだりするためのものです。 – CommonsWare

関連する問題