Спасибо, Локеш Кумар, ваш код очень помог!Тем не менее, мне нравится выделять проблему с вашим решением.
При попытке использовать ваш код:
FileOutputStream tmp = new FileOutputStream(getCacheDir().getPath() + "/temp.myfile");
byte[] buffer = new byte[1024];
while (attachment.read(buffer) > 0)
tmp.write(buffer);
tmp.close();
attachment.close();
он скопирован во весь файл, но я думаю, что естьпроблема.Делая attachment.read(buffer)
, вы каждый раз читаете 1024 байта и, скажем, у вас есть файл размером 2000 байтов.
При первом чтении вы получите первые 1024, затем при следующем и последнем чтении вы получите последние 976 байт, и из того, что я видел, в этом случае буфер не очищаетпоследние байты из прочитанного предварительного просмотра, конец файла будет 976 байт от последнего чтения, а остальные 48 от чтения до самого последнего. Это сделает неверный конец файла.
В моем случае, вложение - это файл kml (файл данных о местоположении в формате xml), который мне пришлось скопировать.Пытаясь использовать этот код, я всегда получал неверный конец kml.после закрывающего тега я получил некоторый текст, который был от чтения до самого последнего.
Примерно так:
</Document>
</kml>
278
34.81186031,31.96118044
34.81184437,31.96122622
34.81181701,31.96127052
34.81182701,31.9612875
Конечно, это недопустимый kml, и он будет вызывать ошибки при попытке его анализа.
Поэтому я использовал другой код для чтения из входного потока, который сделал работу лучше.
Это мой код для копирования файла:
InputStream attachment = getContentResolver().openInputStream(container.uri);
FileOutputStream tmp = new FileOutputStream(container.fileName);
BufferedInputStream bis = new BufferedInputStream(attachment);
StringBuffer b = new StringBuffer();
while (bis.available() != 0) {
char c = (char) bis.read();
b.append(c);
}
bis.close();
attachment.close();
tmp.write(String.valueOf(b).getBytes());
tmp.close();