Записать строку в определенную позицию в файле

Я использую BufferedWriter для записи строк в такой файл:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Test {

    public static void main(String[] args) throws IOException {
       String myname = "JOHN DOE MAXWELL";
       String myotherName = "MELCHIZEDEK NEBUCHARDINEZZAR";
       String mylocation = "SOUTH EAST";
       String myotherlocation = "SOUTH WEST";
       File f = new File("MyFile.txt");
       BufferedWriter bw  = new BufferedWriter(new FileWriter(f));
       bw.write(myname + "                       " + mylocation);
       bw.newLine();
       bw.write(myothername + "                  " + myotherlocation);
       bw.close();
    }
}

Мне нужно написать mylocation так, чтобы независимо от длины строки myname начальная позиция mylocation не пострадала. Пожалуйста помогите.

Мой вывод должен быть:

JOHN DOE MAXWELL          SOUTH EAST
MELCHIZEDEK NEBUCHARDI    SOUTH WEST

person ErrorNotFoundException    schedule 11.04.2013    source источник
comment
Пожалуйста, отредактируйте свой вопрос, включив в него пример того, как должен выглядеть результирующий файл. Возможно, два примера с разной длиной mynames?   -  person Duncan Jones    schedule 11.04.2013
comment
Вставка в точку?   -  person Sri Harsha Chilakapati    schedule 11.04.2013


Ответы (4)


Вы могли бы сделать

bw.write(String.format("%-20s%s%n", myName, myLocation));

Вы можете использовать PrintWriter для использования printf(), который делает и то, и другое.

например Использование PrintWriter

pw.printf("%-" + myNameWidth + "s%s%n", myName, myLocation);
person Peter Lawrey    schedule 11.04.2013
comment
Хороший ответ. Можно также создать общий метод привязки к длине, используя ту же технику. См. примеры на stackoverflow.com/a/391978/474189. - person Duncan Jones; 11.04.2013
comment
Из любопытства, что, если бы я хотел три строки, такие как bw.write(String.format("%-20s%s%n", myName, myLocation, MyotherString)); - person ErrorNotFoundException; 12.04.2013
comment
Вам нужна еще одна %-20s или %-32s или любая другая ширина, которую вы хотите. Обратите внимание, что - предполагает, что вы хотите выровнять по левому краю. Без него строка выравнивается по правому краю, как числа. - person Peter Lawrey; 12.04.2013
comment
Если я сделаю %-20s, третья строка начнется сразу после второй без пробела, если я сделаю %20s, если две третьи строки не одинаковой длины, более длинная будет начинаться первой. Что представляет собой s? - person ErrorNotFoundException; 12.04.2013
comment
Порядок не меняется, это всегда будет тот порядок, который вы даете. Число — это ширина каждого поля, не смещенная от начала. - person Peter Lawrey; 12.04.2013
comment
Использование %20s%-20s может привести к тому, что две строки перейдут друг в друга, поэтому вы можете использовать %20s %-20s, чтобы между ними всегда был один пробел. - person Peter Lawrey; 12.04.2013
comment
Ок, спасибо, теперь понял полностью. - person ErrorNotFoundException; 12.04.2013

попробуй это

bw.write(myname + "                             ".substring(0, 30) + " " + mylocation);
person Evgeniy Dorofeev    schedule 11.04.2013

Использование Google Guava:

Strings.padEnd("JOHN DOE MAXWELL", 26, ' ').length()

Строка всегда будет иметь длину 26 символов.

person Sergii Shevchyk    schedule 11.04.2013

таким образом, какой бы ни была длина строки myname, начальная позиция mylocation не будет затронута

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

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

person CloudyMarble    schedule 11.04.2013