Вывод результата «dir» на консоль в Java - PullRequest
0 голосов
/ 26 апреля 2011

Я хочу вывести результат команды "dir" на консоль java. Я уже посмотрел на Google и здесь, но ни один из примеров не работает для меня, таким образом, заставляя меня прочитать этот пост.

Мой код выглядит следующим образом:

try
    {
        System.out.println("Thread started..");
        String line = "";
        String cmd = "dir";

        Process child = Runtime.getRuntime().exec(cmd);

        //Read output
        BufferedReader dis = new BufferedReader( new InputStreamReader(child.getInputStream() ));

        while ((line = dis.readLine()) != null)
        {
            System.out.println("Line: " + line);
        }

        dis.close();

    }catch (IOException e){

    }

Что я делаю не так?

Любая помощь была бы очень хороша.

Заранее спасибо,

Дэррил

Ответы [ 5 ]

3 голосов
/ 26 апреля 2011
  1. Вы не можете запустить "dir" как процесс, вам нужно изменить его на String cmd = "cmd dir";.
  2. Вы не обрабатываете исключение вообще.добавление строки e.printStackTrace()); в блоке catch скажет вам, что я написал в (1). Никогда не игнорируйте исключения!
  3. Вы не обрабатываете поток ошибок.Это может привести к зависанию вашей программы, обработке потока ошибок и параллельному чтению из обоих потоков (ошибки и ввода) с использованием разных потоков.
1 голос
/ 03 июня 2012

Лучший способ - использовать commons exec http://commons.apache.org/exec/

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

Вот метод, который успешно выполнит команду del в windows. Обратите внимание на использование cmd, поскольку del не является отдельным исполняемым файлом:

private void deleteWithCmd(File toDelete) throws IOException {
    CommandLine cmdLine = new CommandLine("cmd.exe");
    cmdLine.addArgument("/C");
    cmdLine.addArgument("del");
    cmdLine.addArgument(toDelete.getAbsolutePath());
    DefaultExecutor executor = new DefaultExecutor();
    int exitValue = executor.execute(cmdLine);
}
0 голосов
/ 13 декабря 2013

Вы также можете сделать что-то подобное в Java 6:

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

public class ListFilesFromRegExp {

    public static void main(String[] args) throws IOException {
        File dir = new File("files/");
        File[] files = dir.listFiles(new FilenameFilter() {
            public boolean accept(File dir, String name) {
                return name.matches("File[0-9].c");
            }
        });
        for (int i = 0; i < files.length; i++) {
            System.out.println(files[i].getAbsolutePath());
        }
    }
}
0 голосов
/ 26 апреля 2011

Вот более подробный пример, который учитывает версии ОС и условия ошибок (как указано в MByD выше)

http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4

Помните, что использование "exec" означает, что ваше приложение больше не является кроссплатформенным и теряет одно из основных преимуществ Java.

Лучше всего использовать пакет java.io.

http://download.oracle.com/javase/tutorial/essential/io/dirs.html

0 голосов
/ 26 апреля 2011
  • а) Что такое консоль Java?
  • b) Вы должны использовать javas File.listFiles () вместо Runtime.exec, который не является переносимым и делает разделение имен необязательным - трудная вещь, для имен файлов, которые содержат пробелы, пробелы, новые строки и т. Д.
  • в) Что не так с вашим кодом?
  • d) Почему бы вам ничего не сделать в случае исключения?
...