Подтвердить что ты не робот

Печать с помощью "\ t" (вкладки) не приводит к выравниванию столбцов

У меня очень странная проблема. После написания этого:

for (File f : currentFile.listFiles()) {            
    if  (f.isDirectory()){
        System.out.println(f.getName()+"\t"+"Dir\t"+Command.getpremission(f)+"\t"+f.getTotalSpace());
    }
    else{
        System.out.println(f.getName()+"\t"+"File\t"+Command.getpremission(f)+"\t"+f.getTotalSpace());
    }

Я вижу это напечатано:

see.txt File    rw  267642728448
see1.txt    File    rw  267642728456
see2.txt    File    rw  267642728448

Почему проблема с вкладками?

4b9b3361

Ответ 1

Основываясь на этом вопросе, я использую следующий код для отступа в своих сообщениях:

String prefix1 = "short text:";
String prefix2 = "looooooooooooooong text:";
String msg = "indented";
/*
* The second string begins after 40 characters. The dash means that the
* first string is left-justified.
*/
String format = "%-40s%s%n";
System.out.printf(format, prefix1, msg);
System.out.printf(format, prefix2, msg);

Это вывод:

short text:                             indented
looooooooooooooong text:                indented

Это описано в разделе "Символы флага" в man 3 printf.

Ответ 2

"Проблема" с вкладками заключается в том, что они отстутствуют от текста до фиксированных позиций табуляции, обычно кратно 4 или 8 символам (в зависимости от того, какая консоль или редактор отображает их). Ваше первое имя файла - 7 символов, поэтому следующая вкладка останавливается после ее окончания в позиции 8. Ваши последующие имена файлов, однако, длинны 8 символов, поэтому следующая вкладка табуляции находится в позиции 12.

Если вы хотите убедиться, что столбцы получают хороший отступ в одной позиции, вам нужно учитывать фактическую длину предыдущих столбцов и изменить либо количество следующих вкладок, либо пробел с требуемым количеством пробелов. Последнее может быть достигнуто с использованием, например, System.out.printf с соответствующей спецификацией формата (например, "%1$13s" задает минимальную ширину 13 символов для отображения первого аргумента в виде строки).

Ответ 3

Длина текста, который вы предоставляете в каждой строке, отличается, это проблема, поэтому, если второе слово слишком длинное (see2.txt длинно 8 символов, что соответствует длине одной вкладки), оно печатает вкладку, которая переходит к следующему пункту табуляции. Один из способов решить эту проблему - программно добавить пэд к f.getName() чтобы каждый сгенерированный текст: see.txt или see2.txt имел одинаковую длину (например, see.txt_ и see2.txt), чтобы каждая вкладка автоматически переходит в ту же точку табуляции.

Если вы разрабатываете с JDK 1.5, вы можете решить эту проблему с помощью java.util.Formatter:

String format = "%-20s %5d\n";
System.out.format(format, "test", 1);
System.out.format(format, "test2", 20);
System.out.format(format, "test3", 5000);

этот пример даст вам этот отпечаток:

test                     1
test2                   20
test3                 5000

Ответ 4

В продолжении комментариев Péter и duncan, я обычно использую быстрый метод заполнения, что-то вроде -

public String rpad(String inStr, int finalLength)
{
    return (inStr + "                          " // typically a sufficient length spaces string.
        ).substring(0, finalLength);
}

Аналогичным образом вы можете иметь lpad(), а также

Ответ 5

Проблема заключается в длине имен файлов. Первое имя файла имеет длину всего 7 символов, поэтому вкладка имеет значение char 8 (выполнение вкладок после каждых 4 символов). Однако следующие имена файлов содержат 8 символов, поэтому следующая вкладка не будет находиться до char 12. И если у вас были имена файлов длиной более 11 символов, вы снова столкнетесь с той же проблемой.

Ответ 6

Как упоминалось другими людьми, переменная длина строки является проблемой.

Вместо того, чтобы изобретать колесо, Apache Commons имеет хорошее, чистое решение для этого в StringUtils.

StringUtils.rightPad("String to extend",100); //100 is the length you want to pad out to.

Ответ 8

Этот пример можно использовать для решения вашей проблемы:

System.out.printf( "%-15s %15s %n", "name", "lastname");
System.out.printf( "%-15s %15s %n", "Bill", "Smith");

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