I am trying to get name of a File
object without its extension, e.g. getting "vegetation" when the filename is "vegetation.txt." I have tried implementing this code:
openFile = fileChooser.getSelectedFile();
String[] tokens = openFile.getName().split(".");
String name = tokens[0];
Unfortunately, it returns a null
object. There is a problem just in the defining the String
object, I guess, because the method getName()
works correctly; it gives me the name of the file with its extension.
Do you have any idea?
I prefer to chop off before the last index of "." to be the filename. This way a file name: hello.test.txt is just hello.test
i.e.
You need to handle there being no extension too.
String#split takes a regex. "." matches any character, so you're getting an array of empty strings - one for each spot in between each pair of characters.
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)
There are two problems with your code...
1) Just using "." as an argument to split is being interpreted as a Rejex that you don't want. You want a literal dot. So you have to escape it...
2) You will incorrectly parse any file with more than one dot. The best way to do this is to search for the last dot and get the substring...
If you don't want to write this code yourself you could use Apache's FilenameUtils.
This will return the filename minus the path and extension.
If you want to implement this yourself, try this:
(This variation doesn't leave you with an empty string for an input filename like ".txt". If you want the string to be empty in that case, change
> 0
to>= 0
.)You could replace the
if
statement with an assignment using a conditional expression, if you thought it made your code more readable; see @Steven's answer for example. (I don't think it does ... but it is a matter of opinion.)It is arguably a better idea to use an implementation that someone else has written and tested. Apache
FilenameUtils
is a good choice; see @slachnick's Answer, and also the linked Q&A.You can try
split("\\.");
. That is, basically escaping the.
as it's treated as all characters in regex.