2013-03-18 16 views
5

Mam program, który odczyta wszystko z pliku config.properties, jeśli wiersz polecenia nie zawiera żadnych argumentów oprócz lokalizacji pliku config.properties. Poniżej jest moje config.properties Plik-Zastępuje plik właściwości, jeśli obecna jest wartość linii poleceń.

NUMBER_OF_THREADS: 100 
NUMBER_OF_TASKS: 10000 
ID_START_RANGE: 1 
TABLES: TABLE1,TABLE2 

Jeśli używam mojego programu z wiersza poleceń jak to-

java -jar Test.jar "C:\\test\\config.properties"

Należy przeczytać wszystkie cztery właściwości z pliku config.properties. Ale załóżmy, że jeśli używam mojego programu jak to-

java -jar Test.jar "C:\\test\\config.properties" 10 100 2 TABLE1 TABLE2 TABLE3

to powinien przeczytać wszystkie właściwości z argumentów i nadpisać właściwości w pliku config.properties.

Poniżej jest mój kod, który działa dobrze w tym scenariusz-Statement

public static void main(String[] args) { 

     try { 

      readPropertyFiles(args); 

     } catch (Exception e) { 
      LOG.error("Threw a Exception in" + CNAME + e); 
     } 
    } 

    private static void readPropertyFiles(String[] args) throws FileNotFoundException, IOException { 

     location = args[0]; 

     prop.load(new FileInputStream(location)); 

     if(args.length >= 1) { 
      noOfThreads = Integer.parseInt(args[1]); 
      noOfTasks = Integer.parseInt(args[2]); 
      startRange = Integer.parseInt(args[3]); 

      tableName = new String[args.length - 4]; 
      for (int i = 0; i < tableName.length; i++) { 
       tableName[i] = args[i + 4]; 
       tableNames.add(tableName[i]); 
      } 
     } else { 
      noOfThreads = Integer.parseInt(prop.getProperty("NUMBER_OF_THREADS").trim()); 
      noOfTasks = Integer.parseInt(prop.getProperty("NUMBER_OF_TASKS").trim()); 
      startRange = Integer.parseInt(prop.getProperty("ID_START_RANGE").trim()); 
      tableNames = Arrays.asList(prop.getProperty("TABLES").trim().split(",")); 
     } 

     for (String arg : tableNames) { 

      //Some Other Code 

     } 
    } 

problem: -

Teraz to, co usiłuję zrobić jest-Załóżmy, że jeśli każda osoba jest uruchomiony program jak to

java -jar Test.jar "C:\\test\\config.properties" 10

następnie w moim programie, należy nadpisać noOfThreads Wydawany

noOfThreads should be 10 instead of 100 

I załóżmy, że jeśli osoba jest uruchomiony program jak to-

java -jar Test.jar "C:\\test\\config.properties" 10 100

potem w moim programie, należy nadpisać noOfThreads i noOfTasks Wydawany

noOfThreads should be 10 instead of 100 
noOfTasks should be 100 instead of 10000 

I możliwe inne przypadki użycia.

Czy ktoś może zaproponować mi, jak osiągnąć ten scenariusz? Dzięki za pomoc

Odpowiedz

2

Zamiast tego utwórz pętlę.

List<String> paramNames = new ArrayList<String>{"NUMBER_OF_THREADS", "NUMBER_OF_TASKS", 
      "ID_START_RANGE", "TABLES"}; // Try to reuse the names from the property file 
Map<String, String> paramMap = new HashMap<String, String>(); 
... 
// Validate the length of args here 
... 
// As you table names can be passed separately. You need to handle that somehow. 
// This implementation would work when number of args will be equal to number of param names 
for(int i = 0; i< args.length; i++) { 
    paramMap.put(paramNames[i], args[i]); 
} 

props.putAll(paramMap); 
... // Here props should have it's values overridden with the ones provided 
+0

