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
文件夹中看到filenameDictionary.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);}
}
}
}
}