2013-09-23 5 views
1

мне приходится иметь дело с ASCii структурирован файл, мне нужно, чтобы эти две постоянные байты в конце каждой строки, так что я могу уважать структуру файла, который дал мне:Append байтов в строку в Java

private final static int ENDRECORD = 0x0d; 
private final static int ENDLINE = 0x0a; 

Я не знаю, является ли это классическим «\ n», есть ли способ, которым я могу поместить эти две переменные в конец строки? Нравится:

Строка line = line + ENDRECORD + ENDLINE; // Я сейчас это неправильно

ответ

2

Вы близко. Это '\r' и '\n'.

System.out.println((int) '\r'); 
System.out.println((int) '\n'); 

Выход:

13 
10 

который 0x0d и 0x0a, соответственно. Используйте char S:

private final static char ENDRECORD = '\r'; 
private final static char ENDLINE = '\n'; 

и

String line = line + ENDRECORD + ENDLINE; 

Кроме того, вы можете использовать StringBuilder для эффективности вместо конкатенации. Нет необходимости, чтобы это работало, но стандартно использовать его для построения строк вместо конкатенации с помощью +.

+0

Было бы неэффективно использовать StringBuilder для кода, который мы видели до сих пор. StringBuilder отлично подходит для избежания * повторной * конкатенации, но для операции * single * (multi-value) конкатенации, как у нас здесь, это бессмысленно. –

0

Вы должны изменить тип данных на char.

String myFullLine = line + (char)ENDRECORD + (char)ENDLINE; 

Если ваш планирует делать это в течение более чем одной линии я recommed с помощью StringBuilder.

+0

Это все равно даст неправильный ответ, поскольку это будет добавление текстового представления целых чисел. И если нет * * цикла, то здесь нет смысла использовать StringBuilder. Единственная операция конкатенации в порядке. –

+0

Теперь с редактированием это сработает, но часть StringBuilder по-прежнему является полной красной селедкой. –

+0

Да, видел мою ошибку. Причина, по которой я помещаю StringBuilder, заключается в том, что я предполагаю, что в конце будет больше, чем на линии, и в этот момент она будет более эффективной, чем конкатенация строк. –

1

Просто измените константы быть строки вместо:

private final static String ENDRECORD = "\r"; 
private final static String ENDLINE = "\n"; 

Тогда существующая конкатенация должна быть тонкой.

char будет тоже хорошо:

private final static char ENDRECORD = '\r'; // Or (char) 0x0d 
private final static char ENDLINE = '\n'; // Or (char) 0x0a 

Вы должны думать о символов как символы, а не либо байтов или целых значений. Это упростит вашу обработку текста.

0

Вам нужно, чтобы значения были символами вместо целых чисел.

Таким образом, вы можете сделать это так:

private static final char ENDRECORD = (char)0x0d; 
private static final char ENDLINE = (char)0x0a; 
... 
line = line + ENDRECORD + ENDLINE; 

Я предполагаю, что вы имеете более чем одной записи, так что лучше всего было бы создать цикл для каждой записи и использовать StringBuilder:

StringBuilder buffer = new StringBuilder(4096); 
for (final String record: records) { 
    buffer.setLength(0); 
    buffer.append(record).append(ENDRECORD).append(ENDLINE); 
    String line = buffer.toString(); 
    ... 
} 

Если все, что вы собираетесь делать запись выводить его, то нет никакой необходимости, чтобы поместить его в StringBuilder; просто напишите это в своем потоке или в Writer:

OutputStream out = new FileOutputStream("records.dat"); 
for (final String record: records) { 
    out.write(record.getBytes()); 
    out.write(ENDRECORD); 
    out.write(ENDLINE); 
} 
+1

Использование OutputStream непосредственно для текстовых данных - не очень хорошая идея; оберните его в OutputStreamWriter. (Или используйте FileWriter, но мне это не нравится, поскольку вы не можете указать кодировку.) –

+0

Если это формат записи данных, скорее всего, вам не понадобится преобразование символа языка. – WeaponsGrade

+1

Он имеет дело со * струнами *. Будет * абсолютно * быть текстом для двоичного преобразования, происходящим, что бы ни случилось. Нет другого способа начать с String в памяти и получить файл на диске (который по сути является двоичными данными). В вашем текущем коде просто используется кодировка по умолчанию для платформы, которая почти всегда * ошибочна. ИМО. –

Смежные вопросы