ASK Adeel. Dziękuję Adeel za pomoc. Nie używam JDK1.7, więc nie mogę używać tych nawiasów klamrowych. :(A także możesz mi podać pełny przepływ, w którym mam to zrobić, aby to zadziałało. Dzięki za pomoc – ferhan

+0

TechGeeky: Wymieniłem operatorów diamentów, dzięki czemu możesz ich używać z Javą 6. –

0
Properties properties = new Properties(); 
properties.load(new FileInputStream("C:\\test\\config.properties")); 

Następnie jak na swoje argumentów wiersza poleceń ustawić poszczególne właściwości jak:

setProperty("NUMBER_OF_THREADS", args[1]); 
setProperty("NUMBER_OF_TASKS", args[2]); 

nie będzie zastąpić istniejący plik config.properties.

7

Przy określaniu linii poleceń w następujący sposób

java -jar Test.jar "C:\\test\\config.properties" 10 100

Oznacza to zawsze musi dostarczyć noOfThreads przesłonić noOfTasks.

Aby rozwiązać ten problem, można określić te właściwości systemu w wierszu poleceń, a także lokalizację plików, które inne mają domyślną lokalizację. Na przykład: -

java -jar -Dconfig.file.location="C:\\test\\config.properties" -DNUMBER_OF_THREADS=10 Test.jar

wtedy.

  1. Przeczytaj właściwości pliku na Properties.
  2. Powtórz klawisze we właściwościach i znajdź odpowiadające im System.getProperty().
  3. Jeśli zostanie znaleziona wartość, należy zastąpić odpowiedni wpis we właściwościach.

W ten sposób bez względu na to, ile nowych właściwości wprowadzisz swój kod, zawsze pozostanie on taki sam.

Można pójść krok dalej i upakować wszystko w PropertyUtil że również dostarczenie sposobów Narzędzie jak getIntProperty(), getStringProperty() itp

import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.Properties; 

public class PropertyUtil { 

    private static final String DEFAULT_CONFIG_FILE_LOCATION = "config.properties"; 

    private String configFileLocation; 

    private Properties properties; 

    public PropertyUtil() throws IOException { 

    this(DEFAULT_CONFIG_FILE_LOCATION); 
    } 

    public PropertyUtil(String configFileLocation) throws IOException { 

    this.configFileLocation = configFileLocation; 
    this.properties = new Properties(); 
    init(); 
    } 

    private void init() throws IOException { 

    properties.load(new FileInputStream(this.configFileLocation)); 

    for (Object key : this.properties.keySet()) { 

     String override = System.getProperty((String) key); 

     if (override != null) { 

     properties.put(key, override); 
     } 
    } 
    } 

    public int getIntProperty(String key) { 

    return this.properties.contains(key) ? Integer.parseInt(properties.get(key)) : null; 
    } 

    public String getStringProperty(String key) { 

    return (String) this.properties.get(key); 
    } 
} 

przykładów.

config.properties

NUMBER_OF_THREADS=100 
NUMBER_OF_TASKS=10000 
ID_START_RANGE=1 
TABLES=TABLE1,TABLE2 

Aby zastąpić NUMBER_OF_THREADS.

java -jar -Dconfig.file.location="C:\\test\\config.properties" -DNUMBER_OF_THREADS=10 Test.jar

Krótki przykład ręka czytać 'number_of_threads' jako int.

new PropertyUtil(System.getProperty("config.file.location")).getIntProperty("NUMBER_OF_THREADS"); 
+0

sgp15 za sugestię Jeśli mógłbyś podać mi przykładowy scenariusz na moim scenariuszu, to byłbym w stanie zrozumieć znacznie lepiej.Dziękuję za pomoc – ferhan

+0

@ TechGeeky.Tam idzie. – sgp15

+0

+1 dla opcji -D sam. twoja getIntProperty() wydaje się zepsuta, więc naprawiłem to, możesz go przywrócić, jeśli uważasz, że to było poprawne. –