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");    
     }
}

我正在使用这段代码试图从资产读取文件。我尝试了两种方法。首先,当使用文件时,我收到FileNotFoundException,当使用资产管理器getAssets()方法不被识别。 有什么解决办法吗?


当前回答

getAssets()

它只适用于其他任何类的活动,你必须为它使用上下文。

让Utils类的构造函数将活动引用(丑陋的方式)或应用程序上下文作为参数传递给它。在Utils类中使用getAsset()。

其他回答

使用Kotlin,你可以在Android中从资产中读取文件:

try {
    val inputStream:InputStream = assets.open("helloworld.txt")
    val inputString = inputStream.bufferedReader().use{it.readText()}
    Log.d(TAG,inputString)
} catch (e:Exception){
    Log.d(TAG, e.toString())
}

这里是一种方法来获得一个InputStream的文件在资产文件夹没有上下文,活动,片段或应用程序。如何从InputStream中获取数据取决于您。在这里的其他答案中有很多关于这个问题的建议。

科特林

val inputStream = ClassLoader::class.java.classLoader?.getResourceAsStream("assets/your_file.ext")

Java

InputStream inputStream = ClassLoader.class.getClassLoader().getResourceAsStream("assets/your_file.ext");

如果正在使用自定义ClassLoader,那么所有的赌注都是无效的。

Scanner类可以简化这一点。

        StringBuilder sb=new StringBuilder();
        Scanner scanner=null;
        try {
            scanner=new Scanner(getAssets().open("text.txt"));
            while(scanner.hasNextLine()){
                sb.append(scanner.nextLine());
                sb.append('\n');
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(scanner!=null){try{scanner.close();}catch (Exception e){}}
        }
        mTextView.setText(sb.toString());

ExceptionProof

It maybe too late but for the sake of others who look for the peachy answers.

loadAssetFile()方法返回资产的纯文本,如果有任何错误,则返回defaultValue参数。

public static String loadAssetFile(Context context, String fileName, String defaultValue) {
    String result=defaultValue;
    InputStreamReader inputStream=null;
    BufferedReader bufferedReader=null;
    try {
        inputStream = new InputStreamReader(context.getAssets().open(fileName));
        bufferedReader = new BufferedReader(inputStream);
        StringBuilder out= new StringBuilder();
        String line = bufferedReader.readLine();
        while (line != null) {
            out.append(line);
            line = bufferedReader.readLine();
        }
        result=out.toString();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            Objects.requireNonNull(inputStream).close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            Objects.requireNonNull(bufferedReader).close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return result;
}
getAssets()

它只适用于其他任何类的活动,你必须为它使用上下文。

让Utils类的构造函数将活动引用(丑陋的方式)或应用程序上下文作为参数传递给它。在Utils类中使用getAsset()。