在Java中向文件写入长(基元类型)

在Java中向文件写入长(基元类型),java,file,long-integer,Java,File,Long Integer,大家好 我有一个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

大家好

我有一个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();
我相信字符串串联将long转换为整数。如果我使用DataOutputStream,那么我无法用gedit或任何记事本/文本编辑器读回它,它看起来就像垃圾(我相信它在写字节)

有人能告诉我如何解决我的问题吗


多谢各位

铸造成长形并使用toString:

out.write(((Long)latency[i]).toString() + "\n");
out.write(Long.toString(latency[i]) + "\n");
或者只使用静态toString:

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

你的代码没有问题。您认为什么是延迟。。。不是

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();
}

当您遇到这样的代码问题时,编写一个小测试用例来缩小问题的范围通常是有益的。

您不需要将换行符附加到数字上,这样您就可以将它们分开并避免这个问题。试试这个:

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() 
}
for(int i=0;i
当您使用DataOutputStream写入长数据时,它使用的数据编码与gedit所理解的不同

文本文件最常用的编码之一是ASCII码。每个字节表示表中的一个字符。此表有128个字符。当您以Java的方式向文件写入字符串时,这就是正在发生的事情,gedit理解这种编码。如果将long转换为字符串,则long的最大大小如下:9223372036854775807。这将占用19个字节

Java中的long是64位或8字节。当您使用DataOutputStream时,将以8字节的形式写入文件。像gedit这样的文本编辑器不理解这种编码


更复杂的是UTF-8之类的编码。

延迟[i]的值是什么?你能告诉我们数组中的前几个数字应该是什么吗?字符串串联并没有将
长的
转换成
int
。我实际上没有检查延迟[i]的值,我应该检查(我的错). 我现在就去看。我假设,因为系统返回毫秒,所以1太小了。让我再检查一遍数值。@Jary:真的,你应该先检查一下!如果
latency[i]
已经是一个
long
,这应该是零差异。除了这不应该是一个问题之外。在这种情况下,我会得到以下错误:BufferedWriter类型中的方法write(int)不适用于参数(long)(Eclipse)@Jary:Oh,那么,您必须将long转换为
int
或使用不同的打印方法。我真正的观点是,在打印之前,不需要将换行符附加到数字上。@Shakedown:字符串连接操作应该没有问题。更重要的是,上面的代码不会编译(正如OP刚刚发现的那样);延迟[i]是“long”类型,我使用的BufferedWrite不能直接写入“long”。不用担心。我们都见过至少几个兔子洞的底部:)