Запись long (примитивный тип) в файл в Java - PullRequest
2 голосов
/ 14 сентября 2011

Привет всем,

У меня есть массив long, который я хотел бы записать в файл .txt, который позже смогу открыть в gedit (по одному числу в строке). Я получаю эти значения, используя вычитание двух экземпляров System.currentTimeMillis ().

Я использую следующий код:

BufferedWriter out = new BufferedWriter(new FileWriter("latency.txt"));
for (int i = 0; i < USER_LIMIT; ++i) {
    out.write(latency[i] + "\n");
}
out.close();

При просмотре файла я вижу:

0
1
1
0

Я полагаю, что конкатенация строк преобразует long в целое число. Если я использую DataOutputStream, то не могу прочитать его обратно с помощью gedit или любого редактора блокнота / текста, он просто выглядит как мусор (я полагаю, он пишет байты).

Кто-нибудь, пожалуйста, дайте мне знать, как я могу решить мою проблему, пожалуйста?

Большое спасибо!

Ответы [ 4 ]

6 голосов
/ 14 сентября 2011

В вашем коде нет ничего плохого.То, что вы думаете в latency ... нет.

public static void main(String[] args) throws IOException
{
    long[] latency = { 123456789000L, 234567890000L, 345678901000L };

    BufferedWriter out = new BufferedWriter(new FileWriter("latency.txt"));
    for (int i = 0; i < 3; ++i) {
        out.write(latency[i] + "\n");
    }
    out.close();
}

производит:

$ more latency.txt 
123456789000
234567890000
345678901000

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

0 голосов
/ 14 сентября 2011

Когда вы используете DataOutputStream для записи long, он использует другую кодировку ваших данных, чем понимает gedit.

Одна из наиболее распространенных кодировок, используемых для текстовых файлов, - ASCII.При этом каждый байт представляет символ в таблице.Эта таблица имеет 128 символов.Когда вы пишете строку в файл, используя Java, как вы это делаете, это то, что происходит, и gedit понимает эту кодировку.Если вы преобразуете long в строку, максимальный размер long будет выглядеть следующим образом: 9223372036854775807. Это займет 19 байт.

Длина в Java составляет 64 бита или 8 байт.Когда вы используете DataOutputStream, long записывается в файл как 8 байтов.Текстовый редактор, такой как gedit, не понимает эту кодировку.

Что еще больше усложняет ситуацию, так это кодировки, такие как UTF-8.

0 голосов
/ 14 сентября 2011

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

for ( int i = 0; i < USER_LIMIT; ++i ) {
    out.write( String.valueOf(latency[i]) ); // Or Long.toString(long)
    out.write( '\n' ); // Or simply out.newLine() 
}
0 голосов
/ 14 сентября 2011

Приведите к Long и используйте toString:

out.write(((Long)latency[i]).toString() + "\n");

Или просто используйте статическую toString:

out.write(Long.toString(latency[i]) + "\n");
...