what is the most efficient way to get one directory tree level up ?
i am looking for most efficient use of string class method to
getting e:\files\report\fruits from e:\files\report\fruits\apples
I think you are better off just using
File f = new File("e:\\files\\report\\fruits\\apples");
String parent = f.getParent();
If you insist on using String only and assuming '\' is the path separator, you can do something like this:
String s = "e:\\files\\report\\fruits\\apples";
String parent = s.substring(0, s.lastIndexOf('\\'));
But you have to beware of edge cases like there being no character '\' found.
I wouldn't do this by "string bashing" because it will embed all sorts of platform dependencies on pathname syntax into your code. Instead, use the java.io.File class.
String parent = new File("e:\files\report\fruits\apples").getParent();
or better still:
File parent = new File("e:\files\report\fruits\apples").getParentFile();
Stephen makes a valid point about platform dependency, but here's what you asked for:
String dir = "e:\\files\\report\\fruits\\apples";
String parent = dir.replaceAll("\\\\[^\\\\]+$", "");
Related
I read the directory path using system properties in java which will work both in windows and Linux based systems. Now I need to split this path with only a portion of the path to retrieve the rest. eg., C:\Test1\Test2\Test3\Test4
I need to split the above path with C:\Test1\Test2 and retrieve Test3\Test4.
When I get this as string and use split function that will give me error as illegal character because of "\" character. If I plan to escape this character with "\\", this may not work in Linux box. Is there a way I can make this work both in Linux and Windows?
Use the below approach.
//Windows
String s = "C:\\Test1\\Test2\\Test3\\Test4";
String[] output = s.split(("/".equals(File.separator))? File.separator : "\\\\" );
//output: [C:, Test1, Test2, Test3, Test4]
//Linux:
String linuxString = "/Test1/Test2/Test3/Test4";
String[] linuxOutput = linuxString.split(("/".equals(File.separator))? File.separator : "\\\\" );
//output: [, Test1, Test2, Test3, Test4]
Hope this will solve the issue.
You are looking for File.separator. Use it to split your string.
From the docs,
The system-dependent default name-separator character, represented as a string for convenience.
The pattern passed to String.split has the regular expression syntax, thus the java.util.regex package is the place to look for additional tools for dealing with them, like quoting a string to enforce literal matching.
So a solution only using system properties and string operations would look like
String path=System.getProperty("your.property"), sep=System.getProperty("file.separator");
for(String s: path.split(Pattern.quote(sep)))
System.out.println(s);
However, there is no reason not to use the dedicated APIs:
Path path = Paths.get(System.getProperty("your.property"));
if(path.isAbsolute()) System.out.println(path.getRoot());
for(Path p: path)
System.out.println(p);
Note that this also handles root paths correctly, i.e. on Windows, the root of a drive is like C:\, not C:, and on Linux, the root is /, not an empty string, and both cases are not handled correctly when just splitting at the separator chars.
Even before Java 7, there was an API that could handle this:
File path = new File(System.getProperty("your.property"));
for(File f = path; f != null; f = f.getParentFile())
System.out.println(f.getName().isEmpty()? f.getPath(): f.getName());
though the code will iterate the elements in the opposite order.
Note, how simple your specific task of splitting at two levels above the path becomes with the dedicated API:
Path path = Paths.get(System.getProperty("your.property"));
Path first = path.getParent().getParent(), second = first.relativize(path);
System.out.println("first: "+first);
System.out.println("second: "+second);
You can use separator when you are building a file path.
Use java.io.File.separator
I would like to extract a substring starting from particular substring.
I'm getting an array of URIs of multiple images from Photo Library via this solution. But the URIs are something like this
content://com.android.providers.media.documents/document/image%3A38
I would like to remove content:// and get only
com.android.providers.media.documents/document/image%3A38
I've searched through the Internet but found no best solution. Perhaps to avoid regex because it's kinda heavy.
At the moment I choose not to get the substring by checking after second '/' because it feels kinda "hardcoded".
Not sure if I've missed a good solution but please help.
If you need to get whatever string comes after a certain substring, in this case "content://", you could use the split method.
String string = "content://com.android.providers.media.documents/document/image%3A38";
String uri = string.split("content://")[1];
Or you could use the substring and indexOf methods like in the other answer, but add on the length of the substring.
String string = "content://com.android.providers.media.documents/document/image%3A38";
String sub = "content://";
String uri = string.substring(string.indexOf(sub) + sub.length());
You can just use the substring method in order to create new strings without content://, something like this :
String string = "content://com.android.providers.media.documents/document/image%3A38"
String secondString = string.substring(string.indexOf("com.android"));
i have a path
C:\Users\abc xyz\Desktop\test.docx
I want to change in into
C:\Users\sara waheed\Desktop\~$sara.docx
for that first i got the last index of backslash now i want t append '~$' after the last backslash
String str=path.toString();
int index = str.lastIndexOf('\\');
Note
I do not know the value of the path in advance
how can i achieve that
In general, you should use java.nio.file API when manipulating paths, so that it can avoid platform dependent assumptions.
String str = path.getFileName().toString();
// The string concatenation way:
if(str.endsWith(".docx")) { // should we check the beginning of fname?
// maybe it already has the prefix?
path = path.resolveSibling("~$" + str);
}
System.out.println(path);
Since you're representing files, I suggest using the Path api. You can modify any part of the path without messing with the rest.
Path file = Paths.get("C:\\Users\\abc xyz\\Desktop\\test.docx");
Path lock = file.resolveSibling("~$" + file.getFileName());
To interact with these paths, go ahead and look at the Files class.
Files.touch(lock);
Or alternatively using the classic way via path.toFile()
By the way, these are all in the java.nio.file package.
I want to read a file say c.txt in java in windows. So can anybody suggest me that how can I format a system path to a file say D:\a\b\c.txt to D:/a/b/c.txt in java? I know it will work like this D:\\a\\b\\c.txt but I want to use this D:/a/b/c.txt. Thanks!
I'm not sure of your problem but rarely is it good practice to hard code / or \. Use Java's File.separator to help you.
You could use the char replace: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#replace%28char,%20char%29
Example:
String pathToFile = "D:\\a\\b\\c.txt";
pathToFile = pathToFile.replace('\\','/'); <-- with ' and not "
Documentation of replace(char, char):
Returns a new string resulting from replacing all occurrences of
oldChar in this string with newChar.
You can use File API
File f = new File("c.txt");
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
or just simply substring
String fname = "D:\\a\\b\\c.txt".replace('\\', '/');
System.out.println(fname);
String file="D:\\a\\b\\c.txt";
file=file.replace('\\','/');
System.out.println(file);
output D:/a/b/c.txt
But if you are trying to make it more platform dependent you should use File.separator (for replacement based on Strings) or File.separatorChar (for replacement based on chars).
I have a complete file path and I want to get the file name.
I am using the following instruction:
String[] splittedFileName = fileName.split(System.getProperty("file.separator"));
String simpleFileName = splittedFileName[splittedFileName.length-1];
But on Windows it gives:
java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
^
Can I avoid this exception? Is there a better way to do this?
The problem is that \ has to be escaped in order to use it as backslash within a regular expression. You should either use a splitting API which doesn't use regular expressions, or use Pattern.quote first:
// Alternative: use Pattern.quote(File.separator)
String pattern = Pattern.quote(System.getProperty("file.separator"));
String[] splittedFileName = fileName.split(pattern);
Or even better, use the File API for this:
File file = new File(fileName);
String simpleFileName = file.getName();
When you write a file name, you should use System.getProperty("file.separator").
When you read a file name, you could possibly have either the forward slash or the backward slash as a file separator.
You might want to try the following:
fileName = fileName.replace("\\", "/");
String[] splittedFileName = fileName.split("/"));
String simpleFileName = splittedFileName[splittedFileName.length-1];
First of all, for this specific problem I'd recommend using the java.util.File class instead of a regex.
That being said, the root of the problem you're running into is that the backslash character '\' signifies an escape sequence in Java regular expressions. What's happening is the regex parser is seeing the backslash and expecting there to be another character after it which would complete the escape sequence. The easiest way to get around this is to use the java.util.regex.Pattern.quote() method which will escape any special characters in the string you give it.
With this change your code becomes:
String splitRegex = Pattern.quote(System.getProperty("file.separator"));
String[] splittedFileName = fileName.split(splitRegex);
String simpleFileName = splittedFileName[splittedFileName.length-1];
Another simpler way could be to do
File f = new File(path);
String fileName = f.getName();
I believe this will work provided the paths are compatible with the platform, i.e. not sure if path "c:\file.txt" will work on Linux or not.