【问题标题】:FileWriter not writing to file in Android?FileWriter没有写入Android中的文件?
【发布时间】:2012-07-08 08:14:17
【问题描述】:

我正在尝试写入一个名为“filename.txt”的新文件,并在打开应用程序时写出“hi”。我该怎么做?我在 Eclipse 中运行此代码,按 F11,打开 AVD,然后单击应用程序。我得到“Hello World,appname!”消息,但没有创建文件。

package com.paad.comparison;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.widget.Toast;

public class ComparisonOfControlCreationActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
        String string1 = "Hey you";
        FileWriter fWriter;
        try{
            fWriter = new FileWriter("filename.txt", true);
            fWriter.write("hi");
            fWriter.flush();
            fWriter.close();
        } catch(Exception e) {
            e.printStackTrace();
        }

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

编辑:对于将来碰巧遇到此问题的任何人,请确保您的 AndroidManifest.xml 文件中包含以下行:

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

【问题讨论】:

  • logcat运行时有什么东西吗?
  • 对于那些比较新并且正在调试的人,只知道API级别19或更高级别不需要WRITE_EXTERNAL_STORAGE。因此,如果您的应用针对 API 级别 21(检查您的 app/build.gradle),那么您不需要将权限添加到您的 AndroidManifest.xml source

标签: android filewriter


【解决方案1】:

试试这样:

FileWriter fWriter;
File sdCardFile = new File(Environment.getExternalStorageDirectory() + " \filename.txt");
Log.d("TAG", sdCardFile.getPath()); //<-- check the log to make sure the path is correct.
try{
     fWriter = new FileWriter(sdCardFile, true);
     fWriter.write("hi");
     fWriter.flush();
     fWriter.close();
 }catch(Exception e){
          e.printStackTrace();
 }

【讨论】:

  • 谢谢,蒂姆。该代码运行;但是,我仍然没有看到文件被保存在任何地方。是否应该有 .getExternalStorageDirectory() 引用的路径?这只能在硬件设备上正确运行吗?
  • 我认为它可以在模拟器上运行,但老实说我不知道​​。我只使用模拟器来测试不同的屏幕尺寸。我在设备上测试的所有其他内容。
  • @MiguelDiaz 你的模拟器有 SD 卡设置吗?
【解决方案2】:

您需要在关闭文件之前调用sync(),但您需要一个FileDescriptor,我不相信它可以直接从FileWriter 获得。但是,您可以使用FileDescriptor 创建一个FileWriter 对象,FileOutputStream 可以为此提供一个对象。

以下内容基于您的初始代码,但在我的示例中,我选择将文件存储在 sdcard 上,因此要运行以下代码按原样,您的应用清单将需要正确的在&lt;application&gt; 标签之前添加了权限。

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

也就是说,如果您想将文件直接存储在设备上,结果不会受到影响。

代码(在 Desire HD 上测试):

package com.paad.comparison;

import java.io.FileOutputStream;
import java.io.FileWriter;

import android.app.Activity;
import android.os.Bundle;

public class ComparisonOfControlCreationActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        String string1 = "Hey you";

        FileOutputStream fos ;

        try {
            fos = new FileOutputStream("/sdcard/filename.txt", true);

            FileWriter fWriter;

            try {
                fWriter = new FileWriter(fos.getFD());
                fWriter.write("hi");
                fWriter.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                fos.getFD().sync();
                fos.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

最后,由于close() 调用了flush(),所以在close() 之前调用flush() 是多余的,尽管没有害处。

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2011-03-01
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多