【问题标题】:How to write text to a file on external storage on android?如何将文本写入android外部存储上的文件?
【发布时间】:2016-10-14 08:07:03
【问题描述】:

将一些文本写入 android 设备上的文件似乎是一项重大努力。从an answer given here 开始,我在我的单个“Hello-World”活动中实现了以下代码:

try {
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(this.openFileOutput("config.txt", Context.MODE_PRIVATE));
    outputStreamWriter.write("lalala");
    outputStreamWriter.close();
} catch (IOException e) {
    Log.e("Exception", "File write failed: " + e.toString());
}

它不会抛出异常,但似乎可以工作。但是有没有办法在 android 上“查看”使用File Manager 创建的文件?代码 sn-p 似乎写入了与应用程序本身相关的 android 文件系统上的“秘密”位置(由 this.openFileOutput 管理)。

咨询不同的谷歌链接(thisand thisand this)我想出了以下代码:

File file = new File(this.getExternalFilesDir("temp"), "testfile.txt");
FileOutputStream fileOutput = openFileOutput(file.getName(), Context.MODE_WORLD_WRITEABLE);
fileOutput.write("lalala");
fileOutput.close();

这会引发错误

Error:(55, 19) error: no suitable method found for write(String) method FileOutputStream.write(int) is not applicable (actual argument String cannot be converted to int by method invocation conversion) method FileOutputStream.write(byte[],int,int) is not applicable (actual and formal argument lists differ in length) method OutputStream.write(int) is not applicable (actual argument String cannot be converted to int by method invocation conversion) method OutputStream.write(byte[],int,int) is not applicable (actual and formal argument lists differ in length) method OutputStream.write(byte[]) is not applicable (actual argument String cannot be converted to byte[] by method invocation conversion)

那么如何正确地做到这一点呢?

附带说明:这仅用于调试/教育目的,不打算成为最终应用程序的一部分!

要明确:我想在 temp 目录中创建一个文件,我可以使用 FileManager 看到(temp 目录与 My Documents 处于同一级别 、MusicDCIMDownload 等...)

【问题讨论】:

    标签: java android


    【解决方案1】:

    但是有没有办法“查看”在 android 上使用文件管理器创建的文件?

    我不确定您所指的“文件管理器”是什么,因为 Android 并没有真正的。但是,您正在写信给应用程序的internal storage,这是应用程序私有的。其他应用程序或普通用户无法查看,除非在 root 设备上以及通过一些繁琐的 Android SDK 工具。

    那么如何正确地做到这一点呢?

    File file = new File(this.getExternalFilesDir(null), "testfile.txt");
    FileOutputStream fileOutput = new FileOutputStream(file);
    OutputStreamWriter outputStreamWriter=new OutputStreamWriter(fileOutput);
    outputStreamWriter.write("lalala");
    outputStreamWriter.flush();
    fileOutput.getFD().sync();
    outputStreamWriter.close();
    

    还有:

    • 请在后台线程上完成这项工作

    • 在 Android 4.3(API 级别 18)和更早的设备上,您需要持有 WRITE_EXTERNAL_STORAGE 权限才能使用 external storage

    如果您还希望此文件快速显示在设备上或开发机器上的文件管理器中,请在关闭文件后使用:

    MediaScannerConnection.scanFile(
      this,
      new String[]{file.getAbsolutePath()},
      null,
      null);
    

    (其中this 是一些Context,例如ActivityService

    【讨论】:

    • 未使用的变量outputStreamWriter是做什么用的?
    • @Alex:哎呀,对不起——那是给write() 电话的。我已经确定了答案。
    • 好的,我明白了,谢谢。您能解释一下FileFileOutputStreamOutputStreamWriter 之间的区别吗?我只熟悉几种编程语言,它们通常有一个名为File 的实体或将某些东西写入文件的东西。为什么 android 使用这三个实体来代替?出现这种并发症的原因是什么?
    • @Alex:“为什么 android 使用这三个实体来代替?” ——安卓没有。 Java 可以。至于“为什么开发者 X 做了我不同意的 Y 事?”,Stack Overflow 不太适合这样的问题。通常唯一能明确回答这个问题的人是开发人员 X,他不太可能在这里提供帮助。我可以告诉你,文件与流分离是编程语言中的一个常见概念,因为流不必与文件相关(例如,通过套接字交换数据的流)。
    • 无论如何,您的代码似乎并不能正常工作。当我在temp 目录中检查我的设备时,我没有看到名为testfile.txt 的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2012-01-09
    • 2015-07-17
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多