Java NIO file path issue

JavaNio

Java Problem Overview


I used the following code to get the path

Path errorFilePath = FileSystems.getDefault().getPath(errorFile);

When I try to move a file using the File NIO, I get the error below:

java.nio.file.InvalidPathException: Illegal char <:> at index 2: \C:\Sample\sample.txt

I also tried using URL.encode(errorFile) which results in the same error.

Java Solutions


Solution 1 - Java

You need to convert the found resource to URI. It works on all platforms and protects you from possible errors with paths. You must not worry about how full path looks like, whether it starts with '' or other symbols. If you think about such details - you do something wrong.

ClassLoader classloader = Thread.currentThread().getContextClassLoader();
String platformIndependentPath = Paths.get(classloader.getResource(errorFile).toURI()).toString();

Solution 2 - Java

The path \C:\Sample\sample.txt must not have a leading \. It should be just C:\Sample\sample.txt

Solution 3 - Java

To make it work on both Windows and Linux\OS X consider doing this:

String osAppropriatePath = System.getProperty( "os.name" ).contains( "indow" ) ? filePath.substring(1) : filePath;

If you want to worry about performance I'd store System.getProperty( "os.name" ).contains( "indow" ) as a constant like

private static final boolean IS_WINDOWS = System.getProperty( "os.name" ).contains( "indow" );

and then use:

String osAppropriatePath = IS_WINDOWS ? filePath.substring(1) : filePath;

Solution 4 - Java

To be sure to get the right path on Windows or Linux on any drive letter, you could do something like this:

path = path.replaceFirst("^/(.:/)", "$1");

That says: If the beginning of the string is a slash, then a character, then a colon and another slash, replace it with the character, the colon, and the slash (leaving the leading slash off).

If you're on Linux, you shouldn't end up with a colon in your path, and there won't be a match. If you are on Windows, this should work for any drive letter.

Solution 5 - Java

Another way to get rid of the leading separator is to create a new file and convert it to a string then:

new File(Platform.getInstallLocation().getURL().getFile()).toString()

Solution 6 - Java

try to use like this C:\\Sample\\sample.txt

Note the double backslashes. Because the backslash is a Java String escape character, you must type two of them to represent a single, "real" backslash.

or

Java allows either type of slash to be used on any platform, and translates it appropriately. This means that you could type. C:/Sample/sample.txt

and it will find the same file on Windows. However, we still have the "root" of the path as a problem.

The easiest solution to deal with files on multiple platforms is to always use relative path names. A file name like Sample/sample.txt

Solution 7 - Java

Normal Windows Environment

Disclaimer: I haven't tested this on a normal windows environment.

"\\C:\\" needs to be "C:\\"

final Path errorFilePath = Paths.get(FileSystems.getDefault().getPath(errorFile).toString().replace("\\C:\\","C:\\"));

Linux-Like Windows Environment

My Windows box has a Linux-Like environment so I had to change "/C:/" to be "C:\\".

This code was tested to work on a Linux-Like Windows Environment:

final Path errorFilePath = Paths.get(FileSystems.getDefault().getPath(errorFile).toString().replace("/C:/","C:\\"));

Solution 8 - Java

Depending on how are you going to use the Path object, you may be able to avoid using Path at all:

// works with normal files but on a deployed JAR gives "java.nio.file.InvalidPathException: Illegal char <:> "
URL urlIcon = MyGui.class.getResource("myIcon.png");
Path pathIcon = new File(urlIcon.getPath()).toPath();
byte bytesIcon[] = Files.readAllBytes(pathIcon);


// works with normal files and with files inside JAR:
InputStream in = MyGui.class.getClassLoader().getResourceAsStream("myIcon.png");
byte bytesIcon[] = new byte[5000];
in.read(bytesIcon);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKathirView Question on Stackoverflow
Solution 1 - JavaAlexandrView Answer on Stackoverflow
Solution 2 - JavaJim GarrisonView Answer on Stackoverflow
Solution 3 - JavaSledView Answer on Stackoverflow
Solution 4 - JavaEricView Answer on Stackoverflow
Solution 5 - JavahueamiView Answer on Stackoverflow
Solution 6 - JavaRiddhish.ChaudhariView Answer on Stackoverflow
Solution 7 - JavaKorey HintonView Answer on Stackoverflow
Solution 8 - JavagolimarView Answer on Stackoverflow