web-dev-qa-db-fra.com

Java: Obtenez l'URI de FilePath

Je connais peu Java. J'ai besoin de construire une représentation sous forme de chaîne d'un URI à partir de FilePath(String) sur Windows. Parfois, le inputFilePath que j'obtiens est: file:/C:/a.txt et parfois c'est: C:/a.txt. En ce moment, ce que je fais c'est:

new File(inputFilePath).toURI().toURL().toExternalForm()

Ce qui précède fonctionne très bien pour les chemins d'accès qui ne sont pas préfixés par file:/, mais pour les chemins précédés de file:/, la méthode .toURI le convertit en un URI invalide, en ajoutant la valeur du répertoire courant, et donc le chemin devient invalide.

Veuillez m'aider en suggérant une manière correcte d'obtenir l'URI approprié pour les deux types de chemins.

17
HarshG

Ce sont les uri de fichier valides:

file:/C:/a.txt            <- On Windows
file:///C:/a.txt          <- On Windows
file:///home/user/a.txt   <- On Linux

Vous devrez donc supprimer file:/ ou file:/// pour Windows et file:// pour Linux.

12
gigadot

Utilisez simplement Normalize();

Exemple:

path = Paths.get("/", input).normalize();

cette ligne va normaliser tous vos chemins.

5
william.eyidi

De SAXLocalNameCount.Java de https://jaxp.Java.net :

/**
 * Convert from a filename to a file URL.
 */
private static String convertToFileURL ( String filename )
{
    // On JDK 1.2 and later, simplify this to:
    // "path = file.toURL().toString()".
    String path = new File ( filename ).getAbsolutePath ();
    if ( File.separatorChar != '/' )
    {
        path = path.replace ( File.separatorChar, '/' );
    }
    if ( !path.startsWith ( "/" ) )
    {
        path = "/" + path;
    }
    String retVal =  "file:" + path;

    return retVal;
}
5
Lyle Z

L'argument de new File(String) est un chemin, pas un URI. La partie de votre message après "mais" est donc une utilisation non valide de l'API.

2
user207421
class TestPath {

    public static void main(String[] args) {
        String brokenPath = "file:/C:/a.txt";

        System.out.println(brokenPath);

        if (brokenPath.startsWith("file:/")) {
            brokenPath = brokenPath.substring(6,brokenPath.length());
        }
        System.out.println(brokenPath);
    }
}

Donne la sortie:

file:/C:/a.txt
C:/a.txt
Press any key to continue . . .
0
Andrew Thompson