jess и обратная косая черта при сохранении фактов

До сих пор я жестко задавал пути к файлам, чтобы сохранять факты или загружать их в память, но я вносил изменения в код, когда запрашивал файл с помощью showSaveDialog() и получал путь, а также имя с помощью getAbsolutePath(). Фрагмент кода выглядит следующим образом:

int retVal = fs.showSaveDialog(this);
          if (retVal == fs.APPROVE_OPTION){
        fn = fs.getSelectedFile().getAbsolutePath();
           . 
           .
           .

Теперь переменная, которая получает строку, называется fichero и используется в предложении jess следующим образом:

motor.eval("(save-facts "+fichero+")");

мотор является экземпляром двигателя рете. Проблема в том, что jess использует строку, но с простой обратной косой чертой '\', и она не сохраняется правильно, потому что она получает всю строку как имя файла. Я использовал консоль Jess и заметил, что та же строка, но с двойной обратной косой чертой на ней «\», правильно сохраняет ее по указанному пути. как я могу заменить одинарную косую черту на двойную в String fichero? Я попытался использовать метод fichero.replaceAll(), используя две строки в качестве аргументов, одну с одинарной косой чертой, а другую с двойной косой чертой, но кажется, что java этого не понимает. Описанные аргументы объявлены как String var1 = "\" и String var2 = "\\". Используя println, я заметил, что каждый из них имеет одинарную и двойную обратную косую черту соответственно, но, похоже, не работает при применении к методу replaceAll(). Кто-нибудь может помочь? Заранее спасибо!


person creator4983    schedule 19.06.2014    source источник


Ответы (2)


Первая строка в replaceAll — это шаблон. В шаблоне одиночный «\» должен быть экранирован другой обратной косой чертой. В строке замены '\' также имеет особое значение.

s = s.replaceAll( "\\\\", "\\\\\\\\" );

Странно, но тем не менее...

person laune    schedule 19.06.2014
comment
Спасибо за помощь в методе replaceAll. Это действительно странно, как он должен быть экранирован двойной обратной косой чертой, чтобы его распознали. Попробую и отпишусь о результатах позже. - person creator4983; 20.06.2014

Если для функции Jess существует пригодный для использования Java API, вам следует использовать его, а не создавать командную строку и интерпретировать ее; это будет проще, легче и эффективнее. Для случая сохранения фактов такой API действительно существует: класс jess.Rete имеет три перегрузки класса ppFacts(), которые красиво печатают нужные факты непосредственно в предоставленный вами Writer. См. здесь для Javadocs.

person Ernest Friedman-Hill    schedule 20.06.2014
comment
Спасибо за совет. Изучу перегрузки ppFacts() и посмотрю, смогу ли я найти решение. - person creator4983; 20.06.2014