Windows escape sequence issue with file path in java - java

I need to use windows file path to do some operation on files but i am getting invalid escape sequence error.
File f = new File("C:\test");
the system accepts only " \\ " or "/" but if I copy file path from windows it is with "\".
how can i solve this issue

Use File.separator in place of "".
File f = new File("C:"+File.separator+"test");
File.separator returns "" and it is not treated as an escape character.
If your file test.txt is saved in folder D:/MyFloder/MyPrograms you can do something like this
File f = new File("D:"+File.seperator+"MyFloder"+File.separator+"MyPrograms"+File.separator+"test.txt");
EDIT
You don't need to worry about OS
For Unix : File.separator = /
For Windows : File.separator = \

\ is the escape character in Java Strings. Use \\ instead.
"C:\\test" resolves to the String C:\test

You can use \\ or / but / is better because it is OS-independent.
Replace the single backslash in the path with a double backslash or a single forward slash to solve your issue.
Internally, Java will convert it to the file seperator of the OS

File f = new File("C:\\test"); is correct.
You are not creating a File with the path "C:\\test" here. You are creating a File with the path "C:\test". The \\-to-\ conversion happens when you compile the program - by the time your program is running, the double backslashes are gone.
The same for String - String s = "C:\\test"; does not create a string with two backslashes, only one.
You can think of it this way: the string does not actually have two backslashes, but you have to write it that way to put it in your code.
You might be wondering why that is - it's because backslashes are used to insert special characters in strings. When you type \t in a string it inserts a tab, for example. If you want to insert a backslash, then t, you type \\t.

you can use '/' (as in Linux) in paths since Windows XP, so forget about \

Use java.nio.file.Path instead of java.io, you'll not have problem with escape sequence character :
import java.nio.file.Path;
import java.nio.file.Paths;
Path path = Paths.get("C:\test");

Related

FileNotFoundException while trying to open a File

I am trying to d file = new file (location) while location of file is absolute path with somethign like this : \\test\hold\REPO/TEST/Letter/123.pdf
I am getting file not found exception while files are there in this path. what could be going wrong? can i have path with both forward and backward slash?
String separator = System.getProperty("file.separator");
So location can be rewritten to
location=separator+"test"+separator+"hold"+separator +"REPO"+separator "TEST"+separator+"Letter"+separator+"123.pdf";
In this case no need to think about underlying OS
You need two slashes in a string literal to represent one in the filename. Try
"\\\\test\\hold\\REPO/TEST/Letter/123.pdf"
or better still
"//test/hold/REPO/TEST/Letter/123.pdf"
There is never a need to use a backslash in a filename in Java.
Try adding quotes around the filename.
You can write your code without single backward slashes.if you want to use back-word slashes use \\ instead of \ .A single backward slashes create a problem if you put it inside the String literal.So you can write you code in multiple ways to avoid your exceptions.
1) File f=new File("\\test/hold/REPO/TEST/Letter/123.pdf");
2) File f=new File("\\test\\hold\\REPO/TEST/Letter/123.pdf");
3) File f=new File("\\test\\hold\\REPO\\TEST\\Letter\\123.pdf");
4) File f=new File("/test/hold/REPO/TEST/Letter/123.pdf");
you can use :-
InputStream input = new URL("\\test\hold\REPO/TEST/Letter/123.pdf").openStream();
or
File file = new File(location);
where location=\\test\hold\REPO/TEST/Letter/123.pdf; and Check Using SOP statement whether URL is Call properly or not . hope it will help you to fine better solution

How to call a file from Desktop in Java?

