Java Android Studio-只读文件系统?
我正在尝试将一个文件写入手机(以及将来的用户手机)的内部设备存储。我在看2016年()的视频教程,其中展示了他如何非常简单地将输出写入文件。如果你想看他的代码,请跳到8:23 不管怎么说,我基本上是试过他的代码,但既然没用,我想我会到处搜索 显然,要创建文件,我需要以下代码行: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
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卡上无关。如果你