2015-03-06 7 views
5

Czy jest jakiś sposób uzyskać RandomAccessFile od danego DocumentFile?DocumentFile RandomAccessFile

wiem, że to jest możliwe, aby uzyskać InputStream poprzez getUri

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

ale trzeba RandomAccessFile

Dzięki za pomoc,

Jens

Odpowiedz

0

Utwórz plik tekstowy, który zawiera ścieżka wszystkich plików, które chcesz otworzyć losowo

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

Utwórz funkcję uzyskiwania ścieżki jednego losowego pliku, która może być wykonana przez readLine().

Kod:

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

Tutaj returnval będzie zawierać ścieżkę ciąg do losowego pliku.

+0

Rozmawiałem o klasie RandomAccessFile http://developer.android.com/reference/java/io/RandomAccessFile.html – JensSommer

+0

Spójrz na tego rozwiązania http://stackoverflow.com/a/28805474/753575 – isabsent

2

Wydaje się, że jedynym sposobem, aby losowy dostęp odczytu/zapisu do pliku na karcie SD do SDK 21 (Lollipop) przedstawia się następująco:

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

To nie działa, jeśli otworzysz plik dokumentów w trybie dołączania, ponieważ zapisuje on na końcu pliku niezależnie od pozycji FileChannel –

2

Ponieważ poziom API 21 (Lollipop), to potęga być zamiennikiem poziom niski:

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

innych metod niskiego poziomu jak read(fd, ...)?write(fd, ...)fstat(fd) można znaleźć w android.system.OS też.

Upewnij się, że masz urządzenie URI z dostępem do odczytu/zapisu.

Powiązane problemy