Topic: java读二进制字符串问题.

  Print this page

1.java读二进制字符串问题. Copy to clipboard
Posted by: ytfinst
Posted on: 2007-04-10 16:36

最近学io包,碰到一个问题 .请各位达人帮忙解决下:
DataOutputSteam中有一个方法writeChars()可以写入字符串,问题是写进
去,变成二进制之后怎么将这个字符串读取出来呢,DataInputStream类里面
有一个过时的方法,里面推荐用BufferedReader类里面的方法去取字符串,本
人菜鸟一个.不会用啊.望高手解决.
原题是: DataOutputSteam dos=new DataOutputSteam("aa.txt");
dos.writeChars("这是一个字符串");
怎么将它取出来呢?

2.Re:java读二进制字符串问题. [Re: ytfinst] Copy to clipboard
Posted by: xuxiaolei
Posted on: 2007-04-10 20:05

DataOutputStream中的writeChars()方法写到文件中的是二进制格式,要是直接用下面的语句
FileOutputStream fileOutput = new FileOutputStream("c:\\file.txt");
   DataOutputStream dataOutput = new DataOutputStream(fileOutput);
   dataOutput.writeChars("abc");
   dataOutput.close();
   fileOutput.close();
  
   FileInputStream fileInput = new FileInputStream("c:\\file.txt");
  
   InputStreamReader reader = new InputStreamReader(fileInput);
   BufferedReader buffer = new BufferedReader(reader);
   String line = buffer.readLine();
   System.out.println(line);
  
   buffer.close();
   reader.close();
   fileInput.close();

读的话得到的结果,如图片所示

3.Re:java读二进制字符串问题. [Re: ytfinst] Copy to clipboard
Posted by: xuxiaolei
Posted on: 2007-04-10 20:11

但是,要是直接用BufferedReader直接读文本格式的文件,就不会有上面的问题
还有就是用下面的语句读DataOutputStream中的writeChars()产生的文件在单个字符是正常的
RandomAccessFile file = new RandomAccessFile("c:\\file.txt", "r");
System.out.println(file.readChar());
难道读二进制格式的文件,要自己写读一行字符串的方法,等待高手解答啊

4.Re:java读二进制字符串问题. [Re: ytfinst] Copy to clipboard
Posted by: JiafanZhou
Posted on: 2007-04-10 22:00

这个问题我以前也经历过,不要怕,先来看看DataOutputStream.writeChars()的原代码

public final void writeChars(String s) throws IOException {
int len = s.length();
for (int i = 0 ; i < len ; i++) {
int v = s.charAt (i);
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
}
incCount(len * 2);
}

The '>>>' shifts a zero into the leftmost position, while '>>' depends on sign extension.因为 Java是用Unicode来表述一个char的,所以要用2个字节,(ASCII用一个字节) 所以长度也要*2。
1) 用BufferedReader.readLine()读一行文件,就会打出第一个空char.
2) RandomAccessFile.readChar()读两个字节,相当与一个char,就没有问题。

while (true)
{
int ch1 = buffer.read();
int ch2 = buffer.read();

if (ch1 == -1 || ch2 == -1)
{
break;
}
char newChar = (char)((ch1 << 8) + (ch2 << 0));

System.out.print(newChar);
}


Consider about the above code.

Cheers,
Jiafan

5.Re:java读二进制字符串问题. [Re: ytfinst] Copy to clipboard
Posted by: ytfinst
Posted on: 2007-04-10 23:27

楼上很强啊,谢谢.已经搞定.

6.Re:java读二进制字符串问题. [Re: ytfinst] Copy to clipboard
Posted by: xuxiaolei
Posted on: 2007-04-11 13:04

谢谢HenryShanley 的指导,有空也要看看源代码了


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923