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

Java Android:如何将文件写入内部存储器,java,android,internal-storage,Java,Android,Internal Storage,我正在开发一个简单的android应用程序,我需要在内部存储设备中编写一个文本文件。我知道关于这件事有很多问题(和答案),但我真的无法理解我在做什么 这是我在活动中用来编写文件的一段代码: public void writeAFile(){ String fileName = "myFile.txt"; String textToWrite = "This is some text!"; FileOutputStream outputStream; try {

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

这是我在活动中用来编写文件的一段代码:

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和我的手机上的模拟器上尝试了project,以了解我哪里做错了什么,但即使使用该项目,也没有在手机或模拟器上写入任何文件

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

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

没有显示任何内容。

您是否已请求写入外部存储器的权限

可能您的try\catch块正在吞咽一个异常,该异常可能会告诉您问题所在

此外,您似乎没有设置要保存到的路径

e、 g:

手机或模拟器上都没有写入任何文件

是的,有。它被写在Android SDK所指的内容中。这是<>强>不/强>什么是<强>作为用户< /强>被认为是“内部存储”,而作为用户,你不能看到设备内部存储中的内容(除非它是生根的)。 如果要将文件写入用户可以看到的位置,请使用


这类基本的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();
    }
}

,您必须请求权限才能写入存储。 通过将以下代码添加到
AndroidManifest.xml
,可以添加读写权限:

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

然后,您可以在从中调用的
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){
}
从内部存储器读取

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){
}
要查看设备上的文件,可以记录file.getAbsolutePath()等方法提供的文件位置>,然后>使用Android Studio的设备>文件资源管理器浏览设备文件

我有一个类似的问题,文件是写的,但我从来没有看到它。我使用了设备文件浏览器,它就在那里等着我



@低估者:请在投票前阅读!我知道这是一个已经发布的问题,但是如果我请求你的帮助,这是有原因的。不需要下载。结果中是否有任何错误?日志里有消息吗?另外,您想在哪个版本的Android上执行此操作?运行此代码后,您希望文件具体位于何处?@VladMatvienko logcat中没有错误或消息。我使用的版本是25。我希望在/data/data/[package name]中找到该文件。很抱歉,刚才注意到您说的是内部存储而不是外部存储;。不过,其他几点仍然适用。您确定没有创建该文件吗?默认路径相当复杂,您可能只是找错了地方。使用openFileOutput时不需要路径规范。我将使用getFilesDir()来发现路径是否有问题。我假设此应用程序将写入的内部存储是根存储(我希望在/data/data/[package name]中找到一个文件)。我从你提供给我的链接中读到,这并不总是真的。无论如何,我正在尝试从应用程序读取此文件,但没有显示任何内容。我将编辑我的问题以澄清这一点。@delca85:嗯,您的流I/O代码有点令人讨厌,而且在实现中不并行。使用
OutputStreamWriter
包装在
OutputStream
周围,在一次调用中
write()
字符串,而不转换为字节。然后,以较大的块(例如8192字节)读入文本。@commonware:谢谢你的建议。我想我的问题与openFileOutput的使用有关,使用Sandeep Dipham发布的代码,我能够编写这个文件。根据你的说法,这是唯一的解决办法吗?现在我正试图使用FileInputStream进行读取,但我一直遇到一些问题。@delca85:我也倾向于使用
getFilesDir()
,因为它更灵活。但是使用
openFileInput()
/
openFileOutput()
没有什么问题。@如果我看起来很笨,很抱歉,但是为什么我在使用
openFileInput()/openFileOutput()
时无法检索文件,但我可以使用
getfiledir()来检索文件
?不要只捕获异常而不记录它。@Commonware做得比抱怨更好!;)从内部读/写时,为什么使用外部存储权限?什么是“上下文”?根据Android官方参考:从API级别19开始,在
context.getExternalFilesDir(字符串)返回的特定于应用程序的目录中读/写文件不需要此权限
上下文。getExternalCacheDir()
。使用
模式\u WORLD\u READABLE
是个坏主意。。。而且它在Android>=7中不再受支持,文件是否为空?