AssetManager 没有打开文件夹 "assets" 中的 CSV 文件
AssetManager doesn´t open a CSV file in folder "assets"
很抱歉问这个问题,但我会疯狂地尝试解决它。
我从 activity
中调用了一个方法
d.loadQuestions(this);
我使用该方法将两个 CSV 文件导入 SQLite table。
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 文件(西班牙语-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[=14=]0(EntropyMixer.java:59)
at com.android.server.EntropyMixer.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[=14=]0(EntropyMixer.java:59)
at com.android.server.EntropyMixer.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”文件夹中。所以我真的无法理解为什么应用程序可以找到第一个文件而找不到第二个文件。
我发现了问题,我 post 找到了解决方案。
我总是使用 Windows 文件资源管理器将文件添加到资产文件夹,并且它有效。
上次更新 Android Studio 后,或者我可能更改了一些设置,使其正常工作的唯一方法是使用“项目”选项卡通过 Android Studio 添加文件。
终于是简单的问题了。我希望它对其他人有用。
很抱歉问这个问题,但我会疯狂地尝试解决它。
我从 activity
中调用了一个方法d.loadQuestions(this);
我使用该方法将两个 CSV 文件导入 SQLite table。
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 文件(西班牙语-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[=14=]0(EntropyMixer.java:59)
at com.android.server.EntropyMixer.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[=14=]0(EntropyMixer.java:59)
at com.android.server.EntropyMixer.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”文件夹中。所以我真的无法理解为什么应用程序可以找到第一个文件而找不到第二个文件。
我发现了问题,我 post 找到了解决方案。
我总是使用 Windows 文件资源管理器将文件添加到资产文件夹,并且它有效。
上次更新 Android Studio 后,或者我可能更改了一些设置,使其正常工作的唯一方法是使用“项目”选项卡通过 Android Studio 添加文件。
终于是简单的问题了。我希望它对其他人有用。