Печать с помощью "\ 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
Почему проблема с вкладками?
Ответы
Ответ 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.
Ответ 7
Вы также можете вставить строку до требуемой длины, используя Guava Strings.padEnd(ввод строки, int minLength, char padding)
Ответ 8
Этот пример можно использовать для решения вашей проблемы:
System.out.printf( "%-15s %15s %n", "name", "lastname");
System.out.printf( "%-15s %15s %n", "Bill", "Smith");
Вы можете играть с "%", пока не найдете правильное выравнивание, чтобы удовлетворить ваши потребности.