无法在外部存储中写入或读取文件 - Android

时间:2012-10-23 04:59:53

标签: android file file-io

我正在尝试编写一个简单的程序,将文件写入外部存储并从中读取。以下是对问题的描述:
1.文件名=“hello_files.txt”,其中包含/sdcard中存储的文本“hello world”。
2.写入文件的数据后,可以使用adb查看该文件 3.但是,一旦将应用程序加载到手机上并使用第三方文件资源管理器应用程序查看,似乎没有文本写入文件hello_files.txt。似乎写入部分存在问题我的程序,但我无法弄清楚是什么。我在下面给出了代码的两个部分,用于写入和阅读。

从文件中读取的代码:

   public void readFromFile() {

            //Step 1. Check if the storage is available. 
            boolean mStorageAvailable;
            boolean mStorageReadWrite;

            String state = Environment.MEDIA_MOUNTED;
            Log.v(this.toString(), "State of media = " + state);

            if(Environment.MEDIA_MOUNTED.equals(state)) {
                Log.v(this.toString(), "Media is mounted.");
                mStorageAvailable = true;
                mStorageReadWrite = true;

                File dir = Environment.getExternalStorageDirectory();
                String fileName = dir + "/" + file;
                Log.v(this.toString(), "Reading from file = " + fileName);

                File f = new File(dir, file);

                FileReader fr = null;
                try {
                    fr = new FileReader(f);
                    Log.v(this.toString(), "Wrapping a buffered reader around file reader.");
                    BufferedReader bufRead = new BufferedReader(fr, 8192);
                    //Log.v(this.toString(), bufRead.toString());
                    String line;
                    try {
                        line = bufRead.readLine();
                        Log.v(this.toString(), "Line read = " + line);
                        Toast.makeText(getApplicationContext(), line, Toast.LENGTH_SHORT).show();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        Log.v(this.toString(), "IOException found in reading line from file.");
                    }   
                } catch (FileNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                    Log.v(this.toString(), "File not found for reading.");
                }
            }
}

写入文件的代码是:

 public void writeToFile() {

        //Step 2. Check if external storage is mounted. 
        boolean mStorageExists;
        boolean mStorageReadWrite;

        String state = Environment.getExternalStorageState();
        Log.v(this.toString(), "External media mounted state = " + state);

        if(Environment.MEDIA_MOUNTED.equals(state)) {
            //media is mounted.
            //Mounted storage is read/write. 
            //Write to the file.

            mStorageExists = true;
            mStorageReadWrite = true;

            Log.v(this.toString(), "Going to write to a file.");

            //get directory.
            File dir = Environment.getExternalStorageDirectory();
            Log.v(this.toString(), "Root directory = " + dir.getAbsolutePath());
            String fileName = dir.getAbsolutePath() + "/" + file;

            Log.v(this.toString(), "File to write to is present at " + fileName);

            File f = new File(dir, file);

            FileOutputStream fos;
            try {
                fos = new FileOutputStream(f);
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
                Log.v(this.toString(), "File not found.");
            }
            try {
                fos = openFileOutput(file, MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);
                Log.v(this.toString(), "Bytes of the string = " + str.getBytes().toString());
                fos.write(str.getBytes());
                //Log.v(this.toString(), "Local path = ");
                fos.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                Log.v(this.toString(), "File not found!!");
                e.printStackTrace();
            } catch (IOException e) {
                Log.v(this.toString(), "IO Exception.");
                e.printStackTrace();
            }
        } else if(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            //media is mounted but read only.
            mStorageExists = true;
            mStorageReadWrite = false;
            Log.v(this.toString(), "The media is read-only mounted.");
        } else if( (Environment.MEDIA_NOFS.equals(state)) || (Environment.MEDIA_REMOVED.equals(state)) || (Environment.MEDIA_UNMOUNTED.equals(state))) {
            mStorageExists = false;
            mStorageReadWrite = false;
            Log.v(this.toString(), "There is some problem with the media.");
        }
    }

日志(来自Log详细标签):

