在Android中写入内部私有存储

xxb16uws  于 2023-04-10  发布在  Android
关注(0)|答案(6)|浏览(114)

我试图将应用中的一些数据保存在内部私有存储区域(应用用户首选项)的一个简单文本文件中。我已经阅读了这里的许多问题(StackOverflow)并尝试了建议的解决方案,但没有成功。最简单的解决方案似乎是这里建议的一个:
http://developer.android.com/guide/topics/data/data-storage.html#filesInternal
但我无法让它在我的测试设备上工作。我也尝试使用java.io.File中可用的方法和适当的方法创建文件。我也尝试在SDCard上创建文件,结果相同,失败。我尝试了其他答案中列出的许多解决方案,完全按照建议的代码和指令操作,并找到相同的结果。我开始觉得我遗漏了一些重要的代码,或者某个地方的设置标志,我在manifest文件中设置了权限:

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

需要说明的是,我正在尝试写入设备的内部私有存储。它是一个包含姓名,电话号码和几个int类型标志的小文件。无论我使用什么方法,我都会发现文件没有创建(或者如果我手动将文件放在SDCard上,则会更改),或者当我尝试引用文件或文件位置时会收到NullPointerException:

private              File   fILE = new File("Mydata", main.FILENAME);

private              File   fILE  = getDir("Mydata", 0);

我运行的代码在HTC英雄,更新与最新的服务版本从Sprint.任何帮助将不胜感激,提前感谢!

  • 史蒂夫
    更新(2/2/11):使用EVO(API 8)我仍然得到一个NullPointerException。生成异常的代码如下,对于为什么我的应用无法访问内部存储有什么想法吗?我在三个不同的物理设备上使用两个API级别(API 7和8)遇到了这个问题。
File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt");

更新2:2/4/11 -我发现在任何情况下都看不到物理设备(数据目录)上的文件结构。有人对此有什么想法吗?设备配置正确,可以从eclipse或adb运行应用程序。
更新3:(2/9/11)-我想我可能已经找到了这里的问题所在,但我不确定如何处理它。我已经弄清楚了物理设备上/data/目录的权限是:drwxrwx--x.我不知道为什么会这样,也许是Sprint的一些东西?我已经在HTC Hero上找到了这种设置,三星Epic(Galaxy S),和HTC EVO都在Sprint上.问题似乎是DDMS和我的应用程序没有r/w访问目录.我需要弄清楚2件事在这里,为什么会这样,以及如何在野外克服这个问题.再次,这里的任何帮助都会很棒!!
更新4:我认为去年二月是一个总的金发时刻对我来说(见更新3).测试设备,我有没有ROOTed,因此没有访问(DUH!).经过所有的更新,他SGS和EVO 4G已经经历了,结果仍然是一样的.我仍然在解决这个问题,并将尝试回到这里与更新很快(希望不到一年的时间下一次).

d6kp6zgx

d6kp6zgx1#

尝试更改以下行:

File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt");

致:

File newfile = new File(this.getFilesDir() + "/","sample.txt");
uyto3xhc

uyto3xhc2#

不是直接回答你的问题,但无论如何:我注意到你不想在你的文件中存储大量的数据,那么使用共享首选项是否足够呢?
也许更有趣的是:即使写入共享首选项文件,问题是否仍然存在?
http://developer.android.com/guide/topics/data/data-storage.html#pref

z6psavjg

z6psavjg3#

物理设备的/data/目录仅对root用户可用。由于在物理设备上获得此访问权限的唯一现实方法是root设备,因此DDMS文件资源管理器无法进入目录树的此分支。
至于为什么应用程序不会写在那里,可能的问题是,事实上,我已经签署了调试密钥的应用程序(不是一个大 *NIXMaven,但似乎是从我个人的研究情况在这里)。

jdg4fx2g

jdg4fx2g4#

我也在处理同样的问题。最后,我发现你真的不必为了在内部存储中创建一个新文件而给予所有文件路径。只要提到文件名,它就会在设备上的应用程序包文件夹下创建。我确实在这里提到过
而且它工作得很完美。我会说避免提到完整的文件路径,如:/data/...来创建一个文件(你需要写权限来以这种方式创建一个文件)。让Android框架来为你的应用创建一个私有文件。

js4nwp54

js4nwp545#

内部存储区域是应用程序的私有区域,因此用户必须拥有root访问权限(root设备)才能创建和加载文件。如果您拥有root设备,则应按照以下方式将文件写入内部存储:

// Create a file in the Internal Storage

String fileName = "MyFile";
String content = "hello world";

FileOutputStream outputStream = null;
try {
outputStream = openFileOutput(fileName, Context.MODE_APPEND);
outputStream.write(content.getBytes());
outputStream.close();
} catch (Exception e) {
  e.printStackTrace();
}

这应该会立即创建一个名为MyFile的文件,内容为hello world。内部存储目录通常位于我们应用程序包名称指定的特殊位置。在我的情况下,它是/data/data/[package name],创建的文件存储在该目录中名为files的目录中。

wqsoz72f

wqsoz72f6#

就像@bianca说的,你最好不要使用文件路径。相反,只使用文件名来创建文件。像这样:

public static void saveTextToFile(Context context, String filename, String content) {
  try {
     FileOutputStream fos = context.openFileOutput(filename, Context.MODE_PRIVATE);
     fos.write(content.getBytes());
     fos.close();
  } catch (Exception e) {
     e.printStackTrace();
  }
}

要获取该文件,您可以用途:

File file = new File(context.getFilesDir(), filename);

阅读更多:Saving Files.

相关问题