Converting Java file:// URL to File(…) path, platform independent, including UNC paths

匿名 (未验证) 提交于 2019-12-03 01:10:02

问题:

I am developing a platform independent application. I am receiving a file URL*. On windows these are:

  • file:///Z:/folder%20to%20file/file.txt

  • file://host/folder%20to%20file/file.txt (an UNC path)

I am using new File(URI(urlOfDocument).getPath())which works fine with the first one and also on Unix, Linux, OS X, but does not work with UNC paths.

What is the standard way to convert file: URLs to File(..) paths, being compatible with Java 6?

......

* Note: I am receiving theses URLs from OpenOffice / LibreOffice (XModel.getURL()).

回答1:

Based on the hint and link provided in Simone Giannis answer, this is my hack to fix this.

I am testing on uri.getAuthority(), because UNC path will report an Authority. This is a bug - so I rely on the existence of a bug, which is evil, but it apears as if this will stay forever (since Java 7 solves the problem in java.nio.Paths).

Note: In my context I will receive absolute paths. I have tested this on Windows and OS X.

(Still looking for a better way to do it)

package com.christianfries.test;  import java.io.File; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL;  public class UNCPathTest {      public static void main(String[] args) throws MalformedURLException, URISyntaxException {         UNCPathTest upt = new UNCPathTest();          upt.testURL("file://server/dir/file.txt");  // Windows UNC Path          upt.testURL("file:///Z:/dir/file.txt");     // Windows drive letter path          upt.testURL("file:///dir/file.txt");        // Unix (absolute) path     }      private void testURL(String urlString) throws MalformedURLException, URISyntaxException {         URL url = new URL(urlString);         System.out.println("URL is: " + url.toString());          URI uri = url.toURI();         System.out.println("URI is: " + uri.toString());          if(uri.getAuthority() != null && uri.getAuthority().length() > 0) {             // Hack for UNC Path             uri = (new URL("file://" + urlString.substring("file:".length()))).toURI();         }          File file = new File(uri);         System.out.println("File is: " + file.toString());          String parent = file.getParent();         System.out.println("Parent is: " + parent);          System.out.println("____________________________________________________________");     }  } 


回答2:

Java (at least 5 and 6, java 7 Paths solved most) has a problem with UNC and URI. Eclipse team wrapped it up here : http://wiki.eclipse.org/Eclipse/UNC_Paths

From java.io.File javadocs, the UNC prefix is "////", and java.net.URI handles file:////host/path (four slashes).

More details on why this happens and possible problems it causes in other URI and URL methods can be found in the list of bugs at the end of the link given above.

Using these informations, Eclipse team developed org.eclipse.core.runtime.URIUtil class, which source code can probably help out when dealing with UNC paths.



回答3:

Building on @SotiriosDelimanolis's comment, here a method to deal with URLs (such as file:...) and non-URLs (such as C:...), using Spring's FileSystemResource:

public FileSystemResource get(String file) {     try {         // First try to resolve as URL (file:...)         Path path = Paths.get(new URL(file).toURI());         FileSystemResource resource = new FileSystemResource(path.toFile());         return resource;     } catch (URISyntaxException | MalformedURLException e) {         // If given file string isn't an URL, fall back to using a normal file          return new FileSystemResource(file);     } } 


回答4:

I hope (not exactly verified) that newer java brought nio package and Path. Hopefully it have it fixed: String s="C:\\some\\ile.txt"; System.out.println(new File(s).toPath().toUri());



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!