How to append "test" to a filename (after path and before extension)?

J

Jochen Brenzlinger

Let's start with a filename which is stored in a String variable e.g.

String fn = "D:\project\java\testproj\log2011.log"

I want to append "test" to the file basename but keep path and extension.
The resulting filename for the example above should be:

string fn2 = "D:\project\java\testproj\log2011test.log"

How can I do this programmatically from Java?

Jochen
 
R

Robert Klemme

Let's start with a filename which is stored in a String variable e.g.

String fn = "D:\project\java\testproj\log2011.log"

I want to append "test" to the file basename but keep path and extension.
The resulting filename for the example above should be:

string fn2 = "D:\project\java\testproj\log2011test.log"

How can I do this programmatically from Java?

Typically I use regular expressions for this, here's just one way:

import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public final class NameMungle {

public static void main(String[] args) {
final String[] testData = { "a/b", "a/b/c.d", "a/b/c.d.e" };
final String append = "test";
final Pattern pat = Pattern.compile("([^.]*)(\\..*)");

for (final String s : testData) {
final File f = new File(s);
final String basename = f.getName();
final Matcher m = pat.matcher(basename);

final File o = new File(f.getParentFile(),
m.matches()
? m.group(1) + append + m.group(2)
: basename + append);

System.out.println(f + " -> " + o);
}
}
}

Kind regards

robert
 
E

Eric Sosman

Let's start with a filename which is stored in a String variable e.g.

String fn = "D:\project\java\testproj\log2011.log"

Aside: Those backslash characters need some attention ...
I want to append "test" to the file basename but keep path and extension.
The resulting filename for the example above should be:

string fn2 = "D:\project\java\testproj\log2011test.log"

How can I do this programmatically from Java?

A bare-bones approach:

int dot = fn.lastIndexOf('.');
String fn2 = fn.substring(0, dot) + "test" + fn.substring(dot);

In actual use you'd want some sanity checking to be sure the '.'
is in fact present and is after the last '\', so you wouldn't
get fooled by

D:\project\java\testproj\config
or
D:\project\java\testproj.old\data

You could guard against such things by using fn.lastIndexOf('\\')
to locate the rightmost back-slash and checking that the '.' does
in fact appear even further right. However, I think you're better
off using the File class to chop up and reassemble file names in a
(mostly) platform-independent way, e.g.

File base = new File(fn);
String name = base.getName(); // handles / or \ or whatever
int dot = name.lastIndexOf('.');
String newname = (dot < 0) ? name + "test"
: name.substring(0, dot) + "test" + name.substring(dot);
File test = new File(base.getParentFile(), newname);
String fn2 = test.getPath(); // if needed

This may seem like a lot of running around for little effect, but
it protects you from some unpleasant surprises in the long run.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,022
Latest member
MaybelleMa

Latest Threads

Top