java.io.File. <init> (Archivo, String) dependiente de la versión del JDK

Ivan Kalinin:

Es ve como java.io.File. (Archivo, String) es la versión JDK dependiente. Código de ejemplo se ejecuta en Windows 10.

Código de ejemplo:

public static void main(String... args) {
    String path = "C:\\Workspace\\project";
    File file = null;
    for (String part : path.split("\\\\")) {
        file = new File(file, part);
    }
    System.out.println(file);
    // prints "C:Workspace\project" for JDK 9+
    // prints "C:\Workspace\project" for JDK 8
}

¿Podría por favor la dirección ¿hay algún problema conocido o solución para el caso

davidxxx:

En Java 9, la WinNTFileSystemclase (implementación de sistema de archivos para Windows) cambió.
Es probable que resuelve un problema, que la forma en la clase considera lo que es una ruta absoluta es. No he encontrado un error que especifica exactamente este, pero algunos están cerca.

File.isAbsolute() estados:

En los sistemas Microsoft Windows, un nombre de ruta es absoluta si su prefijo es un especificador de unidad seguido de "\", o si su prefijo es "\\".

Así que de acuerdo a la especificación, por la siguiente:

File x = new File("C:", "Workspace"); 
System.out.println(x.isAbsolute()); // not absolute according to the spec

File xx = new File("C:\\", "Workspace");
System.out.println(xx.isAbsolute());

File xxx = new File("\\\\Workspace");
System.out.println(xxx.isAbsolute());

esperamos :

falsa verdad verdadera

Sin embargo, se obtiene:

verdad verdad verdad

A partir de Java 9 que produce el resultado esperado.

El problema es que antes de Java 9 un camino sin \es todo lo mismo considerado como una ruta absoluta:

File x = new File("C:", "Workspace");
System.out.println(x.isAbsolute()); // true

Mientras que esto no debería ser el caso.

En concreto, los principales cambios se refieren a la resolve(String parent, String child)forma de la WinNTFileSystemclase.
Antes, resolve()resolvió el camino abstracta mediante la adición de una barra entre el padre y el hijo por cualquier ruta niño que no se inicia con una barra.
A partir de Java 9, resolve()no agrega una barra por más tiempo entre el padre y el niño si el padre es una unidad.

Aquí está el cambio :

boolean isDirectoryRelative =
    pn == 2 && isLetter(parent.charAt(0)) && parent.charAt(1) == ':';

if (child.charAt(childStart) == slash || isDirectoryRelative) {
    theChars = new char[strlen];             ^-------- this one was added from Java 9
    parent.getChars(0, parentEnd, theChars, 0);
    child.getChars(childStart, cn, theChars, parentEnd);
} else {
    theChars = new char[strlen + 1];
    parent.getChars(0, parentEnd, theChars, 0);
    theChars[parentEnd] = slash;
    child.getChars(childStart, cn, theChars, parentEnd + 1);
}

Consecuencias

Acerca de su pregunta :

¿Podría por favor la dirección ¿hay algún problema conocido o solución para el caso

La diferencia entre las dos versiones de JDK asuntos. Se refiere tanto el valor de nombre de ruta normalizada de la ruta de acceso de resumen ( File.getPath()) y el valor de la ruta absoluta File.getAbsolutePath()como ahora new File("C:", "Workspace")produce una ruta relativa.

Si su aplicación se basa en File.getPath()hacer un poco de análisis de eso, podría tener un comportamiento distinto y crear algunos problemas.
Para tener un código portable entre las versiones de JDK, cualquier análisis en el camino resuelto debe considerar como opcional el \justo después de la unidad de Windows.
De esta manera C:\y C:se maneja de la misma manera.

Si su aplicación se basa en File.getAbsolutePath(), sino que también podría tener algunas sorpresas de Java 9 como ahora la ruta relativa será resuelta en contra del sistema de archivos (antes como una ruta absoluta esto sólo volvió en sí).
Así que en lugar, usted debe utilizar por lo que probablemente File.getPath()no resolver la ruta contra el sistema de archivos.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=138153&siteId=1
Recomendado
Clasificación