为`asset`获取`File not found`错误。这怎么可能?

时间:2017-09-15 21:55:13

标签: java android assets

我准备好了。尝试打开我的assets目录中的文本文件时,我一直收到错误,该文件的完整路径名是

C:\Users\Dov\Google Drive\AndroidStudioProjects\WordyHelperton - Copy - Copy\
   app\src\main\assets

即使我们可以在我的项目的Dictionary.dic文件夹中查看文件名assets ...

enter image description here

... 我不断收到文件不存在的错误:

W/`````: Can't open <Dictionary.dic>
W/System.err: java.io.FileNotFoundException: Dictionary.dic
W/System.err:     at android.content.res.AssetManager.openAsset(Native Method)
W/System.err:     at android.content.res.AssetManager.open(AssetManager.java:316)
W/System.err:     at android.content.res.AssetManager.open(AssetManager.java:290)
W/System.err:     at com.dslomer64.servyhelperton.DatabaseConnector$LoadDatabase.doInBackground(DatabaseConnector.java:328)
W/System.err:     at com.dslomer64.servyhelperton.DatabaseConnector$LoadDatabase.doInBackground(DatabaseConnector.java:315)
W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/System.err:     at java.lang.Thread.run(Thread.java:841)

Doc说您可以在open语句中使用分层名称:

W/`````: Can't open <C:\Users\Dov\Google Drive\AndroidStudioProjects\WordyHelperton - Copy - Copy\app\src\main\assets\Dictionary.dic>
W/System.err: java.io.FileNotFoundException: C:\Users\Dov\Google Drive\AndroidStudioProjects\WordyHelperton - Copy - Copy\app\src\main\assets\Dictionary.dic
W/System.err:     at android.content.res.AssetManager.openAsset(Native Method)
W/System.err:     at android.content.res.AssetManager.open(AssetManager.java:316)
W/System.err:     at android.content.res.AssetManager.open(AssetManager.java:290)
W/System.err:     at com.dslomer64.servyhelperton.DatabaseConnector$LoadDatabase.doInBackground(DatabaseConnector.java:330)
W/System.err:     at com.dslomer64.servyhelperton.DatabaseConnector$LoadDatabase.doInBackground(DatabaseConnector.java:317)
W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)

同样的问题。

你能看到我的代码有什么问题吗?这个问题显而易见,但是经过两天的尝试和完全失败之后,看起来很好,因此必须明显,但我看不到它......

我已经把它包括在内,以防从上面不明显。如果这没有用,我就是靠自己。

DatabaseConnector onCreate MainActivityassets = getAssets(); dbc = new DatabaseConnector(getApplicationContext(), assets); // to create DB if needed 的调用方式如下:

mAssets

以下是SOURCE_NAMEDatabaseConnector的定义方式;还有dbOpenHelper定义及其对LoadDatabase的调用。

enter image description here

以下是从createDbIfNecessary调用 LoadDatabase __loadDb; __loadDb = new LoadDatabase(); __loadDb.execute((Object[]) null); 的方式:

C:

修改

另一种意见:

enter image description here

编辑2

请注意,将代码中的文件名更改为小写无效。它是一个DOS文件,而不是ANDROID。 AND文件永远不会离开驱动器public static String DATABASE_SOURCE = "C:\\Users\\Dov\\Desktop\\ServyHelperton\\app\\src\\main" + "\\assets\\dictionary.dic"; W/`````: Can't open <C:\Users\Dov\Desktop\ServyHelperton\app\src\main\assets\dictionary.dic> W/System.err: java.io.FileNotFoundException: C:\Users\Dov\Desktop\ServyHelperton\app\src\main\assets\dictionary.dic

DATABASE_SOURCE

我可以添加更多代码来证明我刚刚说过的内容,但请相信我。 $_SESSION名称是我改变的全部。

2 个答案:

答案 0 :(得分:1)

您的路径似乎是Dictionary.dic而不是dictionary.dic

看看是否有帮助

答案 1 :(得分:0)

最后,修复很容易或者运气不好,因为我不确定为什么InputStreamScanner本地地doInBackground解决了这个问题。

请参阅原始问题中的第一张图片。我没有对MainActivity做出重大更改,但这里有一条有趣的内容:

dbc = new DatabaseConnector(getApplicationContext(), getAssets());

这是有用的:

public class DatabaseConnector
{
  static Context mContext;

  public DatabaseConnector(Context _context, AssetManager _assets)
  {
    mAssets   = _assets;
    mContext  = _context;

    mDbOpenHelper = new DbOpenHelper(_context, DATABASE_NAME, null, 1);

    createDbIfNecessary();
  }

  private class DbOpenHelper extends SQLiteOpenHelper
  {
    DbOpenHelper(Context _context, String _name, CursorFactory _factory, int _version)
    {
      super(_context, _name, _factory, _version);
    }

    private class LoadDatabase extends AsyncTask<Object, Integer, Void>
    {
      protected Void doInBackground(Object[] params)
      {
        Scanner scDict = null; // ***** MOVING/ADDING THESE 
        InputStream stream;    // ***** TWO LINES HERE WAS KEY
        try{
          stream = mContext.getAssets().open(DATABASE_SOURCE);
          scDict = new Scanner(stream).useDelimiter("\r\n");
        }
        catch(IOException e){e.printStackTrace(); System.exit(69);}
      }
    }
  }
}