10-23 10:26:19.444: V/com.sriram.fileops.MainActivity$2@44e95cc0(466): Read from file button clicked.
10-23 10:26:19.444: V/com.sriram.fileops.MainActivity@44e90428(466): State of media = mounted
10-23 10:26:19.444: V/com.sriram.fileops.MainActivity@44e90428(466): Media is mounted.
10-23 10:26:19.444: V/com.sriram.fileops.MainActivity@44e90428(466): Reading from file = /sdcard/hello_files.txt
10-23 10:26:19.453: V/com.sriram.fileops.MainActivity@44e90428(466): Wrapping a buffered reader around file reader.
10-23 10:26:19.453: V/com.sriram.fileops.MainActivity@44e90428(466): Line read = null

1 个答案:

答案 0 :(得分:0)

除了包含访问外部存储的权限之外,以下用于写入和读取文件的功能也起作用。

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

写入文件:

  public void writeToFile() {

        //Step 2. Check if external storage is mounted. 
        boolean mStorageExists;
        boolean mStorageReadWrite;

        String state = Environment.getExternalStorageState();
        Log.v(this.toString(), "External media mounted state = " + state);

        if(Environment.MEDIA_MOUNTED.equals(state)) {
            //media is mounted.
            //Mounted storage is read/write. 
            //Write to the file.

            mStorageExists = true;
            mStorageReadWrite = true;

            Log.v(this.toString(), "Going to write to a file.");

            //get directory.
            File dir = Environment.getExternalStorageDirectory();
            Log.v(this.toString(), "Root directory = " + dir.getAbsolutePath());

            String file_to_write = getFileToWrite(dir);  //this returns the exact name of the file.

            String fileName = dir.getAbsolutePath() + "/" + file_to_write;

            Log.v(this.toString(), "File to write to is present at " + file_to_write);

            File f = new File(dir, file_to_write);
            FileWriter fw = null;
            try {
                fw = new FileWriter(f);
                fw.write(str);
                fw.close();
            } catch (IOException e2) {
                // TODO Auto-generated catch block
                Log.v(this.toString(), "IOException caught in initializing filewriter.");
                e2.printStackTrace();
            }
        } else if(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            //media is mounted but read only.
            mStorageExists = true;
            mStorageReadWrite = false;
            Log.v(this.toString(), "The media is read-only mounted.");
        } else if( (Environment.MEDIA_NOFS.equals(state)) || (Environment.MEDIA_REMOVED.equals(state)) || (Environment.MEDIA_UNMOUNTED.equals(state))) {
            mStorageExists = false;
            mStorageReadWrite = false;
            Log.v(this.toString(), "There is some problem with the media.");
        }
    }

和从文件中读取的功能:

  public void readFromFile() {

        //Step 1. Check if the storage is available. 
        boolean mStorageAvailable;
        boolean mStorageReadWrite;

        String state = Environment.MEDIA_MOUNTED;
        Log.v(this.toString(), "State of media = " + state);

        if(Environment.MEDIA_MOUNTED.equals(state)) {
            Log.v(this.toString(), "Media is mounted.");
            mStorageAvailable = true;
            mStorageReadWrite = true;

            File dir = Environment.getExternalStorageDirectory();
            String file_to_read_from = getFileToRead(dir);
            String fileName = dir + "/" + file_to_read_from;
            Log.v(this.toString(), "Reading from file = " + fileName);

            File f = new File(dir, file_to_read_from);
            //Log.v(this.toString(), "Read from file = " + f.canRead() + " " + f.isFile() + " " + f.exists() + " " + f.length() + " " + f.lastModified());

            try {
                FileReader fis = new FileReader(f);
                Log.v(this.toString(), "Wrapping a buffered reader around file reader.");
                BufferedReader bufRead = new BufferedReader(fis, 100);
                String line;
                try {
                    line = bufRead.readLine();
                    Toast.makeText(getApplicationContext(), line, Toast.LENGTH_SHORT).show();
                    Log.v(this.toString(), "Line read = " + line);
                    while(line != null) {
                        Log.v(this.toString(), "Line read = " + line);
                        Toast.makeText(getApplicationContext(), line, Toast.LENGTH_SHORT).show();
                        line = bufRead.readLine();
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Log.v(this.toString(), "IOException found in reading line from file.");
                }   
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
                Log.v(this.toString(), "File not found for reading.");
            }
        }
    }