【问题标题】:AssetManager doesn´t open a CSV file in folder "assets"AssetManager 不会在“assets”文件夹中打开 CSV 文件
【发布时间】:2021-10-17 23:09:41
【问题描述】:

很抱歉问这个问题,但我会发疯地试图解决它。

我从我的活动中调用一个方法

d.loadQuestions(this);

我使用该方法将两个 CSV 文件导入 SQLite 表。

public void loadQuestions(Context context){
        if(thereAreNotPacks()){
            SQLiteDatabase db = this.getWritableDatabase();

            String mCSVfile;

            switch (Locale.getDefault().getLanguage()){
                case "es":
                    mCSVfile = "English-Spanish.csv";
                    break;
                default:
                    mCSVfile = "English-Spanish.csv";
                    break;
            }

            String COL1 = "QUE_QUE";
            String COL2 = "ANS_QUE";

            AssetManager manager = context.getAssets();
            InputStream inStream = null;
            try {
                inStream = manager.open(mCSVfile);
            } catch (IOException e) {
                e.printStackTrace();
            }

            String currentPlayer = ClassSharedPreferences.read(ClassSharedPreferences.currentPlayer, "");

            BufferedReader buffer = new BufferedReader(new InputStreamReader(inStream));
            String line = "";
            db.beginTransaction();
            try {
                while ((line = buffer.readLine()) != null) {
                    String[] colums = line.split(";");

                    ContentValues cv = new ContentValues();
                    cv.put(COL1, colums[0].trim());
                    cv.put(COL2, colums[1].trim());
                    cv.put("PRI_QUE", 1);
                    cv.put("PAC_QUE", "English-Spanish");
                    cv.put("PLA_QUE", currentPlayer);

                    db.insert(MI_TABLA_QUESTIONS, null, cv);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }


            switch (Locale.getDefault().getLanguage()){
                case "es":
                    mCSVfile = "Spanish-English.csv";
                    break;
                default:
                    mCSVfile = "Spanish-English.csv";
                    break;
            }

            try {
                inStream = manager.open(mCSVfile);
            } catch (IOException e) {
                e.printStackTrace();
            }


            buffer = new BufferedReader(new InputStreamReader(inStream));
            db.beginTransaction();
            try {
                while ((line = buffer.readLine()) != null) {
                    String[] colums = line.split(";");

                    ContentValues cv = new ContentValues();
                    cv.put(COL1, colums[0].trim());
                    cv.put(COL2, colums[1].trim());
                    cv.put("PRI_QUE", 1);
                    cv.put("PAC_QUE", "Spanish-English");
                    cv.put("PLA_QUE", currentPlayer);

                    db.insert(MI_TABLA_QUESTIONS, null, cv);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            db.setTransactionSuccessful();
            db.endTransaction();
        }
    }

一切都很好。第一个 CSV 文件 (English-Spanish.csv) 已正确导入,但第二个文件存在一些问题。找不到第二个 CSV 文件 (Spanish-English.csv) 我不知道为什么。下一行可以完美地找到第一个 CSV 文件,但同一行不适用于第二个文件。怎么可能?

inStream = manager.open(mCSVfile);

当我调试它并到达第二个 CSV 文件的那一行时,它采用空值。我得到了这个 logcat:

2021-08-15 19:31:42.647 10083-10083/com.doctoractual.pregresp W/System.err: java.io.FileNotFoundException: Spanish-English.csv
2021-08-15 19:31:46.720 1550-1586/? W/EntropyMixer: Failed to add HW RNG output to entropy pool
    java.io.FileNotFoundException: /dev/hw_random: open failed: EACCES (Permission denied)
        at libcore.io.IoBridge.open(IoBridge.java:496)
        at java.io.FileInputStream.<init>(FileInputStream.java:159)
        at java.io.FileInputStream.<init>(FileInputStream.java:115)
        at com.android.server.RandomBlock.fromFile(RandomBlock.java:45)
        at com.android.server.EntropyMixer.addHwRandomEntropy(EntropyMixer.java:205)
        at com.android.server.EntropyMixer.access$000(EntropyMixer.java:59)
        at com.android.server.EntropyMixer$1.handleMessage(EntropyMixer.java:83)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.os.HandlerThread.run(HandlerThread.java:67)
        at com.android.server.ServiceThread.run(ServiceThread.java:44)
     Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
        at libcore.io.Linux.open(Native Method)
        at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
        at libcore.io.BlockGuardOs.open(BlockGuardOs.java:252)
        at libcore.io.IoBridge.open(IoBridge.java:482)
        at java.io.FileInputStream.<init>(FileInputStream.java:159) 
        at java.io.FileInputStream.<init>(FileInputStream.java:115) 
        at com.android.server.RandomBlock.fromFile(RandomBlock.java:45) 
        at com.android.server.EntropyMixer.addHwRandomEntropy(EntropyMixer.java:205) 
        at com.android.server.EntropyMixer.access$000(EntropyMixer.java:59) 
        at com.android.server.EntropyMixer$1.handleMessage(EntropyMixer.java:83) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.os.HandlerThread.run(HandlerThread.java:67) 
        at com.android.server.ServiceThread.run(ServiceThread.java:44) 
2021-08-15 19:32:09.752 10083-10083/com.doctoractual.pregresp W/System.err: java.io.FileNotFoundException: market_spanish.csv

这两个文件都在“assets”文件夹中,“assets”文件夹在“main”文件夹中。所以我真的不明白为什么应用程序可以找到第一个文件而找不到第二个文件。

【问题讨论】:

  • 您的错误是:java.io.FileNotFoundException: market_spanish.csv。它指的是market_spanish.csv。您的源代码和屏幕截图没有此文件。因此,您的错误似乎与您的其他问题不同步。
  • @CommonsWare 你是对的,我很抱歉,我处理 logcat 的错误。在尝试了很多我没有意识到的事情之后,我的头已经很乱了。我已经修复了它,并将整个 logcat 添加到我的初始消息中。谢谢你意识到。我希望有人可以帮助我了解正在发生的事情,我真的被卡住了
  • 问题还没有解决。我不知道为什么该行会忽略第二个 CSV 文件,就像它不存在一样。 inStream = manager.open(mCSVfile);

标签: java android android-studio android-assets import-from-csv


【解决方案1】:

我发现了问题并在这里发布了解决方案。

我总是使用 Windows 文件资源管理器将文件添加到资产文件夹,并且它有效。

在上次更新 Android Studio 之后,或者我更改了一些设置,使其工作的唯一方法是通过 Android Studio 添加文件,使用“项目”选项卡。

这就是最后一个简单的问题。我希望它对其他人有用。

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多