【问题标题】:FileNotFoundException open failed: ENOENT (No such file or directory)FileNotFoundException 打开失败:ENOENT(没有这样的文件或目录)
【发布时间】:2016-06-23 02:55:03
【问题描述】:

我有一个名为“and.doc”的文件,其中包含大量记录,每个记录都具有这种形状

表达式 : 防御 ;

所以我正在尝试

  • 用扫描仪读取文件
  • 使用; 作为分隔符
  • 找到一种方法将表达式定义分开
  • 并以某种方式将它们添加到我的 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 文件系统中读取文件。这可能不会很好地工作。
  • 我已经尝试将它移动到其中一个分区,但它也不起作用。
  • 最初,您必须确认目录在那里,请检查this

标签: java android


【解决方案1】:

可能文件在所选目录中不存在或未授予 READ_EXTERNAL_STORAGE 权限。

请注意,如果您以 API 23 为目标,则必须在运行时请求权限,而不仅仅是在 Manifest 中。

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

【讨论】:

  • 我之前添加了权限,但它不起作用,我的目标是 API 19
【解决方案2】:

文件不存在。使用File() 类创建文件并将流写入其中。然后从中读取数据。尝试将权限添加到 Manifest.xml 并尝试一下。

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

【讨论】:

  • 我不确定我是否理解写流部分,如果你能提供一个代码,至于我在写问题之前添加的权限,它没有工作
  • WRITE_EXTERNAL_STORAGE 已经包含 READ_EXTERNAL_STORAGE。
【解决方案3】:

我认为你传递的目录

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

存在于您的计算机上,但文件需要来自您的 android 设备或 android 模拟器的目录,这就是它引发异常的原因

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

以下是如何获取存储卡中存在的文档文件夹目录的示例

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”

【讨论】:

    【解决方案4】:

    @Abdul2511 i'm not sure i understand the write stream part 我认为他的意思是虽然下面的代码将读取目录中存在的文本文件内容 作为参数传递的文件 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;
        }
    

    【讨论】:

      【解决方案5】:

      @Abdul2511 and somehow add them to my Sqlite Database

      这是一个示例代码,您可以将其用作有关如何在 Android 设备上从 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. 我假设您已经将表达式从定义中分离成一个单独的字符串变量

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-23
        • 2016-07-05
        • 2013-02-04
        相关资源
        最近更新 更多