黑马程序员技术交流社区

标题: writeChars问题 [打印本页]

作者: 张晴    时间: 2011-8-1 13:55
标题: writeChars问题
通过下面的程序,我往记事本 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. }
复制代码

作者: 匿名    时间: 2011-8-1 14:31
看来,最近来回帖的是越来越少了,好几个问题都还是没弄明白:(
作者: 匿名    时间: 2011-8-3 16:06
有谁能帮张晴同学解决这个问题?   有分哦!
作者: 匿名    时间: 2011-8-3 17:19
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:最低位地址存放低位字节,可称低位优先,内存从最低地址开始按顺序存放(低数位数字先写)。最低位字节放最前面。
希望我的 回答对你有帮助。
作者: 匿名    时间: 2011-8-3 18:27
如果单是写入String,还是不要[color=red]直接[/color]用outputStream类的好,有专门的Writer类就是处理这些文字保存格式问题的。
若非要用的话,一定要考虑好二进制存贮顺序的问题,如LS所说。

另外LZ用的DataOutputStream,而Data应该不是针对字符创建的类的,(Data数据应该是不想让人看的东西的吧),so……




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2