2015-03-06 10 views
5

Gibt es eine Möglichkeit, RandomAccessFile von einem gegebenen DocumentFile zu bekommen?DocumentFile RandomAccessFile

Ich weiß, es ist möglich, eine Input über getUri

InputStream inputStream = getContentResolver().openInputStream(DocumentFile.getUri()); 

aber ich brauche einen RandomAccessFile

Vielen Dank für Ihre Hilfe zu bekommen,

Jens

Antwort

0

Textdatei erstellen, die enthalten Pfad aller Dateien, die Sie zufällig öffnen möchten

in = new BufferedReader(new FileReader("randomfilepaths.txt")); 

Erstellen Sie eine Funktion zum Abrufen des Pfades einer zufälligen Datei, die von der readLine() durchgeführt werden könnte.

Code:

protected String getRandomPath() { 
    String returnval = null; 
try{ 
    if((returnval = in.readLine()) == null){ 
    in.close(); 
    moreFiles = false; 
    } 
}catch(Exception e){} 
return returnval; 
} 

Hier ReturnVal den String Pfad zu einer zufälligen Datei enthalten.

+0

Ich sprach über die Klasse RandomAccessFile http://developer.android.com/reference/java/io/RandomAccessFile.html – JensSommer

+0

Werfen Sie einen Blick auf diese Lösung http://stackoverflow.com/a/28805474/753575 – isabsent

2

Es scheint die einzige Möglichkeit, einen zufälligen Lese-/Schreibzugriff auf eine Datei auf der SD-Karte für SDK 21 (Lollipop) ist wie folgt zu erhalten:

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; 
    } 
} 
+1

Dies funktioniert nicht, wenn Sie eine Dokumentdatei im Append-Modus öffnen, da sie am Ende der Datei unabhängig von der FileChannel-Position weiterschreibt –

2

Seit API-Ebene 21 (Lollipop), könnte dies sein ein niedriges Niveau Ersatz:

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); 

andere Low-Level-Methoden wie read(fd, ...)?write(fd, ...)fstat(fd) können in android.system.OS auch gefunden werden.

Stellen Sie sicher, dass Sie ein URI mit Lese-/Schreibzugriff haben.