Исходная проблема: программа считывала входные данные старого файла конфигурации (.ini).
Новая проблема: после попытки одноэлементного шаблона с потоком / ini я больше не могу писать в файл. Это бросает исключение java.io.FileNotFoundException.
Могу ли я изменить свой класс конфигурации, чтобы он работал?
Заранее спасибо.
Класс конфигурации:
import org.ini4j.Wini;
import java.io.*;
//http://www.javenue.info/post/40
public class Configuration {
private static Configuration _instance = null;
private Wini ini = null;
FileInputStream stream;
private Configuration() {
ini= new Wini();
try {
stream = new FileInputStream(Constants.PATH);
ini.load(stream);
}
catch (Exception e) {
System.out.println("FILE NOT FOUND!");
}
}
public synchronized static Configuration getInstance() {
if (_instance == null)
_instance = new Configuration();
return _instance;
}
public String getConfig(String xSectionName, String xFieldValue){
String readValue = null;
if (ini.get(xSectionName, xFieldValue) != null) {
readValue = ini.get(xSectionName, xFieldValue);
} else {
// TODO: What should happen
}
return readValue;
}
public void setConfig(String xSectionName, String xFieldValue, String xValue){
System.out.println("Section: " + xSectionName);
System.out.println("Field: " + xFieldValue);
System.out.println("Value: " + xValue + "\n\n");
try {
ini.put(xSectionName, xFieldValue, xValue);
ini.store();
} catch (Exception e1) {
System.out.println(xValue + " could not be stored.");
e1.printStackTrace();
}
}
}
Раздел: дрифт
Поле: mu
Значение: 5
5 не удалось сохранить.
Решение новой проблемы: см. Ответ ниже.
Разрешение на исходный выпуск:
Я динамически загружал класс с библиотекой Java-Runtime-Compiler. После некоторого исследования я прочитал, что ClassLoader может иметь только один экземпляр определенного класса. Итак, решение состоит в том, чтобы создать новый экземпляр ClassLoader в методе .loadFromJava (), и проблема с бумом решена.
Вот немного кода.
Динамический класс реализует Callable и возвращает объект, поэтому можно получить все, что он там создал.
import net.openhft.compiler.CompilerUtils;
...
ClassLoader classloader = new ClassLoader() {
};
Class aClass = CompilerUtils.CACHED_COMPILER.loadFromJava(classloader, className, javaCode);
Callable<Object[]> caller = (Callable<Object[]>) aClass.newInstance();
Object[] obj = (Object[]) caller.call();
...
Я только что просмотрел исходный код.
Проблема в том, что
import org.ini4j.Wini;
import java.io.*;
//http://www.javenue.info/post/40
public class Configuration {
private static Configuration _instance = null;
private Wini ini = null;
FileInputStream stream;
private Configuration() {
ini= new Wini();
try {
stream = new FileInputStream(Constants.PATH);
ini.load(stream);
}
catch (Exception e) {
System.out.println("FILE NOT FOUND!");
}
}
public synchronized static Configuration getInstance() {
if (_instance == null)
_instance = new Configuration();
return _instance;
}
public String getConfig(String xSectionName, String xFieldValue){
String readValue = null;
if (ini.get(xSectionName, xFieldValue) != null) {
readValue = ini.get(xSectionName, xFieldValue);
} else {
// TODO: What should happen
}
return readValue;
}
public void setConfig(String xSectionName, String xFieldValue, String xValue){
System.out.println("Section: " + xSectionName);
System.out.println("Field: " + xFieldValue);
System.out.println("Value: " + xValue + "\n\n");
try {
ini.put(xSectionName, xFieldValue, xValue);
ini.store();
} catch (Exception e1) {
System.out.println(xValue + " could not be stored.");
e1.printStackTrace();
}
}
}
в классе import net.openhft.compiler.CompilerUtils;
...
ClassLoader classloader = new ClassLoader() {
};
Class aClass = CompilerUtils.CACHED_COMPILER.loadFromJava(classloader, className, javaCode);
Callable<Object[]> caller = (Callable<Object[]>) aClass.newInstance();
Object[] obj = (Object[]) caller.call();
...
следует избегать загрузки ini-файла, если вы хотите использовать тот же экземпляр _3_ для вызова метода _4_. Почему? Поскольку метод _5_ ожидает наличия существующего файлового поля в экземпляре текущего _6_, но не может его найти, поскольку вы загрузили ini из потока, а не из файла.