简体   繁体   中英

FileNotFoundException open failed: ENOENT (No such file or directory)

I have a file called "and.doc" that has big number of records each one has this shape

expression : defenition ;

So I'm trying to

  • Read the file with scanner
  • use ; as a delimiter
  • find a way to split expression from definition
  • and somehow add them to my Sqlite Database ( if someone have any idea how to do that it will be great ).

I'm using this code

    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();
    }`

But I keep getting this error

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

Maybe the file doesn't exist in the selected directory or the READ_EXTERNAL_STORAGE permission is not granted.

Notice that if you target API 23, you have to request for permission on runtime, not only in the Manifest.

http://developer.android.com/training/permissions/requesting.html

The File doesn't exist. Create file using File() class and write the stream to it. Then read the data from it. Try adding the permission to the Manifest.xml and give a try.

<manifest ...>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
                     />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                         />
    ...
</manifest>

@Abdul2511 i'm not sure i understand the write stream part I think What he meant was this although the code below will read the text file contents present in the directory File myfile that is passed as a Parameter should be the extracted directory

// 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;
    }

I think the directory that you are passing

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

is present on your computer but the File is expecting the directory from your android device or android emulator that is the reason it is throwing an exception

if your "and.doc" is present in shared external storage of your android device "/storage/emulated/0/Documents/" then I think File will be able to access it given that you extract the directory correctly

here is how you can get the directory of your documents folder present in your sd card as an example

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");

instead of "/Password" replace it with your folder name

@Abdul2511 and somehow add them to my Sqlite Database

Here's a sample code that you can use as a reference on how to save and retrieve data from SQLite database on Android devices.

Root class of our SQLite database is SQLiteOpenHelper .

extends SQLiteOpenHelper will import that root class of SQLite database into our database class

// 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();
}

}

Note:-

  1. You will have to modify the code according to your needs this only deals with writing the data onto the database and reading from the database
  2. create a separate getter and setter java file in order to act as an adapter between your activity and the database
  3. this is just a sample code from my own project
  4. I am assuming that you have already separated expression into a separate string variable from definition

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM