una remoto que por not interrupción found forzado existente exceptions conexión java exception file-io

remoto - ¿Cuáles son las posibles razones para java.io.IOException: "El nombre del archivo, el nombre del directorio o la sintaxis de la etiqueta del volumen es incorrecto"



java.io.ioexception se ha forzado la interrupción de una conexión existente por el host remoto (12)

Como no pude reproducir el error en mi propia máquina o poner manos a la obra del usuario donde falló el código, esperé hasta ahora para declarar una respuesta aceptada. Cambié el código a lo siguiente:

File parentFolder = new File(targetPath); ... do some checks on parentFolder here ... File targetFile = new File(parentFolder, filename); targetFile.createNewFile(); fileInputStream = new FileInputStream(fileToCopy); fileOutputStream = new FileOutputStream(targetFile); byte[] buffer = new byte[64*1024]; int i = 0; while((i = fileInputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, i); }

Después de eso, funcionó para el usuario que informa el problema.

Parece que la respuesta de Alexanders fue el truco, aunque en realidad uso un constructor ligeramente diferente de lo que él dio, pero en la misma línea.

Aún tengo que convencer a ese usuario para que me ayude a verificar que el cambio de código solucionó el error (en lugar de que él hiciera algo diferente) al volver a ejecutar la versión anterior y verificar si aún falla.

por cierto. el registro estaba en su lugar y la ruta registrada parecía estar bien, perdón por no mencionar eso. Lo di por sentado y me pareció innecesariamente complicado el código en la pregunta.

Gracias por las respuestas útiles.

Estoy tratando de copiar un archivo usando el siguiente código:

File targetFile = new File(targetPath + File.separator + filename); ... targetFile.createNewFile(); fileInputStream = new FileInputStream(fileToCopy); fileOutputStream = new FileOutputStream(targetFile); byte[] buffer = new byte[64*1024]; int i = 0; while((i = fileInputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, i); }

Para algunos usuarios, targetFile.createNewFile genera esta excepción:

java.io.IOException: The filename, directory name, or volume label syntax is incorrect at java.io.WinNTFileSystem.createFileExclusively(Native Method) at java.io.File.createNewFile(File.java:850)

El nombre de archivo y el directorio parecen ser correctos. El directorio targetPath incluso se comprueba antes de que se ejecute el código de copia y el nombre del archivo es así: AB_timestamp.xml

El usuario tiene permisos de escritura para targetPath y puede copiar el archivo sin problemas utilizando el sistema operativo.

Como todavía no tengo acceso a una máquina y aún no puedo reproducir el problema en mi propia máquina, me dirijo a usted en busca de pistas sobre el motivo de esta excepción.


¿Verifica que targetPath es un directorio, o simplemente que algo existe con ese nombre? (Sé que dices que el usuario puede copiarlo desde el sistema operativo, pero tal vez están escribiendo algo más).

¿TargetPath ya tiene un File.separator?

(Ayudaría si pudiera iniciar sesión y decirnos cuál es el valor de targetPath y el nombre del archivo en un caso fallido)


Intente agregar algo de registro para ver exactamente cuál es el nombre y la ruta que el archivo intenta crear, para asegurarse de que el padre sea un directorio.

Además, también puede ver Canales en lugar de usar un bucle. ;-)


Intente crear el archivo en un directorio diferente, por ejemplo, "C: /" después de asegurarse de tener acceso de escritura a ese directorio. Si eso funciona, el nombre de ruta del archivo es incorrecto.

Eche un vistazo al comentario en la Excepción e intente variar todos los elementos en el nombre de ruta del archivo. Experimentar. Sacar conclusiones.


Intente esto, ya que tiene más cuidado de ajustar los caracteres separadores de directorios en la ruta entre targetPath y el nombre de archivo:

File targetFile = new File(targetPath, filename);


Tal vez el archivo ya existe. Podría ser el caso si la resolución de la marca de tiempo no es lo suficientemente buena. Como es una IOException que está obteniendo, puede que no sea un problema de permiso (en cuyo caso obtendría una SecurityException).

Primero verificaría la existencia del archivo antes de intentar crear el archivo e intentar registrar lo que está sucediendo.

Mire public boolean createNewFile () para más información sobre el método que está usando.


Tal vez el problema es que está copiando el archivo a través de la red, a una unidad compartida. Creo que Java puede tener problemas al escribir archivos usando NFS cuando la ruta es algo así como la carpeta / mypc / myshared.

¿Cuál es el camino donde ocurre este problema?


Usted dice "para algunos usuarios", ¿entonces funciona para otros? ¿Cuál es la diferencia aquí? ¿Los usuarios ejecutan instancias diferentes en diferentes máquinas o es un servidor que brinda servicios a usuarios simultáneos?

Si es el último, diría que es un error de concurrencia de alguna manera: dos hilos comprueban si intentan crear el archivo con WinNTFileSystem.createFileExclusively (Native Method) al mismo tiempo.

Ni createNewFile ni createFileExclusively se sincronizan cuando miro la fuente de OpenJDK, por lo que puede que tenga que sincronizar este bloque usted mismo.


Aquí está el programa de prueba que uso

import java.io.File; public class TestWrite { public static void main(String[] args) { if (args.length!=1) { throw new IllegalArgumentException("Expected 1 argument: dir for tmp file"); } try { File.createTempFile("bla",".tmp",new File(args[0])); } catch (Exception e) { System.out.println("exception:"+e); e.printStackTrace(); } } }



Acabo de encontrar el mismo problema. Creo que tiene que ver con el permiso de acceso de escritura. Obtuve el error al intentar escribir en c: / pero al cambiar a D: / todo funcionó bien. Al parecer, Java no tenía permiso para escribir en mi unidad del sistema (ejecutar Windows 7 instalado en C :)


FYI, obtuve entonces cuando mis nombres de archivo tenían una marca de tiempo con dos puntos, es decir, myfile_HH:mm:ss.csv eliminación de dos puntos resolvió el problema.