将文件写入sd卡

21
我正在尝试将接收到的 HTTP POST 响应中的数据写入到sdcard上的文件中。一切工作正常,直到获取数据的字节数组。
我已经尝试在清单文件中设置WRITE_EXTERNAL_STORAGE权限,并尝试了许多在网上找到的不同教程的组合。
我所能找到的都是使用活动的openFileOutput("",MODE_WORLD_READABLE)方法,但我的应用程序通过使用线程来编写文件。具体来说,当需要写入文件时,从另一个线程中调用一个线程,因此即使我尝试过,传递一个活动对象也不起作用。
该应用程序已经有很长的一段时间了,我无法更改目前的编写方式。
请问有人能帮忙吗?
代码:
File file = new File(bgdmanip.savLocation);
FileOutputStream filecon = null;
filecon = new FileOutputStream(file);

byte[] myByte;
myByte = Base64Coder.decode(seReply);

bos.write(myByte);
filecon.write(myByte);
myvals = x * 11024;

bgdmanip.savLocation保存了整个文件路径。seReply是从HttpPost响应中返回的字符串。第二个代码块与x相关联循环。文件已创建但大小为0字节。

3个回答

29
//------------------------------WRITING DATA TO THE FILE ---------------------------------      

btnWriteSDFile.setOnClickListener(new OnClickListener() 
    {
    public void onClick(View v)
    {       

        try {
            File myFile = new File("/sdcard/mysdfile.txt");
            myFile.createNewFile();
            FileOutputStream fOut = new FileOutputStream(myFile);
            OutputStreamWriter myOutWriter =new OutputStreamWriter(fOut);
            myOutWriter.append(txtData.getText());
            myOutWriter.close();
            fOut.close();
            Toast.makeText(v.getContext(),"Done writing SD 'mysdfile.txt'", Toast.LENGTH_SHORT).show();
            txtData.setText("");
        } 
        catch (Exception e) 
        {
            Toast.makeText(v.getContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
        }
    }


    }); 

//---------------------------READING DATA FROM THE FILE PLACED IN SDCARD-------------------//       
        btnReadSDFile.setOnClickListener(new OnClickListener()
        {

        public void onClick(View v) 
        {

        try {

            File myFile = new File("/sdcard/mysdfile.txt");
            FileInputStream fIn = new FileInputStream(myFile);
            BufferedReader myReader = new BufferedReader(new InputStreamReader(fIn));
            String aDataRow = "";
            String aBuffer = "";
            while ((aDataRow = myReader.readLine()) != null) 
            {
                aBuffer += aDataRow ;
            }
            txtData.setText(aBuffer);
            myReader.close();
            Toast.makeText(v.getContext(),"Done reading SD 'mysdfile.txt'",Toast.LENGTH_SHORT).show();
        } 
        catch (Exception e)
        {
            Toast.makeText(v.getContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
        }
        }
        }); 

同时在 Android.Manifest 文件中写入此权限。

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

1
这就是我们所说的程序员视角。 - Cyph3rCod3r
我想在SD卡中存储两个字符串值,而不是使用EditText。请问如何实现? - AndroidOptimist
@Alliswell 请点击此链接,希望您能找到解决方案:http://stackoverflow.com/questions/9962896/store-data-text-to-sd-card-in-android - Pir Fahim Shah
@Alliswell 很棒,你找到了解决方案,现在该请我吃午餐了,哈哈哈。祝你好运! - Pir Fahim Shah

22
< p > openFileOutput() 方法将数据写入应用程序的私有数据区域(而不是SD卡),因此这可能不是您想要的。 您应该能够调用 Environment.getExternalStorageDirectory() 来获取SD卡的根路径,并使用它来创建 FileOutputStream 。 从那里,只需使用标准java.io例程即可。

感谢Erich。我正在将完整路径作为字符串传递,例如“/sdcard/filename.ext”。文件已创建,但文件大小仍为0字节。我也无法在Eclipse的DDMS中使用推送/拉取文件控件。 - Sumit M Asok
你可能需要发布一些文件写入代码来帮助诊断问题。不是全部,但至少要了解正在发生的基本情况。此外,您是否在LogCat中看到任何消息? - Erich Douglass
Erich,我已经更新了代码。LogCat中没有关于文件操作的消息被创建。我多次更改了代码,有些代码出现了错误,但我不记得哪些代码给我带来了错误。 - Sumit M Asok
Erich,我在Eclipse DDMS中也看不到推送和拉取按钮。这是否与我无法写入文件有关?我可以看到SD卡及其中的文件,但上述控制按钮却不可见。 - Sumit M Asok

3
这是一个示例:

这里有一个样本:

// Log used as debug
File log = new File(Environment.getExternalStorageDirectory(), "Log.txt");
try {
    out = new BufferedWriter(new FileWriter(log.getAbsolutePath(), false));
    out.write(new Date().toString());
    out.write(" : \n");
} catch (Exception e) {
    Log.e(TAG, "Error opening Log.", e);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接