我有以下代码
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)
工作正常。 请解释这里发生的编码。
答案 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
(作为另一个writeByte
,writeShort
等,具有相应的字节大小)写入8个字节的双值表示。这就是为什么课程称为DataOutputStream
(数据)。
writeUTF
写入2个字节的长度和实际字符串。