Печать с "\ t" (вкладки) не приводит к выравниванию столбцов - PullRequest
28 голосов
/ 14 мая 2011

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

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

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

Ответы [ 8 ]

32 голосов
/ 02 января 2014

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

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
23 голосов
/ 14 мая 2011

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

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

6 голосов
/ 21 февраля 2016

Длина текста, который вы предоставляете в каждой строке, отличается, это проблема, поэтому, если второе слово слишком длинное (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
5 голосов
/ 14 мая 2011

В продолжение комментариев Петера и Дункана я обычно использую метод быстрого заполнения, что-то вроде -

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

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

2 голосов
/ 06 октября 2016

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

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

StringUtils.rightPad("String to extend",100); //100 is the length you want to pad out to.
2 голосов
/ 14 мая 2011

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

1 голос
/ 31 августа 2016

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

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

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

1 голос
/ 31 марта 2013

Вы также можете дополнить строку до необходимой длины, используя Guava * Strings.padEnd (String input, int minLength, padding)

...