patternjavaModerate
File editing program
Viewed 0 times
fileprogramediting
Problem
I have written a Java class to replace text in file. The file contains database configurations and is as follows:
Here is my Java class to switch between schemas
and I have created a batch file to run this program from command
test.properties
#local
db.url=jdbc:oracle:thin:@localhost:test
#db.user=testa
#db.password=testa
db.user=testb
db.password=testb
#db.user=testc
#db.password=testc# is a comment character. Now db schema testb is in use.Here is my Java class to switch between schemas
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class SwitchTo
{
public static void main(String[] args)
{
Map schemaMap = new HashMap();
schemaMap.put("a", "testa");
schemaMap.put("b", "testb");
schemaMap.put("c", "testc");
String newText = "";
for (int i = 0; i entry : schemaMap.entrySet())
{
System.out.println(entry.getKey() + " for " + entry.getValue());
}
return;
}
try
{
BufferedReader file = new BufferedReader(new FileReader("test.properties"));
String total = "";
String line = "";
while ((line = file.readLine()) != null)
{
if (!line.startsWith("#") && line.contains("db.user"))
{
line = "#" + line;
}
if (!line.startsWith("#") && line.contains("db.password"))
{
line = "#" + line;
}
if (line.startsWith("#") && line.contains(newdb))
{
line = line.substring(1);
}
total = total + line + "\n";
}
FileOutputStream File = new FileOutputStream("test.properties");
File.write(total.getBytes());
System.out.println("Switched to schema " + schemaMap.get(newText));
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}and I have created a batch file to run this program from command
Solution
Actually, this can be more generic.
Instead of hard-coding your map; fill it from your properties file.
So change your prop file to :
Fill your map like this :
Secondly : In your main you use the args.
You do not check for how many args you have, you just take the last arg.
Maybe a check for how many args you have is appropriate here, and make the program do what you want then. (like quitting with error message or taking default arg).
Third : Always close your resources(reader/writer in this case).
Here it is done with a Try-with-resources available from java 7, otherwise you will need a finally block where you close it in.
Instead of hard-coding your map; fill it from your properties file.
So change your prop file to :
#db.id=a
#db.user=testa
#db.password=testa
db.id=b
db.user=testb
db.password=testbFill your map like this :
private Map schemaMap = new HashMap();
public void fillMap() throws FileNotFoundException, IOException {
String line;
String key = null;
String value = null;
try (BufferedReader file = new BufferedReader(new FileReader("test.properties"))){
while ((line = file.readLine()) != null) {
if (line.contains("db.id")) {
key = line.substring(line.indexOf('='));// could be you have to do an + 1
}
if (line.contains("db.user")) {
value = line.substring(line.indexOf('='));
}
if (key!=null && value != null) {
schemaMap.put(key, value);
key = null;
value = null;
}
}
} catch (IOException ex) {
// report with Logger or System.out what happend.
}
}Secondly : In your main you use the args.
You do not check for how many args you have, you just take the last arg.
Maybe a check for how many args you have is appropriate here, and make the program do what you want then. (like quitting with error message or taking default arg).
Third : Always close your resources(reader/writer in this case).
Here it is done with a Try-with-resources available from java 7, otherwise you will need a finally block where you close it in.
Code Snippets
#db.id=a
#db.user=testa
#db.password=testa
db.id=b
db.user=testb
db.password=testbprivate Map<String, String> schemaMap = new HashMap<String, String>();
public void fillMap() throws FileNotFoundException, IOException {
String line;
String key = null;
String value = null;
try (BufferedReader file = new BufferedReader(new FileReader("test.properties"))){
while ((line = file.readLine()) != null) {
if (line.contains("db.id")) {
key = line.substring(line.indexOf('='));// could be you have to do an + 1
}
if (line.contains("db.user")) {
value = line.substring(line.indexOf('='));
}
if (key!=null && value != null) {
schemaMap.put(key, value);
key = null;
value = null;
}
}
} catch (IOException ex) {
// report with Logger or System.out what happend.
}
}Context
StackExchange Code Review Q#48122, answer score: 12
Revisions (0)
No revisions yet.