0

有人可以看看这段代码,让我知道我做错了什么吗?这是一个简单的函数,它接受一个字符串作为参数,并将其用作文件名,并在其末尾添加“.txt”。

该函数检查文件是否存在,如果不存在则创建它,然后将两行文本写入文件。一切似乎都在工作,并且在 sd 卡上成功创建了文件。然而,一切都完成后,文件是空的(并且大小为 0 字节)。

我怀疑我忽略了一些显而易见的事情。

public void writeFile(String fileName) {
    String myPath = new File(Environment.getExternalStorageDirectory(), "SubFolderName");
    myPath.mkdirs();

    File file = new File(myPath, fileName+".txt");

    try {
        if (!file.exists()) {
            if (!file.createNewFile()) {
                Toast.makeText(this, "Error Creating File", Toast.LENGTH_LONG).show();
                return;
            }
        }

        OutputStreamWriter writer = new OutputStreamWriter(openFileOutput(file.getName(), Context.MODE_PRIVATE));
        writer.append("First line").append('\n');
        writer.append("Second line").append('\n');

        writer.close();
    }
    catch (IOException e) {
        // Do whatever
    }
}
4

3 回答 3

1

那个花了一段时间才发现。这里的 javadocs 让我走上了正轨。它说:

参数
  • name 要打开的文件的名称;不能包含路径分隔符。
  • 模式 操作模式。使用 0 或 MODE_PRIVATE 进行默认操作,使用 MODE_APPEND 附加到现有文件,使用 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 来控制权限。
  • 如果文件不存在,则会创建该文件,但会在私有应用程序空间中创建该文件。您在 sd 卡上的某处使用创建文件,File.createNewFile()但是当您这样做时,它总是在私有应用程序空间中context.openFileOutput()创建一个私有文件。

    编辑:这是我的代码。我通过编写和阅读这些行来扩展您的方法,并将我得到的内容打印到 logcat。

    <pre>
        public void writeFile(String fileName) {
        try {
            OutputStreamWriter writer = new OutputStreamWriter(
                    getContext().openFileOutput(fileName + ".txt", Context.MODE_PRIVATE));
            writer.append("First line").append('\n');
            writer.append("Second line").append('\n');
    
            writer.close();
        }
        catch (IOException e) {
            Log.e("STACKOVERFLOW", e.getMessage(), e);
            return;
            // Do whatever
        }
    
        // Now read the file
        try {
            BufferedReader is = new BufferedReader(
                    new InputStreamReader(
                            getContext().openFileInput(fileName + ".txt")));
            for(String line = is.readLine(); line != null; line = is.readLine())
                Log.d("STACKOVERFLOW", line);
    
            is.close();
        } catch (IOException e) {
            Log.e("STACKOVERFLOW", e.getMessage(), e);
            return;
            // Do whatever
        }
    }
    

    于 2013-09-08T15:55:47.190 回答
    1

    嗨,我将向您展示我使用的完整代码,效果很好。我不使用

     new OutputStreamWriter() 
    

    我用

    new BufferedWriter()
    

    这是我的片段

    public void writeToFile(Context context, String fileName, String data) {
    
        Writer mwriter;
    
        File root = Environment.getExternalStorageDirectory();
        File dir = new File(root.getAbsolutePath() + File.separator + "myFolder");
    
        if (!dir.isDirectory()) {
            dir.mkdir();
        }
    
        try {
            if (!dir.isDirectory()) {
                throw new IOException(
                    "Unable to create directory myFolder. SD card mounted?");
            }
            File outputFile = new File(dir, fileName);
            mwriter = new BufferedWriter(new FileWriter(outputFile));
            mwriter.write(data); // DATA WRITE TO FILE
            Toast.makeText(context.getApplicationContext(),
                "successfully saved to: " + outputFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
            mwriter.close();
        } catch (IOException e) {
            Log.w("write log", e.getMessage(), e);
            Toast.makeText(context, e.getMessage() + " Unable to write to external storage.",Toast.LENGTH_LONG).show();
            }
    }
    

    -- 原始代码 --

    于 2013-09-08T14:30:08.867 回答
    0

    将模式从更改Context.MODE_PRIVATEContext.MODE_APPENDinopenFileOutput()

    MODE_APPEND

    MODE_PRIVATE

    代替

    OutputStreamWriter writer = new OutputStreamWriter(openFileOutput(file.getName(), Context.MODE_PRIVATE));
    

    利用

    OutputStreamWriter writer = new OutputStreamWriter(openFileOutput(file.getName(), Context.MODE_APPEND));
    

    更新 :

    1.

    FileOutputStream osr = new FileOutputStream(file.getName(), true); // this will set append flag to true
    
    OutputStreamWriter writer = new OutputStreamWriter(osr);
    BufferedWriter fbw = new BufferedWriter(writer);
                fbw.write("First line");
                fbw.newLine();
                fbw.write("Second line");
                fbw.newLine();
                fbw.close();
    

    或 2。

    private void writeFileToInternalStorage() {
              FileOutputStream osr = new FileOutputStream(file.getName(), true); // this will set append flag to true
              String eol = System.getProperty("line.separator");
              BufferedWriter fbw = null;
              try {
                  OutputStreamWriter writer = new OutputStreamWriter(osr);
                  fbw = new BufferedWriter(writer);
                  fbw.write("First line" + eol);
                  fbw.write("Second line" + eol);           
    
              } catch (Exception e) {
                  e.printStackTrace();
              } finally {
                if (fbw != null) {
                try {
                    fbw.close();
                } catch (IOException e) {
                  e.printStackTrace();
                }
                }
              }
            } 
    
    于 2013-09-08T14:18:33.527 回答