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

writeDouble() method of DataOutputStream is writing data in text document in encoded form

我有以下代码

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

现在我正在将这个双精度值写入文本文件 new.txt ,但以下值正在文本文件中获取

@1LÌÌÌÌÍ

但是当我使用

out.writeUTF(""+d)

它工作正常。 请解释此处进行的编码。

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

示例:

int i = 8;

在二进制中,我的值是“0100”,这是计算机管理的值....但是你不想写位“0100”,因为你想要读取一些东西,而不是它的值;你想要 CHARACTER '8',所以你必须将 double 转换为字符(转换为 String 也是有效的,因为它是可读的)....

这就是您使用 ("" + d) 所做的事情:将其转换为字符串。

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

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

writeDouble(double v)

Converts the double argument to a long using the doubleToLongBits method in class Double, and then writes that long value to the underlying output stream as an 8-byte quantity, high byte first.

阅读 Javadoc:

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

writeDouble(Double)

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

来自文档 -

writeDouble  - 

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

writeDouble(作为另一个 writeBytewriteShort 等,具有相应的字节大小)写入 8 个字节的双精度值表示。这就是为什么 class 被称为 DataOutputStream (Data).

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

在java中通常有两种类变量,即引用类型和原始类型。

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

引用类型保存存储位置并引用某些对象。 ( string/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){
}