Запись файла на SDCard
Я пытаюсь написать файл из ответа на публикацию Http в файл sdcard. Все работает нормально, пока массив байтов данных не будет восстановлен.
Я пробовал установить в манифесте разрешение WRITE_EXTERNAL_STORAGE
и попробовал много разных комбинаций учебников, которые я нашел в сети.
Все, что я мог найти, это использовать метод openFileOutput("",MODE_WORLD_READABLE)
, но как мое приложение пишет файл с помощью потока. В частности, поток вызывается из другого потока, когда файл должен быть записан,
поэтому предоставление объекта активности не сработало, хотя я пробовал его.
Приложение прошло долгий путь, и я не могу изменить способ написания приложения.
Пожалуйста, помогите мне?
CODE
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 байтов.
Ответы
Ответ 1
Метод openFileOutput()
записывает данные в область личных данных приложения (а не SD-карту), поэтому, вероятно, не то, что вы хотите. Вы должны иметь возможность вызвать Environment.getExternalStorageDirectory()
, чтобы получить корневой путь к SD-карте и использовать его для создания FileOutputStream
. Оттуда просто используйте стандартные java.io-процедуры.
Ответ 2
//------------------------------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" />
Ответ 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);
}