Looking for java Keywords? Try Ask4Keywords

Java Language Пробелы и другие специальные символы в аргументах


пример

Прежде всего, проблема обработки пространств в аргументах на самом деле НЕ является проблемой Java. Скорее, это проблема, которая должна выполняться командной оболочкой, которую вы используете при запуске Java-программы.

В качестве примера предположим, что мы имеем следующую простую программу, которая печатает размер файла:

import java.io.File;

public class PrintFileSizes {
    
    public static void main(String[] args) {
        for (String name: args) {
            File file = new File(name);
            System.out.println("Size of '" + file + "' is " + file.size());
        }
    }
}

Предположим теперь, что мы хотим напечатать размер файла, у которого в нем есть пробелы; например /home/steve/Test File.txt . Если мы запустим команду следующим образом:

$ java PrintFileSizes /home/steve/Test File.txt

оболочка не будет знать, что /home/steve/Test File.txt на самом деле является одним из путей. Вместо этого он будет передавать два различных аргумента Java-приложению, которые будут пытаться найти их соответствующие размеры файлов и сбой, потому что файлы с этими путями (вероятно) не существуют.

Решения, использующие оболочку POSIX

Оболочки POSIX включают в себя sh а также производные, такие как bash и ksh . Если вы используете одну из этих оболочек, вы можете решить проблему, указав аргумент.

$ java PrintFileSizes "/home/steve/Test File.txt"

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

$ java PrintFileSizes '/home/steve/Test File.txt'

Одиночные (прямые) кавычки рассматриваются как двойные кавычки, за исключением того, что они также подавляют различные расширения в аргументе.

$ java PrintFileSizes /home/steve/Test\ File.txt

Обратная косая черта пропускает следующее пространство и не позволяет интерпретировать ее как разделитель аргументов.

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

Решение для Windows

Основная проблема для Windows заключается в том, что на уровне ОС аргументы передаются дочернему процессу как одна строка ( источник ). Это означает, что конечная ответственность за синтаксический анализ (или повторный анализ) командной строки лежит на любой программе или ее библиотеках времени исполнения. Существует много несогласованности.

В случае Java, чтобы сократить длинную историю:

  • Вы можете поместить двойные кавычки вокруг аргумента в команду java , и это позволит вам передавать аргументы с пробелами в них.

  • По-видимому, сама команда java анализирует командную строку, и она становится более или менее правильной

  • Однако, когда вы пытаетесь объединить это с использованием замены SET и переменной в пакетном файле, становится очень сложно определить, удаляются ли двойные кавычки.

  • Оболочка cmd.exe видимому, имеет другие механизмы экранирования; например, удвоение двойных кавычек и использование ^ экранов.

Подробнее см. В документации к пакетному файлу .