乱码 io

hnjdx814733170 2013-09-07 08:31:10
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class StoringAndRecoveringData {

public static void main(String[] args)
throws IOException {
DataOutputStream out = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("src/io/Data.txt")));
out.writeFloat(3.14159f);
out.writeUTF("That was pi");
out.writeDouble(1.41413);
out.writeUTF("Square root of 2");
out.close();
DataInputStream in = new DataInputStream(
new BufferedInputStream(
new FileInputStream("src/io/Data.txt")));
System.out.println(in.readFloat());
System.out.println(in.readUTF());
System.out.println(in.readDouble());
System.out.println(in.readUTF());
}
}
奇怪的乱码问题
控制台输出正常,文本文件乱码
帮忙的哥们运行下,不要盲目回答。
...全文
257 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
G-ben 2014-02-13
  • 打赏
  • 举报
回复
引用 6 楼 hnjdx814733170 的回复:
那FileOutputStream也是输出的字节流,为什么用的时候控制台与文件都不会乱码呢?
应该是 DataOutputStream 会将数据字节 进行转换 也许乱码 是因为内容成为了utf-16 而好比 writeLong(long) FileOutputStream write always byte
remember1989 2014-02-13
  • 打赏
  • 举报
回复
序列化出来的内容是二进制的,所以你不能直接从文件中看到。你必须将内容以文本方式写到文件,你才能看懂。
乔不思 2014-02-13
  • 打赏
  • 举报
回复
引用 6 楼 hnjdx814733170 的回复:
那FileOutputStream也是输出的字节流,为什么用的时候控制台与文件都不会乱码呢?
楼主你还是看看 API对这两个类的 解释。。
乔不思 2014-02-13
  • 打赏
  • 举报
回复
引用 4 楼 yzw19932010 的回复:
DataOutputStream输出的是字节流,你仔细去网上搜下关于这个类的使用和介绍。也可以看下API关于这个类的介绍。 这个流中的每一个方法写入文件的字节都是不相同的,比如writeChars(char c)是将这个字符的两个字节都写入文件中,比如writeChars('a'),a对应的是十进制是97,对于的16进制是61,也就是说写入的是 00 61,如果是writeBytes写入呢?则是将每个字符的低字节内容写入目标设备中,也就是 61 ,因为一个字符由两个字节组成,前面是高,后面是低。 而为什么控制台输出又是正确的呢?因为你又使用了同样的readxxx()方法读了回来,相当于,我加密了一段密文情书发给女神,又告诉了女神解密的方法,女神就能读懂我的情书了,然后果断拒绝了我。但是我如果没告诉她解密的方法呢?她心里会想,屌丝,真特么无聊。然后和高富帅去啪啪啪。 这样,你使用txt一个文本文件工具打开,没法按照工具认为的编码方式去读取数据,所以就会像你所说的乱码。 如果不懂,可以继续问我。
额,,太形象了
hnjdx814733170 2014-02-12
  • 打赏
  • 举报
回复
那FileOutputStream也是输出的字节流,为什么用的时候控制台与文件都不会乱码呢?
huntor 2013-09-08
  • 打赏
  • 举报
回复
DataOutputStream输出的不是字符流,生成的不是文本文件,怎么可以按文本文件查看 用DataInputStream读当然没有问题了
ceclinux 2013-09-08
  • 打赏
  • 举报
回复
引用 4 楼 yzw19932010 的回复:
DataOutputStream输出的是字节流,你仔细去网上搜下关于这个类的使用和介绍。也可以看下API关于这个类的介绍。 这个流中的每一个方法写入文件的字节都是不相同的,比如writeChars(char c)是将这个字符的两个字节都写入文件中,比如writeChars('a'),a对应的是十进制是97,对于的16进制是61,也就是说写入的是 00 61,如果是writeBytes写入呢?则是将每个字符的低字节内容写入目标设备中,也就是 61 ,因为一个字符由两个字节组成,前面是高,后面是低。 而为什么控制台输出又是正确的呢?因为你又使用了同样的readxxx()方法读了回来,相当于,我加密了一段密文情书发给女神,又告诉了女神解密的方法,女神就能读懂我的情书了,然后果断拒绝了我。但是我如果没告诉她解密的方法呢?她心里会想,屌丝,真特么无聊。然后和高富帅去啪啪啪。 这样,你使用txt一个文本文件工具打开,没法按照工具认为的编码方式去读取数据,所以就会像你所说的乱码。 如果不懂,可以继续问我。
解释的生动啊,女神哪有空去解密屌丝的情书
william_yao 2013-09-08
  • 打赏
  • 举报
回复
DataOutputStream输出的是字节流,你仔细去网上搜下关于这个类的使用和介绍。也可以看下API关于这个类的介绍。 这个流中的每一个方法写入文件的字节都是不相同的,比如writeChars(char c)是将这个字符的两个字节都写入文件中,比如writeChars('a'),a对应的是十进制是97,对于的16进制是61,也就是说写入的是 00 61,如果是writeBytes写入呢?则是将每个字符的低字节内容写入目标设备中,也就是 61 ,因为一个字符由两个字节组成,前面是高,后面是低。 而为什么控制台输出又是正确的呢?因为你又使用了同样的readxxx()方法读了回来,相当于,我加密了一段密文情书发给女神,又告诉了女神解密的方法,女神就能读懂我的情书了,然后果断拒绝了我。但是我如果没告诉她解密的方法呢?她心里会想,屌丝,真特么无聊。然后和高富帅去啪啪啪。 这样,你使用txt一个文本文件工具打开,没法按照工具认为的编码方式去读取数据,所以就会像你所说的乱码。 如果不懂,可以继续问我。
ceclinux 2013-09-08
  • 打赏
  • 举报
回复
Thinking in JAVA里面看来的吧 DataOutputStream是面向字节而不是面向字符的,如何用正常的文本阅读器读? writeFloat,writeDouble是用IEEE754浮点数标准编码的 writeUTF是用Modified UTF-8编码的
wind_elf 2013-09-07
  • 打赏
  • 举报
回复
你用的是DataOutputStream字节输出流写到Data.txt文件里的,写进去的不是字符。用OutputStreamWriter字符输入应该是可以的。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