java - array - FileOutputStream se bloquea con el error "error de abrir: EISDIR(es un directorio)" al descargar la imagen
java fileoutputstream txt (4)
Estoy tratando de descargar un iamge desde internet, aquí está el código:
try {
String imgURL = c.imgURL;
String imgPATH = c.imgPATH;
URL url = new URL(imgURL);
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();
try {
File f = new File(imgPATH);
f.mkdirs();
BufferedInputStream input = new BufferedInputStream(url.openStream());
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(imgPATH), 8192); // CRASH HERE
byte data[] = new byte[8192];
long total = 0;
int count = 0;
int updateUILimiter = 0;
while ((count = input.read(data)) != -1) {
total += count;
if (updateUILimiter == 20)
// publishProgress((int) (total * 100 / lenghtOfFile));
updateUILimiter = 0;
else
updateUILimiter++;
output.write(data, 0, count);
if (isCancelled()) {
output.flush();
output.close();
input.close();
return null;
}
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
c.imgPATH = "";
return null;
}
} catch (Exception e) {
c.imgPATH = "";
return null;
}
Aquí está el mensaje de error:
/mnt/sdcard/tmp/3.png: error al abrir: EISDIR (es un directorio)
¿Por qué es esto?
"/ mnt / sdcard / tmp /" existe.
Primero puede hacer el directorio y luego escribir el código.
URL downloadURL=null;
HttpURLConnection urlConnection=null;
InputStream inputStream=null;
FileOutputStream fos=null;
Uri uri=Uri.parse(url);
try {
downloadURL=new URL(url);
urlConnection= (HttpURLConnection) downloadURL.openConnection();
inputStream=urlConnection.getInputStream();
File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/");
if(!file.exists())
{
file.mkdirs();
}
File file1=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"+uri.getLastPathSegment());
fos=new FileOutputStream(file1);
byte[] buffer=new byte[1024];
int read=-1;
while((read=inputStream.read(buffer))!=-1)
{
/* Message.L(""+read);*/
fos.write(buffer,0,read);
}
}
Así puedes hacer
File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/");
if(!file.exists())
{
file.mkdirs();
}
File file1=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"+uri.getLastPathSegment());
fos=new FileOutputStream(file1);
El problema es que estás usando la función.
f.mkdirs();
esta función creará una carpeta llamada "3.png" en lugar de un archivo llamado "3.png", así que primero elimine esta carpeta,
entonces reemplaza la función
f.mkdirs();
a
f.createNewFile();
Espero que esto ayude.
Reemplace f.mkdirs()
con f.createNewFile().
3.png
es un directorio, porque lo haces llamando a f.mkdirs();
. Pruebe f.getParentFile().mkdirs()
lugar. De la documentation :
Crea el directorio nombrado por este nombre de ruta abstracto , incluidos los directorios principales necesarios pero inexistentes. Tenga en cuenta que si esta operación falla, es posible que haya logrado crear algunos de los directorios principales necesarios.
(énfasis mío). En otras palabras, la ruta completa contenida en la instancia de File
f
se toma como un nombre de directorio, hasta e incluyendo la parte final ( 3.png
en la salida de ejemplo).