доступ к файлам, созданным в процессе выполнения Java - PullRequest
0 голосов
/ 15 сентября 2010

Я запускаю программу Windows изнутри Java:

            String command = "cmd /C start "+fileName+".bat";
    Runtime rt = Runtime.getRuntime();
    Process pr = rt.exec(command, null, new File(currWD));
    int exitValue = pr.waitFor();

Программа успешно завершается (exitValue == 0) и создает файл «fileName» в рабочем каталоге. Я пытаюсь в том же порядке найти размер этого файла:

    xmlFileSize = (new File(fileName)).length(); 

Java находит файл, но он кажется пустым (xmlFileSize == 0). Однако после завершения работы Java я вижу, что файл не пустой.

Как я могу решить это? Все, что я хочу, это то, что Java может правильно оценить размер файла, созданного программой Windows, которую выполнила Java.

Ответы [ 3 ]

1 голос
/ 15 сентября 2010

Вероятно, это связано с выполнением файла bat из командной оболочки. Что делает файл bat? Это запуск программы?

Я предполагаю, что скрипт вызывает или выполняет другую программу и возвращает, что позволяет оболочке умереть. Это, в свою очередь, позволяет процессу java продолжаться, пока процесс из сценария продолжает выполняться асинхронно. В соответствии с Java API для Process это допустимо, и это определенно должно быть ( ссылка java.lang.Process )

1 голос
/ 15 сентября 2010

Файл нулевой длины указывает, что файл может не существовать.Из документов:

Длина в байтах файла, обозначенного этим абстрактным путем, или 0L, если файл не существует.

Обратите внимание, что вы используетеcurrWD в качестве рабочего каталога для вашего bat-файла.Вы можете попытаться сделать:

new File(currWD, fileName).length()

, чтобы убедиться, что вы ищете файл в правильном каталоге.

0 голосов
/ 15 сентября 2010

Я верю этому ответу aioobe и Джону. Как предполагает Джон, внешняя программа, запускаемая пакетным файлом, порождает процесс, который, кажется, выполняется некоторое время (50-300 миллисекунд) после того, как подпроцесс Java, выполняющий пакетный файл, вернулся. Я решил проблему, введя паузу (как предложено aioobe):

int exitValue = pr.waitFor ();

try {Thread.currentThread (). Sleep (300);} catch (InterruptedException e) {e.printStackTrace ();}

После паузы Java, похоже, может видеть файлы, созданные внешней программой. Еще раз спасибо обоим авторам, которые помогли мне решить эту проблему!

Если кто-нибудь найдет более элегантное решение, пожалуйста, не стесняйтесь писать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...