RandomAccessFile
特定のから を取得する方法はありますDocumentFile
か?
経由で InputStream を取得できることを知っていますgetUri
InputStream inputStream = getContentResolver().openInputStream(DocumentFile.getUri());
しかし、私はRandomAccessFile
ご協力いただきありがとうございます、
イェンス
RandomAccessFile
特定のから を取得する方法はありますDocumentFile
か?
経由で InputStream を取得できることを知っていますgetUri
InputStream inputStream = getContentResolver().openInputStream(DocumentFile.getUri());
しかし、私はRandomAccessFile
ご協力いただきありがとうございます、
イェンス
SDK 21 (Lollipop) の SD カード上のファイルへのランダムな読み取り/書き込みアクセスを取得する唯一の方法は次のとおりです。
import android.content.Context;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import com.jetico.bestcrypt.FileManagerApplication;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class SecondaryCardChannel {//By analogy with the java.nio.channels.SeekableByteChannel
private FileChannel fileChannel;
private ParcelFileDescriptor pfd;
private boolean isInputChannel;
private long position;
public SecondaryCardChannel(Uri treeUri, Context context) {
try {
pfd = context.getContentResolver().openFileDescriptor(treeUri, "rw");
FileInputStream fis = new FileInputStream(pfd.getFileDescriptor());
fileChannel = fis.getChannel();
isInputChannel = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public int read(ByteBuffer buffer) {
if (!isInputChannel) {
try {
fileChannel.close();
FileInputStream fis = new FileInputStream(pfd.getFileDescriptor());
fileChannel = fis.getChannel();
isInputChannel = true;
} catch (IOException e) {
e.printStackTrace();
}
}
try {
fileChannel.position(position);
int bytesRead = fileChannel.read(buffer);
position = fileChannel.position();
return bytesRead;
} catch (IOException e) {
e.printStackTrace();
return -1;
}
}
public int write(ByteBuffer buffer) {
if (isInputChannel) {
try {
fileChannel.close();
FileOutputStream fos = new FileOutputStream(pfd.getFileDescriptor());
fileChannel = fos.getChannel();
isInputChannel = false;
} catch (IOException e) {
e.printStackTrace();
}
}
try {
fileChannel.position(position);
int bytesWrite = fileChannel.write(buffer);
position = fileChannel.position();
return bytesWrite;
} catch (IOException e) {
e.printStackTrace();
return -1;
}
}
public long position() throws IOException {
return position;
}
public SecondaryCardChannel position(long newPosition) throws IOException {
position = newPosition;
return this;
}
public long size() throws IOException {
return fileChannel.size();
}
public SecondaryCardChannel truncate(long size) throws IOException {
fileChannel.truncate(size);
return this;
}
}
API レベル 21 (Lollipop) 以降、これは低レベルの置き換えになる可能性があります。
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "rw");
FileDescriptor fd = pfd.getFileDescriptor();
// seek to offset 10 from beginning of file
android.system.Os.lseek(fd, 10, OsConstants.SEEK_SET);
のような他の低レベルのメソッドread(fd, ...)?
write(fd, ...)
fstat(fd)
もandroid.system.OSにあります。
読み取り/書き込みアクセス権を持つ uri があることを確認してください。
ランダムに開きたいすべてのファイルのパスを含むテキスト ファイルを作成します。
in = new BufferedReader(new FileReader("randomfilepaths.txt"));
1 つのランダム ファイルのパスを取得する関数を作成します。これはreadLine()
.
コード:
protected String getRandomPath() {
String returnval = null;
try{
if((returnval = in.readLine()) == null){
in.close();
moreFiles = false;
}
}catch(Exception e){}
return returnval;
}
ここで returnval には、ランダム ファイルへの文字列パスが含まれます。