2015-11-30 2 views
0

Чтобы быть ясным: этот вопрос касается не того, как разбирать аргументы в программе, как commons CLI/JCommando и т. Д.Напишите java-команды unix с библиотеками

Я хотел бы написать команды Unix с помощью Java. Хотя я не хочу писать большую часть материала сам, я намереваюсь использовать библиотеки и искать вашу помощь для этого.

Я нашел commons cli для аргументов parse, например getopt. Однако я ищу последнюю библиотеку, которая работает как оператор алмаза Перла или файловая библиотека Python.

Как unix-команды (или команды GNU, когда я прихожу из Linux) работает, так это то, что после анализа всех флагов все оставшиеся аргументы считаются файлами. Затем команда перебирает эти файлы по строкам, файл по файлу. Даблс dubble (например, git checkout - myfile.txt) заключается в том, чтобы отделить имена файлов от аргументов. Если после разбора всех аргументов не осталось аргументов, программа вместо этого должна читать из стандарта.

Это то, что оператор алмазов в Perl делает, а также библиотеки FileInput Пайтона, на очень очень несколько строк:

Perl

@ARGV = ("diamond.pl", "stdin.pl"); 
while (<>) { 
    print(); 
} 

Python

import fileinput 
for line in fileinput.input(): 
    process(line) 

Есть ли библиотека в Java что делает то, что они делают так же просто, как они это делают (библиотека, которая в основном имеет тот же API, что и https://docs.python.org/2/library/fileinput.html)? Я не хочу сам писать материал (искать аргументы, если не цитировать через stdin, иначе загружать каждый файл, желательно ленив, кормить каждую строку командой и т. Д.) ... Мне просто нужен бизнес-конец, цикл вроде:

Моя идея

LineIterator li = new MagicTextLineFeeder(remainingAfterCommonsCliParsing); 
for (String line : li.nextRow()) { 
    System.out.println(line); 
} 

EDIT: Сделано ясно, что я не искал другой аргумент разборе библиотеки.

+0

Для линейного чтения посмотрите на BufferedReader.readLine(). Для синтаксического анализа аргументов командной строки сверните свой собственный или выполните поиск «парсер синтаксиса java» – Arkadiy

+0

Существует гораздо больше библиотек, связанных с cli, чем apache. Возможно, что-то в http://stackoverflow.com/questions/1200054/java-library-for-parsing-command-line-parameters? Но почему вы не используете perl или python? Java работает нормально, но это просто не так хорошо, как все остальные. – zapl

+0

Я не знаю, был ли я недостаточно ясен, но этот пост не посвящен анализу аргументов. Как вы говорите, для этого есть множество библиотек. Речь идет о шаге после этого, перемещая имена файлов влево и подавая программе содержимое файлов. Я хотел бы найти библиотеку с той же функциональностью, что и Python fileinput. Прочтите https://docs.python.org/2/library/fileinput.html Arkadiy: Вопрос в том, есть ли библиотека вместо того, чтобы кататься самостоятельно. Я знаю, что могу использовать BufferedReader. zapl: Конечно, я могу использовать Python или Perl, но я спрашиваю, есть ли библиотека для Java и НЕ писать мои собственные. – Aquaplanet

ответ

1

Ах - радости Java 8:

http://howtodoinjava.com/2014/05/04/read-file-line-by-line-in-java-8-streams-of-lines-example/

private static void readStreamOfLinesUsingFiles() throws IOException 
{ 
    Stream<String> lines = Files.lines(Paths.get("c:/temp", "data.txt")); 
    Optional<String> hasPassword = lines.filter(s -> s.contains("password")).findFirst(); 
    if(hasPassword.isPresent()){ 
     System.out.println(hasPassword.get()); 
    } 
    //Close the stream and it's underlying file as well 
    lines.close(); 
} 

Объедините это с Stream.of() (проходя массив, где требуется многоточие) и flatMap и вы получили то, что вам нужно (см this подробности).

Опасайтесь, что обработка ошибок в потоке может быть довольно нарушена.

+0

Это достаточно хорошо, это, вероятно, всего несколько строк, чтобы получить то, что я хочу. Учитывая комментарий Markus выше, я начинаю понимать, почему у Java нет библиотек, которые делают то, что Python имеет в своей стандартной библиотеке. – Aquaplanet

Смежные вопросы