文件未找到异常:打开失败:ENOENT(无此文件或目录)

6

我有一个名为“and.doc”的文件,其中有大量记录,每个记录都具有以下形式:

expressiondefinition;

因此,我正在尝试:

  • 使用扫描仪读取文件
  • 使用;作为分隔符
  • 找到一种方法将expressiondefinition中分离出来
  • 并以某种方式将它们添加到我的Sqlite数据库中(如果有人有任何想法如何做到这一点,那将是很棒的)。

我正在使用这段代码:

    try {


  mf =new File("/home/agh/AndroidStudioProjects/Dicod/app/src/main/res/raw/and.doc");
        inputFile = new Scanner(mf);
        inputFile.useDelimiter(";");
        while (inputFile.hasNext())
        {
            String x = inputFile.next();
            Toast.makeText(getApplicationContext(),x,Toast.LENGTH_LONG).show();

       //Splitting and adding to the databse

        }


    }

    catch(FileNotFoundException e) {
        e.printStackTrace();
    }`

但我一直收到这个错误。
06-23 04:38:28.771 23620-23620/? W/System.err: java.io.FileNotFoundException: /home/agh/AndroidStudioProjects/Dicod/app/src/main/res/raw/and.txt: open failed: ENOENT (No such file or directory)
06-23 04:38:28.771 23620-23620/? W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:465)
06-23 04:38:28.771 23620-23620/? W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:76)
06-23 04:38:28.771 23620-23620/? W/System.err:     at java.util.Scanner.<init>(Scanner.java:158)
06-23 04:38:28.772 23620-23620/? W/System.err:     at java.util.Scanner.<init>(Scanner.java:138)
06-23 04:38:28.772 23620-23620/? W/System.err:     at com.example.agh.dicod.MainActivity.onCreate(MainActivity.java:28)
06-23 04:38:28.772 23620-23620/? W/System.err:     at android.app.Activity.performCreate(Activity.java:5990)
06-23 04:38:28.772 23620-23620/? W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
06-23 04:38:28.772 23620-23620/? W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)
06-23 04:38:28.772 23620-23620/? W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)
06-23 04:38:28.772 23620-23620/? W/System.err:     at android.app.ActivityThread.access$800(ActivityThread.java:156)
06-23 04:38:28.772 23620-23620/? W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
06-23 04:38:28.772 23620-23620/? W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
06-23 04:38:28.772 23620-23620/? W/System.err:     at android.os.Looper.loop(Looper.java:211)
06-23 04:38:28.772 23620-23620/? W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5389)
06-23 04:38:28.772 23620-23620/? W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
06-23 04:38:28.772 23620-23620/? W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
06-23 04:38:28.772 23620-23620/? W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
06-23 04:38:28.772 23620-23620/? W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
06-23 04:38:28.772 23620-23620/? W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
06-23 04:38:28.773 23620-23620/? W/System.err:     at libcore.io.Posix.open(Native Method)
06-23 04:38:28.773 23620-23620/? W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
06-23 04:38:28.773 23620-23620/? W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:451)
06-23 04:38:28.773 23620-23620/? W/System.err:  ... 17 more

你正在尝试在Android设备上从PC文件系统中读取文件。这可能不会很顺利。 - ck1
我已经尝试将其移动到其中一个分区,但也没有起作用。 - Abdul2511
最初,您必须确认目录是否存在,请检查此链接 - صلي علي محمد - Atef Farouk
请尝试此链接:https://dev59.com/PloV5IYBdhLWcg3wkfe9#62912059 - Bhavesh Moradiya
5个回答

2

我之前添加了权限,但它没有起作用,我针对的是API 19。 - Abdul2511

0
文件不存在。使用File()类创建文件并将流写入其中。然后从中读取数据。尝试向Manifest.xml添加权限并进行尝试。
<manifest ...>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
                     />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                         />
    ...
</manifest>

我不确定我理解写入流部分,如果您能提供一段代码的话。至于权限,我在提问之前已经添加了它们,但没有起作用。 - Abdul2511
WRITE_EXTERNAL_STORAGE 包含了 READ_EXTERNAL_STORAGE。 - S. Gissel

0

@Abdul2511 我不确定我理解写入流部分的意思 我认为他的意思是,尽管下面的代码将读取目录中存在的文本文件内容 但作为参数传递的myfile文件应该是被提取的目录

// getdata() is the method which reads the data
    // the data that is saved in byte format in the file
    private String getdata(File myfile) {
        FileInputStream fileInputStream = null;
        try {
            Log.i("file_read_send_to_getData_function",myfile.toString());
            fileInputStream = new FileInputStream(myfile);
            int i = -1;
            StringBuffer buffer = new StringBuffer();
            while ((i = fileInputStream.read()) != -1) {
                buffer.append((char) i);
            }
            return buffer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

0

我认为你正在传递的目录

"/home/agh/AndroidStudioProjects/Dicod/app/src/main/res/raw/and.doc"

该文件存在于您的计算机上,但文件期望从您的Android设备或Android模拟器中获取目录,这就是它抛出异常的原因。

如果您的“and.doc”存在于Android设备的共享外部存储中“/storage/emulated/0/Documents/”,那么我认为只要您正确提取目录,File将能够访问它。

以下是如何获取SD卡中文档文件夹目录的示例:

File externalStorageDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS); //getting external storage directory
                    //it's another method to get the directory of a file inside the external storage of a device
                    File folder = new File(externalStorageDirectory + "/Password");

将"/Password"替换为您的文件夹名称


0

@Abdul2511 并且以某种方式将它们添加到我的Sqlite数据库中

这里有一段示例代码,你可以作为参考来学习如何在安卓设备上保存和检索SQLite数据库中的数据。

我们的SQLite数据库的根类是SQLiteOpenHelper

extends SQLiteOpenHelper会将SQLite数据库的根类导入到我们的数据库类中。

// root class of our SQLite database is SQLiteOpenHelper
// extends SQLiteOpenHelper will import that root class of SQLite database into our NoteDatabase class
public class NoteDatabase extends SQLiteOpenHelper {

private static final int DATABASEVERSION= 2;
private static final String DATABASE_NAME = "your database name";
private static final String DATABASE_TABLE = "your table name";

//column names for database
private static final String KEY_ID="id";
private static final String KEY_TITLE="expression";
private static final String KEY_CONTENT="defenition";
private static final String KEY_DATE="date";
private static final String KEY_TIME="time";

public static List<Note> allNotes;

//creating a constructor for our noteDatabase
NoteDatabase(Context context){
    super(context,DATABASE_NAME,null,DATABASEVERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    //onCreate is called every time the noteDatabase instance is created inside any class of this application
    //creating the database table
    String query = "CREATE TABLE " + DATABASE_TABLE +" ("+ KEY_ID +" INTEGER PRIMARY KEY AUTOINCREMENT , "+
            KEY_TITLE+" TEXT, "+
            KEY_CONTENT+" TEXT, "+
            KEY_DATE+" TEXT, "+
            KEY_TIME+" TEXT "+")";
    db.execSQL(query);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 //checking for updates for our database
    if(oldVersion>=newVersion){
        return;
    }
    else{
        //update the table if new version is available
        db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
        onCreate(db);
    }
}

//it will take Note as a parameter this note will contain all the information like title, content , date and time
//and it will send that note from addnote activity to this node database
//Note note is the class that we just created
public long addnote(Note note){
   //here we will insert the data
    SQLiteDatabase db = this.getWritableDatabase();
    //this contentValues will create a dictionary like structure
    ContentValues contentValues = new ContentValues();
    //now we can save our value to the keys that we have created in this class
   // contentValues.put(KEY_ID,note.getID()); ***Do not insert Id inside SQLite instead auto increment the id to be unique
    contentValues.put(KEY_TITLE,note.getTitle());
    contentValues.put(KEY_CONTENT,note.getContent());
    contentValues.put(KEY_TIME,note.getTime());
    contentValues.put(KEY_DATE,note.getDate());

    //now we will insert the data
    //if the data is inserted successfully it will return the long value of the primary key
    long ID = db.insert(DATABASE_TABLE,null,contentValues);
    db.close();
    Log.i("ID", Long.toString(ID));
    return ID;
}
//this will get all the notes present in the database
//so that we can desplay it in our ListView
public List<Note> getNotes(){
    //we will pull the data from the database using element's unique id
    //select * from databse where id = whatever the id we have passed on here
    //* means acessing all the data in that particular id elements
    //creating an instance of our database
    SQLiteDatabase db = this.getReadableDatabase();
    //creating a list of generic type called Note
    allNotes = new ArrayList<>();
    String query = "SELECT * FROM "+DATABASE_TABLE;
    Cursor cursor = db.rawQuery(query,null);
    if(cursor.moveToFirst()){
        //i am going to pull all the data from the database and pass that data onto our listView
        do{

            //now creating a new note and save the data from the database by using cursor
            Note note = new Note();
            note.setID(cursor.getLong(0));
            note.setTitle(cursor.getString(1));
            note.setContent(cursor.getString(2));
            note.setDate(cursor.getString(3));
            note.setTime(cursor.getString(4));

            //adding this to lisView
            allNotes.add(note);

        }while(cursor.moveToNext());
    }
    return allNotes;
}

//updating the database
//replacing the old data with the updated data set inside the database
public int editNote(Note note){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(KEY_TITLE,note.getTitle());
    contentValues.put(KEY_CONTENT,note.getContent());
    contentValues.put(KEY_DATE,note.getDate());
    contentValues.put(KEY_TIME,note.getTime());
    return db.update(DATABASE_TABLE, contentValues,KEY_ID+"=?",new String[]{String.valueOf(note.getID())});
}

//the method will handel the deletion of the notes
//this method will be called from the noteDetails.class
void deleteNote(long id){
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(DATABASE_TABLE,KEY_ID+"=?",new String[]{String.valueOf(id)});
    db.close();
}

}

注意:

  1. 您需要根据自己的需求修改代码,这只涉及将数据写入数据库和从数据库读取
  2. 创建一个单独的getter和setter Java文件,以充当您的活动和数据库之间的适配器
  3. 这只是我自己项目中的示例代码
  4. 我假设您已经将表达式分离成了一个单独的字符串变量和定义

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接