Heim  >  Artikel  >  Java  >  Ausführliche Erklärung zum Lesen und Schreiben von Dateien im Assets-Verzeichnis in Android

Ausführliche Erklärung zum Lesen und Schreiben von Dateien im Assets-Verzeichnis in Android

高洛峰
高洛峰Original
2017-01-17 15:10:491985Durchsuche

Android-Ressourcendateien können grob in zwei Typen unterteilt werden:

Die erste ist die kompilierbare Ressourcendatei, die im res-Verzeichnis gespeichert ist:

Diese Art von Ressourcendateisystem befindet sich in R. java Die ID der Ressourcendatei wird automatisch generiert, sodass der Zugriff auf diese Ressourcendatei relativ einfach ist. Übergeben Sie einfach R.XXX.ID. Die zweite ist die im Assets-Verzeichnis gespeicherte native Ressourcendatei:

Da das System die Ressourcendateien unter Assets während der Kompilierung nicht kompiliert, können wir nicht über R.XXX.ID darauf zugreifen. Können wir also über den absoluten Pfad der Ressource auf sie zugreifen? Denn nachdem die APK installiert wurde, wird sie im Verzeichnis /data/app/**.apk abgelegt und liegt in der Form apk Asset/res vor. Sie ist in der APK gebunden und wird nicht in /data/ dekomprimiert. data/YourApp-Verzeichnis, daher können wir die absoluten Pfade zu Assets nicht direkt abrufen, da sie nicht existieren.

Glücklicherweise stellt uns das Android-System eine AssetManager-Toolklasse zur Verfügung.

Wenn Sie sich die offizielle API ansehen, können Sie sehen, dass AssetManager Zugriff auf die ursprünglichen Ressourcendateien der Anwendung bietet. Diese Klasse bietet eine Low-Level-API, mit der Sie sie öffnen, lesen und anwenden können einfacher Bytestream Die Rohressourcendateien, die das Programm bündelt.

Zusätzlich zur Bereitstellung des /res-Verzeichnisses zum Speichern von Ressourcendateien stellt Android auch Ressourcendateien zur Verfügung, die im /assets-Verzeichnis gespeichert werden. Daher werden in R.java nicht automatisch unter dem /assets-Verzeichnis generiert Lesen Sie das Assets-Verzeichnis. Die Ressourcendateien müssen Pfade bereitstellen, und wir können über die AssetManager-Klasse auf diese Dateien zugreifen.

Der Autor muss Ressourcen von A.apk (Ressourcen-Apk, alle Ressourcen wie: so, apk, ausführbare Dateien usw. im Assets-Verzeichnis ablegen, apk implementiert keinen logischen Code) in das angegebene Verzeichnis kopieren, also Der Autor erstellt eine B.apk (einen Dienst, der auch mit Aktivität implementiert werden kann), um die Logik zum Kopieren von Ressourcen zu implementieren, da auf den Kopierpfad im Allgemeinen nicht zugegriffen werden kann (jede APK kann nur auf den eigenen Paketnamen zugreifen). / nach der Installation) Privater Bereich unten), wenn der Autor diese APK benötigt, um Systemberechtigungen (Systemberechtigungen) zu erhalten, muss die shareduserid in AndroidManifest.xml deklariert werden. Der spezifische Vorgang wird im nächsten Abschnitt aufgezeichnet.


1. Mehrere häufig verwendete APIs für AssetManager zum Lesen von Dateien


1. Dateilesemethode

AssetManager.open(String filename) gibt einen Byte-Stream vom Typ InputSteam zurück, den Dateinamen Hier muss es sich um eine Datei und nicht um einen Ordner handeln. Die open-Methode von AssetManager zum Öffnen von Ressourcendateien ist eine überladene Methode. Sie können einen int-Parameter der Öffnungsmethode hinzufügen und entsprechende Vorgänge gemäß verschiedenen Parametern ausführen. Einzelheiten finden Sie im offiziellen Dokument http://web.mit.edu/clio/MacData/afs/sipb/project/android/docs/reference/android/content/res/AssetManager.html

2. Ressourcendateien kann existieren Ordner und Unterverzeichnisse
public final String[]list(String path), gibt die Namen aller Dateien und Unterverzeichnisse im aktuellen Verzeichnis zurück. Der Zugriff auf alle Ressourcendateien kann durch rekursives Durchlaufen des gesamten Dateiverzeichnisses erreicht werden. String[] Array von Zeichenfolgen, eine für jedes Asset. Sie können die Datei öffnen, indem Sie „Pfad“ und einen Namen in der zurückgegebenen Zeichenfolge verketten (über Datei) und diesen an open() übergeben. .

2. Relevanter Implementierungscode

Ressourcen-APK (A.apk)


Ausführliche Erklärung zum Lesen und Schreiben von Dateien im Assets-Verzeichnis in AndroidSpezifischer Implementierungscode-Snippet, aufgrund der Verwendung von Systemberechtigungen, den generierten Pfad Sie können B.apk selbst ändern

Weitere Informationen zum Lesen und Schreiben von Dateien im Asset-Verzeichnis in Android finden Sie auf der chinesischen PHP-Website für verwandte Artikel!
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    try {
      ctxDealFile = this.createPackageContext("com.zlc.ipanel",
          Context.CONTEXT_IGNORE_SECURITY);
    } catch (NameNotFoundException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }
    
    btn3.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        try {
          String uiFileName = "ipanelJoin";
          deepFile(ctxDealFile, uiFileName);
        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
          textView.setText("file is wrong");
        }
      }
    });
    //
  }
  public void deepFile(Context ctxDealFile, String path) {
    try {
      String str[] = ctxDealFile.getAssets().list(path);
      if (str.length > 0) {//如果是目录
        File file = new File("/data/" + path);
        file.mkdirs();
        for (String string : str) {
          path = path + "/" + string;
          System.out.println("zhoulc:\t" + path);
          // textView.setText(textView.getText()+"\t"+path+"\t");
          deepFile(ctxDealFile, path);
          path = path.substring(0, path.lastIndexOf('/'));
        }
      } else {//如果是文件
        InputStream is = ctxDealFile.getAssets().open(path);
        FileOutputStream fos = new FileOutputStream(new File("/data/"
            + path));
        byte[] buffer = new byte[1024];
        int count = 0;
        while (true) {
          count++;
          int len = is.read(buffer);
          if (len == -1) {
            break;
          }
          fos.write(buffer, 0, len);
        }
        is.close();
        fos.close();
      }
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn