Ricerca…


introduzione

La lettura e la scrittura di file in Android non sono diversi dalla lettura e dalla scrittura di file in Java standard. java.io possibile utilizzare lo stesso pacchetto java.io Tuttavia, vi sono alcune specifiche relative alle cartelle in cui è consentito scrivere, le autorizzazioni in generale e MTP funzionano.

Osservazioni

Android fornisce i mezzi per condividere il file tra più applicazioni come documentato qui . Questo non è richiesto se esiste una sola app che crea e utilizza il file.

Android offre opzioni di archiviazione alternative come le preferenze condivise e private, i pacchetti salvati e il database integrato. In alcuni casi, sono una scelta migliore rispetto all'utilizzo di semplici file.

L'attività Android ha pochi metodi specifici che assomigliano a sostituzioni dei metodi di File IO standard di Java. Ad esempio, invece per File.delete() puoi chiamare Context.deleteFile() , e invece di applicare File.listFiles() modo ricorsivo puoi chiamare Context.fileList() per ottenere l'elenco di tutti i tuoi file specifici dell'app con un po 'meno codice. Tuttavia, non forniscono funzionalità aggiuntive oltre java.io pacchetto java.io standard.

Ottenere la cartella di lavoro

Puoi ottenere la tua cartella di lavoro chiamando il metodo getFilesDir() sulla tua attività (Activity è la classe centrale nella tua applicazione che eredita dal contesto. Vedi qui ). La lettura non è diversa. Solo la tua applicazione avrà accesso a questa cartella.

La tua attività potrebbe contenere il seguente codice, ad esempio:

  File myFolder = getFilesDir();
  File myFile = new File(myFolder, "myData.bin");

Scrivere una matrice di byte grezza

  File myFile = new File(getFilesDir(), "myData.bin");
  FileOutputStream out = new FileOutputStream(myFile);

  // Write four bytes one two three four:
  out.write(new byte [] { 1, 2, 3, 4}
  out.close()

Non c'è nulla di specifico per Android con questo codice. Se si scrivono spesso molti piccoli valori, utilizzare BufferedOutputStream per ridurre l'usura dell'unità SSD interna del dispositivo.

Serializzare l'oggetto

La vecchia seria serializzazione di oggetti Java è disponibile per te su Android. puoi definire classi serializzabili come:

  class Cirle implements Serializable {
    final int radius;
    final String name;

    Circle(int radius, int name) {
      this.radius = radius;
      this.name = name;
    }
  }

e quindi scrivere su ObjectOutputStream:

  File myFile = new File(getFilesDir(), "myObjects.bin");
  FileOutputStream out = new FileOutputStream(myFile);
  ObjectOutputStream oout = new ObjectOutputStream(new BufferedOutputStream(out));

  oout.writeObject(new Circle(10, "One"));
  oout.writeObject(new Circle(12, "Two"));
  
  oout.close()

La serializzazione degli oggetti Java può essere una scelta perfetta o davvero pessima, a seconda di cosa si vuole fare con esso - al di fuori dello scopo di questo tutorial ea volte basato sull'opinione. Leggi prima il versioning se decidi di usarlo.

Scrittura su memoria esterna (scheda SD)

È inoltre possibile leggere e scrivere da / su una scheda di memoria (scheda SD) presente in molti dispositivi Android. I file in questa posizione sono accessibili da altri programmi, anche direttamente dall'utente dopo aver collegato il dispositivo al PC tramite cavo USB e abilitato il protocollo MTP.

Trovare la posizione della scheda SD è un po 'più problematico. La classe Environment contiene metodi statici per ottenere "directory esterne" che dovrebbero normalmente trovarsi all'interno della scheda SD, anche le informazioni se la scheda SD esiste del tutto ed è scrivibile. Questa domanda contiene risposte preziose su come accertarsi di trovare la giusta posizione.

L'accesso alla memoria esterna richiede permessi nel tuo manifest Android:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Per le versioni precedenti di Android che inseriscono i permessi è sufficiente mettere queste autorizzazioni in manifest (l'utente deve approvare durante l'installazione). Tuttavia, a partire da Android 6.0 Android chiede l'approvazione dell'utente al momento del primo accesso e devi supportare questo nuovo approccio. In caso contrario, l'accesso è negato indipendentemente dal tuo manifest.

In Android 6.0, per prima cosa è necessario verificare l'autorizzazione, quindi, se non concesso, richiederlo. Gli esempi di codice possono essere trovati all'interno di questa domanda SO .

Risolvere il problema "File invisibili MTP".

Se si creano file per l'esportazione tramite cavo USB sul desktop usando il protocollo MTP, potrebbe essere un problema che i file appena creati non siano immediatamente visibili nel file explorer in esecuzione sul PC desktop connesso. Per rendere visibili i nuovi file, è necessario chiamare MediaScannerConnection :

File file = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DOCUMENTS), "theDocument.txt");
FileOutputStream out = new FileOutputStream(file)

... (write the document)

out.close()
MediaScannerConnection.scanFile(this, new String[] {file.getPath()}, null, null);
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
            Uri.fromFile(file)));

Questo codice di chiamata MediaScannerConnection funziona solo per i file, non per le directory. Il problema è descritto in questo bug report di Android . Questo potrebbe essere risolto per alcune versioni in futuro o su alcuni dispositivi.

Lavorare con file di grandi dimensioni

I file piccoli vengono elaborati in una frazione di secondo e puoi leggerli / scriverli al posto del codice in cui ti serve. Tuttavia, se il file è più grande o più lento da elaborare, potrebbe essere necessario utilizzare AsyncTask in Android per lavorare con il file in background:

    class FileOperation extends AsyncTask<String, Void, File> {

        @Override
        protected File doInBackground(String... params) {
          try {
            File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOCUMENTS), "bigAndComplexDocument.odf");
            FileOutputStream out = new FileOutputStream(file)

           ... (write the document)

            out.close()
            return file;
            } catch (IOException ex) {
               Log.e("Unable to write", ex);
               return null;
              }
        }

        @Override
        protected void onPostExecute(File result) {
          // This is called when we finish 
        }

        @Override
        protected void onPreExecute() {
           // This is called before we begin
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            // Unlikely required for this example
        }
    }
}

e poi

new FileOperation().execute("Some parameters");    

Questa domanda SO contiene l'esempio completo su come creare e chiamare AsyncTask. Vedi anche la domanda sulla gestione degli errori su come gestire IOExceptions e altri errori.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow