DataOutputStream的writeDouble()方法是以编码形式在文本文档中写入数据

时间:2015-06-10 07:03:59

标签: java dataoutputstream

我有以下代码

public static void main(String aed[]){
    double d=17.3;
    try{
            DataOutputStream out=null;
            out=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("new.txt")));
            out.writeDouble(d);
            out.flush();
        }catch(FileNotFoundException fnf){
            fnf.printStackTrace();
        }catch(IOException io){
            io.printStackTrace();
        }
}

现在我将这个double值写入文本文件new.txt,但是后面的值是在文本文件中获取

@1LÌÌÌÌÍ

但是当我使用

out.writeUTF(""+d)

工作正常。 请解释这里发生的编码。

5 个答案:

答案 0 :(得分:1)

在java中,通常有两类变量,即引用和基本类型。

您的原始类型包括int,double,byte,char,boolean,long,short和float。它们存储一个值,并由内存中的unicode 16位整数表示。

引用类型包含存储位置和引用某些对象。 (字符串/ UTF是引用类型)因此可以看到实际值

二进制文件不是由您读取,而是由一个程序来读取,该程序将以正确的形式和顺序获取值,并且您使用的方法应该仅用于写入二进制文件(.dat)。以各自的形式保存实际数据值(int,double等)。当写入文本文件(.txt)时,文本只应写入字符串。

写入文本文件:

try{
PrintWriter write=new PrintWriter("your filepath",true);
write.println("whatever needs to be written");

write.close();
}
catch(FileNotFoundException){
}

阅读:

Scanner read;
try{
read=new Scanner(new FileReader("your path"));


while(read.hasNext()){
System.out.println(read.nextLine);
}

read.close();
}

catch(FileNotFoundException e){
}

答案 1 :(得分:0)

使用DataOutputStream编写字节,表示双精度值(这是一个数字值)的字节,而不是该数字的可读版本。

示例:

int i = 8;

在二进制i中,值为' 0100'这就是计算机管理的价值......但是你不想写下这些东西...... 0100''因为你想读点东西,而不是它的价值;你想要CHARACTER' 8',所以你必须将double转换为character(因为String也是有效的,因为它是可读的)....

这就是你正在做的事情("" + d):将它转换为String。

使用Writer编写文本文件(可以使用BufferedWriter和FileWriter,查看this了解更多详情)

答案 2 :(得分:0)

java.io.DataOuputStream.writeUTF(String str)将两个字节的长度信息写入输出流,然后是字符串s中每个字符的修改后的 UTF-8 表示。

writeDouble(double v)
  

使用doubleToLongBits将double参数转换为long   类Double中的方法,然后将该long值写入   基础输出流为8字节数量,高字节优先。

阅读Javadoc:

https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html

答案 3 :(得分:0)

writeDouble(Double)

方法不使用UTF-8编码。如果您使用writeDoble()编写了一个双精度数,那么您应该使用readDouble DataInputStream方法来阅读它。这些文件不应手动修改或读取。如果你想把它放在普通,那么坚持使用writeUTF方法。

来自文档 -

writeDouble  - 

使用Double类中的doubleToLongBits方法将double参数转换为long,然后将该long值作为8字节数量,高字节优先写入基础输出流。

答案 4 :(得分:0)

writeDouble(作为另一个writeBytewriteShort等,具有相应的字节大小)写入8个字节的双值表示。这就是为什么课程称为DataOutputStream数据)。

writeUTF写入2个字节的长度和实际字符串。