簡體   English   中英

從Android Studio中的Assets文件夾加載文件

[英]Load a file from assets folder in android studio

我想知道是否有一種方法可以訪問文件,並且它是來自android studio中我的資產文件夾的路徑嗎? 我需要訪問文件及其路徑的原因是因為我正在使用一種方法,該方法需要文件的String路徑,並且它必須從其String路徑訪問文件。 但是,在android studio中,我沒有找到直接從其路徑的String值訪問文件的方法。 我決定使用一種解決方法,只是從InputStream讀取文件並將文件寫入OutputStream,但是該文件大約為170MB,並且將文件寫入OutputStream占用的內存過多。 實施該策略時,我的應用程序大約需要10:00分鍾才能下載文件。 我已經在該網站和眾多資源中進行了搜索,以找到解決方案(書籍和文檔),但找不到可行的解決方案。 這是我的代碼示例:

@Override
public Model doInBackground(String... params){
        try {
            String filePath = context.getFilesDir() + File.separator + "my_turtle.ttl";
            File destinationFile = new File(filePath);
            FileOutputStream outputStream = new FileOutputStream(destinationFile);
            AssetManager assetManager = context.getAssets();
            InputStream inputStream = assetManager.open("sample_3.ttl");


            byte[] buffer = new byte[10000000];
            int length = 0;
            while ((length = inputStream.read(buffer)) != -1) {
                  outputStream.write(buffer, 0, length);
           }
            outputStream.close();
            inputStream.close();
            model = ModelFactory.createDefaultModel();

            TDBLoader.loadModel(model, filePath, false);//THIS METHOD REQUIRES THE FILE PATH. 
            MainActivity.presenter.setModel(model);

        }catch(FileNotFoundException e){
            e.printStackTrace(System.out);
        }
        catch(IOException e){
            e.printStackTrace(System.out);
        }
        return model;
    }

如您所見,TDBLoader.loadModel()方法需要將文件URI的String作為第二個參數,因此能夠直接從我的資產文件夾訪問File而無需利用InputStream會很方便。 該方法作為參數(模型模型,字符串url,布爾值showProgress)。 正如我所提到的,我當前使用的策略占用了太多內存,或者使應用程序完全崩潰,或者花了10分鍾來下載我需要的文件。 我正在使用AsyncTask來執行此操作,但是由於執行任務所需的時間太長,因此在這種情況下無法達到AsyncTask的目的。

使事情更加復雜的是,我必須使用舊版本的Apache Jena,因為我正在使用Android Studio,而Apache Jena的正式版本與android studio不兼容。 因此,我必須使用8歲的端口,該端口沒有Apache Jena提供的更新的類。 如果可以使用RDFParser類,則可以傳遞InputStream,但是該類在我必須使用的較舊版本的Apache Jena中不存在。

所以我被困在這一點上。 該方法必須利用我的資產文件夾中文件的字符串url路徑,但是我不知道如何在不從InputStream寫入自定義文件的情況下訪問該文件,但是從InputStream寫入文件會占用過多的內存和強制性該應用程序崩潰。 如果有人有解決方案,我將不勝感激。

這是我的代碼示例

new byte[10000000]可能會失敗,因為您可能沒有單個連續的內存塊那么大。 另外,您可能沒有太多的堆空間。 使用較小的數字,例如65536。

實施該策略時,我的應用程序大約需要10:00分鍾才能下載文件

時間因硬件而異。 我不希望它在大多數設備上都那么慢,但是在某些設備上可能會如此之慢。

我想知道是否有一種方法可以訪問文件,並且它是來自android studio中我的資產文件夾的路徑嗎?

您正在Android上運行您的應用。 Android Studio未在Android上運行。 資產不是Android設備上的文件。 它們是APK文件(基本上是ZIP存檔)中的條目。 實際上,您的代碼正在解壓縮170MB的素材並將其寫到文件中。

如果有人有解決方案,我將不勝感激。

與某些人一起工作以移植Jena的更新版本,該版本提供從InputStream讀取RDF的功能。

或切換到其他RDF庫。

或直接使用RDF文件格式。

或使用較小的RDF文件,因此復制所需的時間更少。

或下載RDF文件(如果您認為復制資產最好)。

或在前台JobIntentService中進行資產到文件的復制,以更新其關聯的Notification的進度,以便用戶在完成復制時可以在其設備上執行其他操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM