Android: 如何将文件写入内部存储

Android: how to write a file to internal storage

我正在开发一个简单的 android 应用程序,我需要在内部存储设备中写入一个文本文件。我知道关于这件事有很多问题(和答案),但我真的无法理解我在做错什么。

这是我在 activity 中用来编写文件的代码片段:

public void writeAFile(){
    String fileName = "myFile.txt";
    String textToWrite = "This is some text!";
    FileOutputStream outputStream;

   try {
      outputStream = openFileOutput(fileName , Context.MODE_PRIVATE);
      outputStream.write(textToWrite.getBytes());
      outputStream.close();
   } catch (Exception e) {
     e.printStackTrace();
   }
}

我真的搞不懂我到底犯了什么错误。此外,我已经在 Android Studio 和我的 phone 中的模拟器上尝试了 this 项目,以了解我在哪里做错了,但即使是那个项目,也没有文件被写入phone 或在模拟器上。

编辑: 我知道没有文件写入我的内部存储,因为我尝试在写入文件后使用以下代码读取文件的内容:

public void ReadBtn(View v) {
    //reading text from file
    try {
        FileInputStream fileIn=openFileInput("myFile.txt");
        InputStreamReader InputRead= new InputStreamReader(fileIn);

        char[] inputBuffer= new char[READ_BLOCK_SIZE];
        String s="";
        int charRead;

        while ((charRead=InputRead.read(inputBuffer))>0) {
            String readstring=String.copyValueOf(inputBuffer,0,charRead);
            s +=readstring;
        }
        InputRead.close();
        textmsg.setText(s);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

什么都没有显示。

您是否请求了写入外部存储的权限?

https://developer.android.com/training/basics/data-storage/files.html#GetWritePermission

也许您的 try\catch 块吞下了一个异常,它可能会告诉您问题出在哪里。

此外,您似乎没有设置保存路径。

例如:Android how to use Environment.getExternalStorageDirectory()

no file is written neither on the phone or on the emulator.

是的,有。它被写入 Android SDK 所指的 internal storage。这不是作为用户认为"internal storage"的东西,您作为用户看不到内部存储中的内容一个设备(除非它是有根的)。

如果要将文件写入用户可以看到的位置,请使用 external storage

这种基本的 Android 开发主题在任何一本关于 Android 应用程序开发的好书中都有涉及。

使用以下代码将文件写入内部存储:

public void writeFileOnInternalStorage(Context mcoContext, String sFileName, String sBody){      
    File dir = new File(mcoContext.getFilesDir(), "mydir");
    if(!dir.exists()){
        dir.mkdir();
    }

    try {
        File gpxfile = new File(dir, sFileName);
        FileWriter writer = new FileWriter(gpxfile);
        writer.append(sBody);
        writer.flush();
        writer.close();
    } catch (Exception e){
        e.printStackTrace();
    }
}

Starting in API 19,您必须请求写入存储的权限。

AndroidManifest.xml中添加如下代码即可添加读写权限:

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

您可以提示用户使用 read/write 权限:

requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE,READ_EXTERNAL_STORAGE}, 1);

然后你可以在activity中处理onRequestPermissionsResult()中的权限请求结果。

保存到内部存储

data="my Info to save";

try {

    FileOutputStream fOut = openFileOutput(file,MODE_WORLD_READABLE);
    fOut.write(data.getBytes());
    fOut.close();   

    Toast.makeText(getBaseContext(), "file saved", Toast.LENGTH_SHORT).show();
}
catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

从内部存储读取

try {

    FileInputStream fin = openFileInput(file);
    int c;
    String temp="";

    while( (c = fin.read()) != -1){
        temp = temp + Character.toString((char)c);
    }
    tv.setText(temp);
    Toast.makeText(getBaseContext(), "file read", Toast.LENGTH_SHORT).show();
}
catch(Exception e){
}

To view files on a device, you can log the file location >provided by methods such as File.getAbsolutePath(), and >then browse the device files with Android Studio's Device >File Explorer.

我也遇到了类似的问题,文件写好了,但我没看到。我使用了设备文件资源管理器,它就在那里等着我。

    String filename = "filename.jpg";
    File dir = context.getFilesDir();
    File file = new File(dir, filename);

    try {
        Log.d(TAG, "The file path = "+file.getAbsolutePath());
        file.createNewFile();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return true;

Android 11 次更新

通过Android 11 项关于存储的新政策,您不能在使用Environment.getExternalStorageDirectory()(即storage/emulated/0 或文件管理器中的内部存储)的主要外部存储的根文件夹中创建任何内容。原因是这种可能性导致外部存储只是一大篮子随机内容。您可以使用 getFilesDir() 在您自己的应用程序保留文件夹 storage/emulated/0/Android/data/[PACKAGE_NAME]/files 文件夹中创建文件,但其他应用程序(例如用户的文件管理器)无法访问!请注意,您的应用程序可以访问它!

最终解决方案(不推荐)

顺便说一句,有一个解决方案,就是将您的应用程序变成一个文件管理器(不推荐)。为此,您应该将此权限添加到您的应用程序中,并请求用户允许该权限:

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

Thoriya Prahalad 在 中描述了如何完成这项工作。

这个答案对我 android 11+ 有效!!检查一下,希望它对你也有用

[(顺便说一句,int SDK_INT = 30; 这让我很困惑,哈哈,所以我想我应该提一下)]