I have a file called temperatures.txt saved to my Desktop, what code would I used to bring it up in Java..I am currently trying
File file = new File("C:/Windows/system32>/Desktop/temperatures.txt");
When I pull up the command on my schools computer it says C:\Windows\system32>
My slashes are backwards because when i compile it says "\" is an illegal character in BlueJ
Another complete solution :
import java.io.File;
import java.io.IOException;
public class Programme {
public static void main(String[] args) {
String yourDesktopPath = System.getProperty("user.home") + "\\Desktop\\";
try {
File file = new File(yourDesktopPath + "temperatures.txt");
if (file.createNewFile()) {
System.out.println("File is created!");
} else {
System.out.println("File already exists.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
It's ok to use slashes instead of backslashes. You can use \\ for backslashes but that won't change anything.
I see 3 possible issues with the path.
1) The path contains the character > which doesn't seem like it belongs there. It should probably be:
File file = new File("C:/Windows/system32/Desktop/temperatures.txt");
2) windows\system32 is a system directory and it could be that windows restricts access to that folder.
3) That is not the common desktop directory. Usually the desktop is in the user directory. For example here:
C:\Users\YourName\Desktop
/ is a forward slash. It is the path separator in Unix-based operating systems.
\ is a backslash. It is the path separator in Windows. Both should work, though. Java will translate approprately.
\ in Java string literals (and similarly in most other programming languages) is an escape character. When you have a string literal written as "C:\Windows..." Your IDE is complaining because Java is trying to treat "\W" as an escape sequence.
To type a backslash character in a string literal, you need to escape the backslash using another backslash. So, replace \ with \\.
File file = new File("C:\\Windows\\system32>\\Desktop\\temperatures.txt");

File path names for Windows and Linux

Below is a path to my Windows directory. Normally the path should have \ instead of // but both seem to work.
String WinDir = "C://trash//blah//blah";
Same for a Linux path. The normal should have a / instead of //. The below and above snippet work fine and will grab the contents of the files specified.
String LinuxDir = "//foo//bar//blah"
So, both use strange declarations of file paths, but both seem to work fine. Elaboration please.
For example,
File file = new File(WinDir);`
file.mkdir();`
Normally, when specifying file paths on Windows, you would use backslashes. However, in Java, and many other places outside the Windows world, backslashes are the escape character, so you have to double them up. In Java, Windows paths often look like this: String WinDir = "C:\\trash\\blah\\blah";. Forward slashes, on the other hand, do not need to be doubled up and work on both Windows and Unix. There is no harm in having double forward slashes. They do nothing to the path and just take up space (// is equivalent to /./). It looks like someone just did a relpace of all backslashes into forward slashes. You can remove them. In Java, there is a field called File.separator (a String) and File.separatorChar (a char), that provide you with the correct separator (/ or \), depending on your platform. It may be better to use that in some cases: String WinDir = "C:" + File.separator + "trash" + File.separator + "blah" + File.separator + "blah";
With java.nio.path, you even better get an independent OS path without any concern about path delimiter.
public class PathsGetMethod {
public static void main(String[] args) {
Path path = Paths.get("C:\\Users\\conta\\OneDrive\\", "desktop", "data");
System.out.println(path);
//C:\Users\conta\OneDrive\desktop\data
}
}

When should I use File.separator and when File.pathSeparator?

In the File class there are two strings, separator and pathSeparator.
What's the difference? When should I use one over the other?
If you mean File.separator and File.pathSeparator then:
File.pathSeparator is used to separate individual file paths in a list of file paths. Consider on windows, the PATH environment variable. You use a ; to separate the file paths so on Windows File.pathSeparator would be ;.
File.separator is either / or \ that is used to split up the path to a specific file. For example on Windows it is \ or C:\Documents\Test
java.io.File class contains four static separator variables. For better understanding, Let's understand with the help of some code
separator: Platform dependent default name-separator character as String. For windows, it’s ‘\’ and for unix it’s ‘/’
separatorChar: Same as separator but it’s char
pathSeparator: Platform dependent variable for path-separator. For
example PATH or CLASSPATH variable list of paths separated by ‘:’ in
Unix systems and ‘;’ in Windows system
pathSeparatorChar: Same as pathSeparator but it’s char
Note that all of these are final variables and system dependent.
Here is the java program to print these separator variables.
FileSeparator.java
import java.io.File;
public class FileSeparator {
public static void main(String[] args) {
System.out.println("File.separator = "+File.separator);
System.out.println("File.separatorChar = "+File.separatorChar);
System.out.println("File.pathSeparator = "+File.pathSeparator);
System.out.println("File.pathSeparatorChar = "+File.pathSeparatorChar);
}
}
Output of above program on Unix system:
File.separator = /
File.separatorChar = /
File.pathSeparator = :
File.pathSeparatorChar = :
Output of the program on Windows system:
File.separator = \
File.separatorChar = \
File.pathSeparator = ;
File.pathSeparatorChar = ;
To make our program platform independent, we should always use these separators to create file path or read any system variables like PATH, CLASSPATH.
Here is the code snippet showing how to use separators correctly.
//no platform independence, good for Unix systems
File fileUnsafe = new File("tmp/abc.txt");
//platform independent and safe to use across Unix and Windows
File fileSafe = new File("tmp"+File.separator+"abc.txt");
You use separator when you are building a file path. So in unix the separator is /. So if you wanted to build the unix path /var/temp you would do it like this:
String path = File.separator + "var"+ File.separator + "temp"
You use the pathSeparator when you are dealing with a list of files like in a classpath. For example, if your app took a list of jars as argument the standard way to format that list on unix is: /path/to/jar1.jar:/path/to/jar2.jar:/path/to/jar3.jar
So given a list of files you would do something like this:
String listOfFiles = ...
String[] filePaths = listOfFiles.split(File.pathSeparator);

absolute path parameter java

I am trying to get the absolute path of working directory, and pass it to a method.
I am getting the path in the form
C:\eclipse\workspace\file.txt
but eclipse must receive it in the form:
C:\\eclipse\\workspace\\file.txt
So I am doing a replace, but it works only for one char, how to modify it?
String path = new File("").getAbsolutePath();
path = path.replace( '\\', '\\\\' );
something = method.read(path+"\\file.txt");
Change this:
path = path.replace( '\\', '\\\\' );
To this:
path = path.replaceAll( "\\", "\\\\" );
try using the replaceAll method.
Just use double quotes to represent more than one char. It's then called a String.
path = path.replace("\\", "\\\\");
Note that this requires a minimum of Java 1.5 to work.
See also:
The Java Tutorials - Learning the language - Strings
You should use:
public String replaceAll(String regex,
String replacement)
Replaces each substring of this string
that matches the given regular
expression with the given replacement.
If you just want the current working directory, the simplest approach is this:
String currentdir = System.getProperty("user.dir");
you can use path = path.replaceAll( '\\', '/' ); it works
Not sure if this will help.. I ran into the same issue with the application I am building.
In my app, I basically use JFileChooser to graphically select the file I want. Long story short, the absolute path of the selected file comes back as "C:\Documents and Settings....\xCBL.xml"
The path was then passed to another class for manipulation, however it failed because of the single '\'. The fix -
String absPath = file.getAbsolutePath();
System.out.println("File Path:"+absPath);
String filePath = absPath.replaceAll("\\\\", "\\\\\\\\");
System.out.println("New File Path:"+filePath);
Output:
File Path:C:\Documents and Settings\tanzim.hasan\workspace\XML to Java\xcbl.XML
New File Path:C:\\Documents and Settings\\tanzim.hasan\\workspace\\XML to Java\\xcbl.XML
Hope the above helps.

Categories

Resources