Java work with terminal

Работа с терминалом линукс из JAVA

Как через java выполнить следующие:
К примеру: java код вызывает терминал и автоматически запускает команду, чисто для примера будет ls. И мне нужно записать в переменную то, что ответит терминал linux, то есть здесь это будет список содержимого каталога. Также, если команда будет долго выполняться, то нужно проверять терминал на прогресс выполнения команды и записывать в переменную результат только по завершению исполнения команды. Абсолютно все, это нужно делать через java.
С запуском команды на терминале проблем нет, а вот с чтением терминала я понятие не имею как делать(

Если на java это невозможно сделать, то на каком языке программирования это реально сделать?

Работа с разделами в линукс
Ребята у меня такой маленький вопросик! Возможно ли в Ubuntu 9.04 работать с разделами, на.

Удаленная работа под Линукс
подскажите пжлста, возможно ли удаленная работа в ОС линукс, причем удаленно работать нужно на.

Работа с терминалом
Привет. Меня тут взяли на работу по компам. А у них там еще и терминал стоит (сенсорный манитор).

работа с терминалом
1. UNIX. Разработать программу, осуществляющую взаимодействие с терминалом через специальный файл.

Эксперт Java

Fushija, что ты подразумеваешь под словом «терминал»?

В любом случае, Process тебе в помощь.

Источник

Jerminal — эмулятор терминала для Java-программ

Привет, хабраюзеры! Решил поведать вам о мини-библиотеке Jerminal. Я сейчас работаю над большим коммерческим проектом на Groovy/Java. Ну и мне пришло задание — написать консольку для приложения. К сожалению, было поставлено условие: никаких сторонних решений, все только свое. Недолго думая, я сел и написал ее. Подробнее — под катом.

Цели

В принципе, чего-то очень серьезного от меня не требовали. Вот, собственно, параметры:

  • Должна быть консолька, принимающая команды с текстовыми аргументами (без заморочек — просто строковый массив).
  • Должно быть приглашение которое вводу, которое можно будет менять в коде.
  • Можно привязывать методы к командам с помощью Reflection и лямбда-выражений.

В целом довольно простой список. Тем, кому не терпится посмотреть на результат, ссылку на репозиторий даю: kkremen/jerminal.

Обзор кода

Ну а теперь к делу. Немного почитав про Reflection и лямбды, я решил сделать «ход конем».
В первую очередь я создал интерфейс Executable :

package org.meinkopf.console; import java.lang.reflect.InvocationTargetException; public interface Executable

Если кто не знает, то можно сделать так:

Executable ex = (args) -> < return null; >ex.invoke(someArgs);

Теперь при вызове ex.invoke(. ) выполнится лямбда-выражение. Ну а для поддержки Reflection я создал класс BasicExecutable , наследующий Executable :

package org.meinkopf.console; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; @SuppressWarnings(< "WeakerAccess", "unused" >) public class BasicExecutable implements Executable < protected Method method; protected Object target; public BasicExecutable(Method method, Object target) < this.method = method; this.target = target; >/* Getters and Setters */ public Object invoke(Object[] args) throws InvocationTargetException, IllegalAccessException < if (args.length < method.getParameterCount()) < return "Too few arguments!\n"; // если аргументов слишком мало, выводим на консоль предупреждение >return method.invoke(target, Arrays.copyOfRange(args, 0, method.getParameterCount())); // если аргументов слишком много, просто обрезаем ненужные > >

Еще я написал пару интерфейс-класс для списка команд: CommandList и BasicCommandList соответственно. Базовый класс хранит команды в Map < String, Executable >и возвращает основному классу объекты типа Executable .

package org.meinkopf.console; public interface CommandList
package org.meinkopf.console; import java.util.HashMap; import java.util.Map; @SuppressWarnings(< "unused", "WeakerAccess" >) public class BasicCommandList implements CommandList < protected Map < String, Executable >methodMap = new HashMap <>(); @Override public Executable get(String command) < return methodMap.get(command); >public void register(@SuppressWarnings("SameParameterValue") String name, Executable command) < methodMap.put(name, command); >>

Служебный класс Command хранит разобранную парсером команду в виде строки-имени и ArrayList аргументов. Аргументы, кстати, принимаются только строковые, то есть числа тоже передаются в виде строки.

Основной класс реализует Runnable , но пока я это никак не использовал, и вызываю метод run напрямую.

package org.meinkopf.console; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; @SuppressWarnings(< "WeakerAccess", "unused", "SpellCheckingInspection" >) public class Jerminal implements Runnable < public static String PROMPT = " ~ $ "; public static String HEADER = "Jerminal v0.0.1 for JVM Apps\nCopyright: Karl Meinkopf, 2017\n"; protected ArrayList < Command >commandHistory = new ArrayList <>(); protected CommandList commandList = null; private Scanner scanner; public JConsole(CommandList list) < commandList = list; scanner = new Scanner(System.in); >protected Command parse(String rawCommand) < rawCommand = rawCommand.replaceAll("(\"[\\s\\S]*?\"|[\\S]+)\\s*", "$1\u0001"); rawCommand = rawCommand.replaceAll("\"([\\s\\S]*?)\"", "$1"); String[] rawList = rawCommand.split("\u0001"); ArrayList < String >args = new ArrayList <>(Arrays.asList(rawList)); String command = args.remove(0).trim(); return new Command(command, rawCommand, args); > protected Object execute(Command command) throws InvocationTargetException, IllegalAccessException < Executable executable = commandList.get(command.getName()); if (executable == null) < return "Can't find command: '" + command.getName() + "'"; >return executable.invoke(command.getArgs().toArray()); > protected void prompt( ) < System.err.println(); System.err.print(PROMPT); Command command = parse(getInputLine()); Object result; try < result = execute(command); >catch (InvocationTargetException | IllegalAccessException e) < System.err.println("Can not execute command '" + command.getName() + "'!\n\tReason: " + e.getMessage()); return; >if (result != null) System.err.println(result.toString()); > protected String getInputLine( ) < return scanner.nextLine(); >public void run( ) < System.err.println(HEADER); //noinspection InfiniteLoopStatement while (true) < prompt(); >> >

Заключение

Ну вот и вся библиотека. Пока маленькая, но я планирую ее развивать и улучшать. Если есть замечания и советы — буду рад услышать.

Источник

Terminal and ncurses Java libraries

There’s a few Java libraries for creating terminal and ncurses like applications. They abstract away the ANSI escape codes and low level control like tput. I’ve briefly looked at three of them: Lanterna, Charva and JCurses. They all come with basic terminal control, and some widgets and window managing to create terminal based GUI applications.

JCurses seems to be the oldest, and possibly unmaintained. It requires ncurses to be installed, and also a native library. It is available through the Maven Central repository, however, make sure to set up the path for access to the libjcurses.so (in the tar-ball from SourceForge, or within the .jar from Maven). Documentation is sparse, but it seems it’s possible to interface with the terminal with little code.

Charva is also ncurses based and requires a native lib. One of it’s selling points is that it can act as a drop-in replacement for java.awt UIs. It seems unlikely that that will work well for all but the simplest UIs, however, at least it offers an easy transition path.

Finally, Lanterna seems to be the best maintained, and clearly documented project of the three. It is unique in that is handles all terminal details itself, and does not require external libraries. It is compatible with Linux, Windows, Cygwin, OS X terminals. Furthermore, if launched from an X or similar GUI based environment instead of a terminal, it will create its own GUI window into which it will render the terminal. Neat.

The drawback with Lanterna is its rather verbose and involved API. For “serious” apps, maybe that’s OK, but for simple positioning of the cursor, it can get a bit too much. The follow renders a text label with a border:

 public void testWindow() throws IOException, InterruptedException  Terminal terminal = new DefaultTerminalFactory().createTerminal(); Screen screen = new TerminalScreen(terminal); screen.startScreen(); Label label = new Label("test"); BasicWindow window = new BasicWindow(); window.setComponent(label); MultiWindowTextGUI gui = new MultiWindowTextGUI(screen, new DefaultWindowManager(), new EmptySpace(TextColor.ANSI.BLACK)); gui.setTheme(LanternaThemes.getRegisteredTheme("businessmachine")); gui.addWindowAndWait(window); >

Lanterna is available through Maven Central, so the following gradle.build lines will do.

repositories  mavenCentral() > dependencies  compile 'com.googlecode.lanterna:lanterna:3.0.0-beta3' >

Here’s the full test example, including a main-method to easily run it stand-alone from the terminal.

/* Copyright rememberjava.com. Licensed under GPL 3. See http://rememberjava.com/license */ package com.rememberjava.ui; import java.io.IOException; import org.junit.Test; import com.googlecode.lanterna.TextColor; import com.googlecode.lanterna.bundle.LanternaThemes; import com.googlecode.lanterna.gui2.BasicWindow; import com.googlecode.lanterna.gui2.DefaultWindowManager; import com.googlecode.lanterna.gui2.EmptySpace; import com.googlecode.lanterna.gui2.Label; import com.googlecode.lanterna.gui2.MultiWindowTextGUI; import com.googlecode.lanterna.screen.Screen; import com.googlecode.lanterna.screen.TerminalScreen; import com.googlecode.lanterna.terminal.DefaultTerminalFactory; import com.googlecode.lanterna.terminal.Terminal; public class LanternaCliTest  public static void main(String[] args) throws Exception  new LanternaCliTest().testWindow(); > @Test public void testWindow() throws IOException, InterruptedException  Terminal terminal = new DefaultTerminalFactory().createTerminal(); Screen screen = new TerminalScreen(terminal); screen.startScreen(); Label label = new Label("test"); BasicWindow window = new BasicWindow(); window.setComponent(label); MultiWindowTextGUI gui = new MultiWindowTextGUI(screen, new DefaultWindowManager(), new EmptySpace(TextColor.ANSI.BLACK)); gui.setTheme(LanternaThemes.getRegisteredTheme("businessmachine")); gui.addWindowAndWait(window); > >

Remember Java

Источник

Читайте также:  Example
Оцените статью