A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张晴 黑马帝   /  2011-8-1 13:55  /  2832 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

通过下面的程序,我往记事本 test.txt中写入了unicode码的”中国”,但它没有正确显示,我在UltraEdit中查看了它对应的16进制数字表示为:60 A8 59 7D,发现它没有“FF FE” unicode开头标志,所以在记事本上没有正确显示,那也是正常的,我又建了个文本文档,在里面写上”中国”两个字,并将它按Unicode编码保存,然后在UltraEdit中查看它对应的16进制数字表示:FF FE A8 60 7D 59
问题: 从JAVA程序中向记事本里以Unicode编码的形式写入数据,怎么对应的字节数据成反的了呢,“中” 原本的Unicode码是 A8 60  ,但从JAVA程序输出的怎么就成了60 A8,“国“也一样
  1. import java.io.*;
  2. public class DataOutputStreamTest {
  3.         public static void main(String[] args) throws IOException {
  4.                 FileOutputStream f=new FileOutputStream("D:\\test.txt");
  5.                 DataOutputStream dos=new DataOutputStream(f);
  6.         //        dos.writeUTF("中国");
  7.                 dos.writeChars("中国");
  8.         }
  9. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
admin + 1 顶上去,让人给你回

查看全部评分

4 个回复

倒序浏览
黑马网友  发表于 2011-8-1 14:31:01
沙发
看来,最近来回帖的是越来越少了,好几个问题都还是没弄明白:(

评分

参与人数 1技术分 +1 收起 理由
admin + 1 别灰心! 加分鼓励

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-3 16:06:18
藤椅
有谁能帮张晴同学解决这个问题?   有分哦!
回复 使用道具 举报
黑马网友  发表于 2011-8-3 17:19:49
板凳
writeChars
public final void writeChars(String s)
                      throws IOException
Writes a string to the underlying output stream as a sequence of characters. Each character is written to the data output stream as if by the writeChar method. If no exception is thrown, the counter written is incremented by twice the length of s.

Specified by:
writeChars in interface DataOutput
Parameters:
s - a String value to be written.
Throws:
IOException - if an I/O error occurs.
See Also:
writeChar(int), FilterOutputStream.out

上面是jdk文档中对writeChars的解释其中提到“Each character is written to the data output stream as if by the writeChar method ”,即 每个字符同方法writeChar一样被写入数据输出流,所以应该查看方法writeChar。
下面来看jdk文档中对writeChar的说明
writeChar
public final void writeChar(int v)
                     throws IOException
Writes a char to the underlying output stream as a 2-byte value, high byte first. If no exception is thrown, the counter written is incremented by 2.

Specified by:
writeChar in interface DataOutput
Parameters:
v - a char value to be written.
Throws:
IOException - if an I/O error occurs.
See Also:
FilterOutputStream.out
其中提到“Writes a char to the underlying output stream as a 2-byte value, high byte first”,即将一个字符以高位字节优先的双字节(big endian)的形式写入下面的输出流。
BIG ENDIAN:最低位地址存放高位字节,可称高位优先,内存从最低地址开始按顺序存放(高数位数字先写)。最高位字节放最前面。   
LITTLE ENDIAN:最低位地址存放低位字节,可称低位优先,内存从最低地址开始按顺序存放(低数位数字先写)。最低位字节放最前面。
希望我的 回答对你有帮助。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-3 18:27:23
报纸
如果单是写入String,还是不要[color=red]直接[/color]用outputStream类的好,有专门的Writer类就是处理这些文字保存格式问题的。
若非要用的话,一定要考虑好二进制存贮顺序的问题,如LS所说。

另外LZ用的DataOutputStream,而Data应该不是针对字符创建的类的,(Data数据应该是不想让人看的东西的吧),so……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马