Запретить Java разбирать параметры командной строки - PullRequest
1 голос
/ 18 марта 2010

Хотелось бы сделать приложение на Java, которое не будет автоматически анализировать параметры, используемые в командной строке. В настоящее время java требует public static void main(string[]) в качестве подписи точки входа. Я хотел бы только одну строку, которую я анализирую сам. Можно ли вообще это сделать?

Вот пример: java MyProgram Hello World

Я бы хотел, чтобы он дал мне Hello World без кавычек вокруг этой строки. Я бы даже согласился на Яву, дающую мне все java MyProgram Hello World. Я думаю, что это нечто за пределами Java и больше связано с оболочкой.

Ответы [ 7 ]

6 голосов
/ 18 марта 2010

Вы правы насчет части оболочки. Предполагая, что вы работаете в Unix, ваша оболочка Unix разделит вашу входную строку на пробелы, а затем вернет вам каждый фрагмент в качестве элемента в массиве, который вводится в «main». Единственный способ получить все как одну строку - это заключить в кавычки так (что вы сказали, что не хотите):

java MyProgram 'Hello World'

Если вы не хотите этого делать, самое простое - просто объединить их в строку:

public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();
    for(String s : args) {
        sb.append(s);
        sb.append(" "); //some length of whitespace
    }

    String yourString = sb.toString().trim();
}

Настоящая проблема здесь в том, что если вы попытаетесь избежать цитирования и самостоятельно рекомбинируете входные строки, вы потеряете количество пробела между каждым словом. Если вы рекомбинируете, все следующие командные строки:

java MyProgram Hello World
java MyProgram Hello    World
java MyProgram Hello                           World

все равно будет отображаться как "Hello World" внутри вашей программы.

1 голос
/ 18 марта 2010

Это скорее взлом, чем что-либо другое, и он решает проблему с другой стороны, но в bash есть переменная, называемая IFS или внутренним разделителем полей, которая сообщает оболочке, что считать разделителем. Если бы вы завершили чтение с изменением IFS, вы могли бы получить тот же базовый эффект, который вы ожидаете, хотя и с скукой необходимости каждый раз вводить данные вручную.

Просто предложение, удар ниже.

#!/bin/bash

IFS="
"

read TMP

java $1 \"$TMP\"

unset IFS
1 голос
/ 18 марта 2010

Просто присоединитесь к строкам:

class MyProgram {
    public static void main(String [] args ) {
        String commandLine = join( args );
        System.out.println(commandLine);
        // go on 
     }
     private static String join( String [] args ) {
         StringBuilder builder = new StringBuilder();
         for( String arg : args ) {
             builder.append( arg );
             builder.append( ' ' );
         } 
         builder.delete( builder.length()-1, builder.length());
         return builder.toString();
      }
}

Выход:

выход http://img443.imageshack.us/img443/2682/capturadepantalla201003v.png

1 голос
/ 18 марта 2010

Java всегда требует эту подпись. Вы можете создать единственную строку из параметров вашего основного метода.

См. this для примеров того, как это сделать.

0 голосов
/ 18 марта 2010

Нет.Командную строку анализирует не Java, а оболочка.Чтобы предотвратить это, вы должны заключить в кавычки.

java MyProgram "Hello World"
0 голосов
/ 18 марта 2010
StringBuilder b = new StringBuilder();
for (string s : commandLineArgs) {
    b.append(s);
    b.append(" ");
}

// do what you want with b
0 голосов
/ 18 марта 2010

Быстрое и грязное исправление - просто объедините все переданные параметры.

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