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()
编写了一个双精度数,那么您应该使用 DataInputStream
的 readDouble
方法读取它。这些文件不应被手动修改或读取。如果你想把它放在普通的然后坚持 writeUTF
方法。
来自文档 -
writeDouble -
使用 class Double 中的 doubleToLongBits 方法将 double 参数转换为 long,然后将该 long 值作为 8 字节量写入基础输出流,高字节在前。
writeDouble
(作为另一个 writeByte
、writeShort
等,具有相应的字节大小)写入 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){
}
我有以下代码
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()
编写了一个双精度数,那么您应该使用 DataInputStream
的 readDouble
方法读取它。这些文件不应被手动修改或读取。如果你想把它放在普通的然后坚持 writeUTF
方法。
来自文档 -
writeDouble -
使用 class Double 中的 doubleToLongBits 方法将 double 参数转换为 long,然后将该 long 值作为 8 字节量写入基础输出流,高字节在前。
writeDouble
(作为另一个 writeByte
、writeShort
等,具有相应的字节大小)写入 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){
}