Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取“资产”的“未找到文件”错误。这怎么可能?_Java_Android_Assets - Fatal编程技术网

Java 获取“资产”的“未找到文件”错误。这怎么可能?

Java 获取“资产”的“未找到文件”错误。这怎么可能?,java,android,assets,Java,Android,Assets,我要发疯了。在尝试打开位于我的资产目录中的文本文件时,我总是会遇到错误,其完整路径名为 C:\Users\Dov\Google Drive\AndroidStudioProjects\WordyHelperton - Copy - Copy\ app\src\main\assets 尽管我们可以在我的项目的assets文件夹中看到filenameDictionary.dic 我不断发现文件不存在的错误: W/`````: Can't open <Dictionary.dic>

我要发疯了。在尝试打开位于我的
资产
目录中的文本文件时,我总是会遇到错误,其完整路径名为

C:\Users\Dov\Google Drive\AndroidStudioProjects\WordyHelperton - Copy - Copy\
   app\src\main\assets
尽管我们可以在我的项目的
assets
文件夹中看到filename
Dictionary.dic

我不断发现文件不存在的错误:

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)
以下是如何定义
mAssets
SOURCE\u NAME
;还有
DatabaseConnector
定义及其对
dbOpenHelper
的调用

以下是如何从
createdbifneeded
调用
LoadDatabase

  LoadDatabase
      __loadDb;
      __loadDb = new LoadDatabase();
      __loadDb.execute((Object[]) null);
编辑

另一种意见:

编辑2

请注意,将代码中的文件名更改为小写并没有帮助。这是一个DOS文件,不是ANDROID。文件永远不会离开驱动器
C:

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
公共静态字符串数据库\u源=
“C:\\Users\\Dov\\Desktop\\ServyHelperton\\app\\src\\main”+
“\\assets\\dictionary.dic”;
W/``:无法打开
W/System.err:java.io.FileNotFoundException:C:\Users\Dov\Desktop\ServyHelperton\app\src\main\assets\dictionary.dic

我可以添加更多的代码来证明我刚才所说的,但是相信我。
数据库\u SOURCE
名称已更改。

看来您的路径是Dictionary.dic而不是Dictionary.dic


看看这是否有帮助最后,修复有点简单或者可能是愚蠢的运气,因为我不确定为什么让
InputStream
Scanner
本地
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);}
      }
    }
  }
}
公共类数据库连接器
{
静态语境;
公共数据库连接器(上下文_上下文,AssetManager _资产)
{
mAssets=_资产;
mContext=_上下文;
mDbOpenHelper=newdbopenhelper(_上下文,数据库名称,null,1);
createdbifrequired();
}
私有类DbOpenHelper扩展了SQLiteOpenHelper
{
DbOpenHelper(上下文、字符串、名称、游标工厂、int版本)
{
超级(\u上下文、\u名称、\u工厂、\u版本);
}
私有类LoadDatabase扩展异步任务
{
受保护的Void doInBackground(对象[]参数)
{
Scanner scDict=null;//****移动/添加这些
InputStream;//****这里的两行是关键
试一试{
stream=mContext.getAssets().open(数据库\源代码);
scDict=新扫描仪(流).useDelimiter(“\r\n”);
}
catch(IOException){e.printStackTrace();System.exit(69);}
}
}
}
}

在此处检查此答案。这可能会解决你的问题。我必须向那些投了否决票并投票关闭的人发泄。你怎么能无缘无故地否决?这是绝对清楚的,如果你能降低到我的水平,告诉我出了什么问题,这将对我很有用。投票结束的理由是什么?你怎么知道到目前为止做了多少研究和努力?你知道我得到了多少有用的帮助吗?没有。建议没有帮助,但我都很感激。所以问题出在哪里还不太清楚。我看不出有什么理由展示我所做的一切,但这是一项重大的努力。我查看并参考了一些文档。How-1,close?Mark,你确实帮了我的忙,把我的注意力引导到更局部地定义
sDict
,输入流和
扫描仪
。关于通风。。。见我最后的评论。如果所有的问题都是“D”。。。。。啊,这个。Android是Linux,大多数(如果不是全部的话)Linux文件系统都是区分大小写的。我很清楚Linux是区分大小写的。但该文件是一个DOS文件,不会进入Android设备。请注意,“未找到文件”,即使所有文件都是小写。那现在怎么办?你的答案没有用。这就是为什么我有
mContext.getAssets
。也许我的上下文有误。在你的第二次编辑中,你的路径是ServyHelperton,但在开始时它是WordyHelperton-Copy-Copy,你是将它改为ServyHelperton还是最初的路径?我很尴尬。尽管
dictionary.dic
是一个Windows文件,但我还是在Android Studio的支持下,在这一点上,情况确实很重要。所以这是个问题。但是文件的大小从来都不是问题,所以我应该向凯文和艾尔达道歉。很抱歉,每一条建议、评论和回答都是完全错误的。我也很抱歉,一些傻瓜投了反对票,投票决定结束,因为这是一个很好的问题,没有明显的解决办法。我也很抱歉,有3个人对另一个答案投了赞成票。甚至不接近。向上投票,向下投票,只是不要想,这显然是这里经常发生的事情……我是个混蛋。我收到的建议没有用,这不是真的。我不想一直认为唯一的问题是字典里的
d
d
。这将是不可能的,令人难以忍受的尴尬。我很想把一切都恢复到原来的样子,然后看看我所做的是否能与
D
ictionary.com一起使用。在这种情况下,这是一个愚蠢的问题,值得投反对票和结束票。我看到了
D
但是说,嘿,那是一个Windows文件。这个案子有什么关系?好吧,这对安卓来说确实如此。我是罪过,我是罪过,我是最大的罪过。
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);}
      }
    }
  }
}