1. ホーム
  2. android

[解決済み】アセットからファイルを読み込む

2022-04-15 02:38:46

質問

public class Utils {
    public static List<Message> getMessages() {
        //File file = new File("file:///android_asset/helloworld.txt");
        AssetManager assetManager = getAssets();
        InputStream ims = assetManager.open("helloworld.txt");    
     }
}

私はこのコードを使って、アセットからファイルを読み込もうとしています。私はこれを行うために2つの方法を試してみました。まず File を受け取りました。 FileNotFoundException を使用した場合 AssetManager getAssets() メソッドが認識されません。 何か解決策はないでしょうか?

どのように解決するのですか?

以下は、バッファードリーディングのためのアクティビティで私が行っていることです。

BufferedReader reader = null;
try {
    reader = new BufferedReader(
        new InputStreamReader(getAssets().open("filename.txt")));

    // do reading, usually loop until end of file reading  
    String mLine;
    while ((mLine = reader.readLine()) != null) {
       //process line
       ...
    }
} catch (IOException e) {
    //log the exception
} finally {
    if (reader != null) {
         try {
             reader.close();
         } catch (IOException e) {
             //log the exception
         }
    }
}

EDIT : もしあなたの質問がアクティビティの外でそれを行う方法であるなら、私の回答はおそらく役に立たないでしょう。もし、あなたの質問が単にアセットからファイルを読み取る方法であれば、答えは上記の通りです。

アップデイト :

タイプを指定してファイルを開くには、以下のようにInputStreamReaderの呼び出しにタイプを追加するだけです。

BufferedReader reader = null;
try {
    reader = new BufferedReader(
        new InputStreamReader(getAssets().open("filename.txt"), "UTF-8")); 

    // do reading, usually loop until end of file reading 
    String mLine;
    while ((mLine = reader.readLine()) != null) {
       //process line
       ...
    }
} catch (IOException e) {
    //log the exception
} finally {
    if (reader != null) {
         try {
             reader.close();
         } catch (IOException e) {
             //log the exception
         }
    }
}

EDIT

コメントで@Stanさんがおっしゃっているように、私があげているコードは行の合計が取れていないようです。 mLine はパスごとに置き換えています。だから、私は //process line . このファイルには何らかのデータ(例えば連絡先リスト)が含まれており、各行は別々に処理されるべきだと推測しています。

何も処理せずに単純にファイルを読み込みたい場合は、以下のようにまとめる必要があります。 mLine を使用して、各パスで StringBuilder() を作成し、各パスを追記する。

その他の編集

Vincent さんのコメントに従って、私は finally ブロックを作成します。

また、Java 7 以降では try-with-resources を使用することで AutoCloseableCloseable は、最近のJavaの特徴である。

CONTEXT

コメントで@LunarWatcherさんが指摘しているのは getAssets()classcontext . ですから、もしあなたが activity を参照し、コンテキストインスタンスをアクティビティに渡す必要があります。

ContextInstance.getAssets();

これは@Maneeshさんの回答で説明されています。というわけで、もしこれが役に立つのであれば、彼の回答をアップヴォートしてください。