Вы можете выполнить команду и захватить вывод err
, который содержит значимое сообщение.
Вот некоторый минимальный исполняемый код (который использует apache commons-exec ), который демонстрирует, какэто может работать:
import org.apache.commons.exec.*;
public static String getErrorMessage(String command) {
CommandLine cmdLine = CommandLine.parse(command);
DefaultExecutor executor = new DefaultExecutor();
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayOutputStream err = new ByteArrayOutputStream();
executor.setStreamHandler(new PumpStreamHandler(out, err));
try {
executor.execute(cmdLine);
} catch (Exception e) {
return err.toString().trim();
}
return null; // no error occurred
}
Вот тест этого кода, показывающий различные условия ошибки при работе с файлом:
public static void main(String[] args) throws Exception {
System.out.println(getErrorMessage("cp fake.file x"));
System.out.println(getErrorMessage("cp /tmp /tmp"));
System.out.println(getErrorMessage("mkdir /Volumes"));
System.out.println(getErrorMessage("mv /tmp /"));
System.out.println(getErrorMessage("mv fake.file /tmp"));
}
Вывод (выполняется на Mac OSX):
cp: fake.file: No such file or directory
cp: /tmp is a directory (not copied).
mkdir: /Volumes: File exists
mv: /tmp and /tmp are identical
mv: rename fake.file to /tmp/fake.file: No such file or directory
Вы можете обернуть вышеуказанный метод в метод, который генерирует IOException, который, получив сообщение, может проанализировать его для ключевых параметров и сопоставить сообщения, используя сопоставление с регулярным выражением или contains
, для конкретных IOException и выдать их, например:
if (message.endsWith("No such file or directory"))
throw new FileNotFoundException(); // Use IOExceptions if you can
if (message.endsWith("are identical"))
throw new IdenticalFileException(); // Create your own Exceptions that extend IOException
Если вы хотите абстрагировать это для использования в разных версиях ОС, вам придется реализовать код для каждой платформы (окна и * nix используют разные команды оболочки / сообщения об ошибках для любой заданной файловой операции / результата).
Если награда присуждается за этот ответ, я опубликую полную аккуратную версию рабочего кода, включая стильный enum
дляфайловые операции.