Java Android Studio-只读文件系统?

Java Android Studio-只读文件系统?,java,android,android-studio,file-io,Java,Android,Android Studio,File Io,我正在尝试将一个文件写入手机(以及将来的用户手机)的内部设备存储。我在看2016年()的视频教程,其中展示了他如何非常简单地将输出写入文件。如果你想看他的代码,请跳到8:23 不管怎么说,我基本上是试过他的代码,但既然没用,我想我会到处搜索 显然,要创建文件,我需要以下代码行: String filename = "textfile.txt"; File file = new File(filename); file.mkdirs(); file.createNewFile(); 在第二行f

我正在尝试将一个文件写入手机(以及将来的用户手机)的内部设备存储。我在看2016年()的视频教程,其中展示了他如何非常简单地将输出写入文件。如果你想看他的代码,请跳到8:23

不管怎么说,我基本上是试过他的代码,但既然没用,我想我会到处搜索

显然,要创建文件,我需要以下代码行:

String filename = "textfile.txt";
File file = new File(filename);

file.mkdirs();
file.createNewFile();
在第二行file.createNewFile()中,我得到以下错误:

java.io.IOException: Read-only file system
  at java.io.UnixFileSystem.createFileExclusivel
  at java.io.UnixFileSystem.createFileExclusivel
  at java.io.File.createNewFile(File.java:948)
  etc......
然后,如果我仅仅通过使用教程中的代码行来运行我的代码,我会得到一个空指针

代码:

错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileOutputStream android.content.Context.openFileOutput(java.lang.String, int)' on a null object reference
  at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:199)
  at com.lecconnect.lockoutdemo.FileManager.AddUser(FileManager.java:37)
第37行是try/catch中的第一行


如果您需要任何其他信息来帮助我,请告诉我。非常感谢您的回复。

将目录和文件本身分开很重要

在代码中,对要写入的文件调用
mkdir
s,这是不正确的用法,因为
mkdirs
会将文件放入目录中。您应该仅为目录调用
mkdirs
,因此如果目录不存在,将创建该目录,并且当您为此文件创建新的
FileOutputStream
对象时,将自动创建该文件

试试这个:

File directory = getFilesDir(); //or getExternalFilesDir(null); for external storage
File file = new File(directory, fileName);

FileOutputStream fos = null;
try {
    fos = new FileOutputStream(file);
    fos.write(IDNum.getBytes());
    fos.close();
} catch (IOException e) {
    e.printStackTrace();
}

将目录和文件本身分开是很重要的

在代码中,对要写入的文件调用
mkdir
s,这是不正确的用法,因为
mkdirs
会将文件放入目录中。您应该仅为目录调用
mkdirs
,因此如果目录不存在,将创建该目录,并且当您为此文件创建新的
FileOutputStream
对象时,将自动创建该文件

试试这个:

File directory = getFilesDir(); //or getExternalFilesDir(null); for external storage
File file = new File(directory, fileName);

FileOutputStream fos = null;
try {
    fos = new FileOutputStream(file);
    fos.write(IDNum.getBytes());
    fos.close();
} catch (IOException e) {
    e.printStackTrace();
}

您的
FileManager
类显然扩展了一个不应使用
new
实例化的类;如
活动
服务
。我假设您这样做是为了
openFileOutput()
能够解决这个问题。您不能这样做,因为最终调用的
上下文将为null,正如您在跟踪中看到的那样。如果您想将该方法保留在单独的类中,请将
上下文
参数添加到
AddUser()
,并从
活动
服务
等中传递一个参数。我还应该提到,
openFileOutput()
打开应用程序私有内部存储中的文件,这可能不是你所期望的。我通过解析“openFileOutput()”删除了“…扩展活动”,正如您假设的那样。我现在正在通过我的其他活动传递上下文。导致错误的行被重写为“FileOutputStream fos=context.openFileOutput(filename,context.MODE_PRIVATE);”似乎我的代码没有崩溃,但我在任何地方都找不到我的文本文件lol。我去了Internal_Storage/Android/Data/com.outputproject/demo,文件应该在那里,但它不在那里。这就是你所说的内部私有存储,对吗?还是无法看到私人文件?此位置没有问题。使用附加模式不会改变任何内容-看起来一切正常,但找不到.txt文档的位置。或者我误用了上下文?是的,在Android上,内部/外部存储是一件令人困惑的事情。Android术语中的内部存储是指只有应用程序才能(正常)访问的私有应用程序存储区域。外部存储是可公开访问的区域。这两个术语都与存储是否在设备内部或可移动SD卡上无关。如果要写入一个可以通过常规文件资源管理器访问的文件,则该区域的根目录将是
Environment.getExternalStorageDirectory()
。您需要
WRITE\u EXTERNAL\u STORAGE
权限。您可以使用标准文件I/O,在需要的地方创建
文件
,然后在该文件上创建
文件输出流
。您可能在
上下文中调用的获取文件流的方法将位于应用程序的内部存储中,因此这不是您想要的。您的
文件管理器
类显然扩展了一个不应使用
新建
实例化的类;如
活动
服务
。我假设您这样做是为了
openFileOutput()
能够解决这个问题。您不能这样做,因为最终调用的
上下文将为null,正如您在跟踪中看到的那样。如果您想将该方法保留在单独的类中,请将
上下文
参数添加到
AddUser()
,并从
活动
服务
等中传递一个参数。我还应该提到,
openFileOutput()
打开应用程序私有内部存储中的文件,这可能不是你所期望的。我通过解析“openFileOutput()”删除了“…扩展活动”,正如您假设的那样。我现在正在通过我的其他活动传递上下文。导致错误的行被重写为“FileOutputStream fos=context.openFileOutput(filename,context.MODE_PRIVATE);”似乎我的代码没有崩溃,但我在任何地方都找不到我的文本文件lol。我去了Internal_Storage/Android/Data/com.outputproject/demo,文件应该在那里,但它不在那里。这就是你所说的内部私有存储,对吗?还是无法看到私人文件?此位置没有问题。使用附加模式不会改变任何内容-看起来一切正常,但找不到.txt文档的位置。或者我误用了上下文?是的,在Android上,内部/外部存储是一件令人困惑的事情。Android术语中的内部存储是指只有应用程序才能(正常)访问的私有应用程序存储区域。外部存储是可公开访问的区域。这两个术语都与存储是否在设备内部或可移动SD卡上无关。如果你