Sök…


Introduktion

Läsa och skriva filer i Android skiljer sig inte från att läsa och skriva filer i standard Java. Samma java.io paket kan användas. Det finns emellertid vissa specifika relaterade till mapparna där du får skriva, behörigheter i allmänhet och MTP arbetar runt.

Anmärkningar

Android tillhandahåller medel för att dela filen mellan flera applikationer som dokumenterats här . Detta krävs inte om det bara finns en app som skapar och använder filen.

Android ger alternativa lagringsalternativ som delade och privata preferenser, sparade buntar och inbyggd databas. I vissa fall är de bättre val än att bara använda vanliga filer.

Android-aktivitet har få specifika metoder som ser ut som ersättningar av Java-standarden File IO-metoder. I stället för File.delete() du till exempel ringa Context.deleteFile() och istället för att använda File.listFiles() rekursivt kan du ringa Context.fileList() att få listan över alla dina appspecifika filer med något mindre koda. De tillhandahåller emellertid inte extra funktionalitet utöver standardpaketet java.io

Skaffa arbetsmappen

Du kan få din arbetsmapp genom att kalla metoden getFilesDir() på din aktivitet (Aktivitet är den centrala klassen i din applikation som ärver från Context. Se här ). Läsning är inte annorlunda. Endast din applikation har åtkomst till den här mappen.

Din aktivitet kan till exempel innehålla följande kod:

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

Skriva rå matris av byte

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

Det finns inget Android specifikt med den här koden. Om du skriver många små värden ofta använder du BufferedOutputStream för att minska slitaget på enhetens interna SSD.

Serialisering av objektet

Den gamla bra Java-serien för objektet är tillgänglig för dig i Android. du kan definiera serialiserbara klasser som:

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

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

och skriv sedan till 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()

Java-objektserien kan vara antingen perfekt eller riktigt dåligt val, beroende på vad du vill göra med det - utanför denna tutorials och ibland åsikter baserade. Läs om versioneringen först om du bestämmer dig för att använda den.

Skriva till extern lagring (SD-kort)

Du kan också läsa och skriva från / till minneskort (SD-kort) som finns i många Android-enheter. Filer på den här platsen kan nås av andra program, också direkt av användaren efter att ha anslutit enheten till PC via USB-kabel och aktiverat MTP-protokoll.

Att hitta platsen för SD-kort är något mer problematiskt. Klassen Miljö innehåller statiska metoder för att få "externa kataloger" som normalt borde vara inne i SD-kortet, även information om SD-kortet alls finns och är skrivbart. Denna fråga innehåller värdefulla svar på hur du kan se till att rätt plats hittas.

För att komma åt extern lagring krävs behörigheter i ditt Android-manifest:

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

För äldre versioner av Android-sätta behörigheter räcker det att sätta dessa behörigheter i manifest (användaren måste godkänna under installationen). Men med början från Android 6.0 Android ber användaren om godkännande vid första tillträdet, och du måste stödja den här nya metoden. Annars nekas åtkomst oavsett ditt manifest.

I Android 6.0 måste du först leta efter tillåtelse, sedan, om inte beviljas, begär det. Kodexemplen finns i denna SO-fråga .

Lösa problem med "osynliga MTP-filer".

Om du skapar filer för att exportera via USB-kabel till skrivbordet med MTP-protokoll kan det vara ett problem att nyskapade filer inte direkt syns i filutforskaren som körs på den anslutna stationära datorn. För att synliga nya filer måste du ringa 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)));

Den här samtalskoden för MediaScannerConnection fungerar endast för filer, inte för kataloger. Problemet beskrivs i den här Android-felrapporten . Detta kan fixas för någon version i framtiden eller på vissa enheter.

Arbetar med stora filer

Små filer bearbetas på en bråkdel av sekunden och du kan läsa / skriva dem i stället för koden där du behöver detta. Men om filen är större eller på annat sätt långsammare att bearbeta, kan du behöva använda AsyncTask i Android för att arbeta med filen i bakgrunden:

    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
        }
    }
}

och då

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

Denna SO-fråga innehåller det fullständiga exemplet på hur du skapar och ringer AsyncTask. Se också frågan om felhantering om hur du hanterar IOE-förståelser och andra fel.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow