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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 还是回去火星吧 中级黑马   /  2014-3-4 17:08  /  1597 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 还是回去火星吧 于 2014-3-4 17:14 编辑


import java.io.*;
class Test{
public static void main(String[] args)throws Exception{
  writeData();
  readData();
}
//用基本数据类型写入。
public static void writeData(){
  DataOutputStream dos=null;
  try {           
   dos=new DataOutputStream(new FileOutputStream("E:\\DD\\c.txt"));
//   dos.write("李明".getBytes());这里用这个方法写入,读取的时候,我用什么数据类型读取?
   dos.writeInt(123);
   dos.writeDouble(11.22);
   dos.close();
  } catch (Exception e) {
   throw new RuntimeException("写入异常");
  }
}//用基本数据类型读取
public static void readData(){
  DataInputStream dos=null;
  try {
   dos=new DataInputStream(new FileInputStream("E:\\DD\\c.txt"));
   //注意,读取时,一定要注意写入的顺序类型,要么读取会错误。
//   dos.close();
   System.out.println(dos.readInt());
   System.out.println(dos.readDouble());
   dos.close();
   
  } catch (Exception e) {
   throw new RuntimeException("读取异常");
  }
}
}

评分

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

查看全部评分

4 个回复

正序浏览
write方法有多种写数据方式,其中write(char[] c)是一种效率比较高的,因为一次可以写多个字符,同时读取的时候为了保持一致,read方法也有read(char[] c),用来一次读取多个字符,不过有一点要注意的是,char[] c数组的长度在定义完后一般是不变的,而你读取或者写入的数据可能最后小于数组的长度,此时如果打印的话会将上次存在字符数组里的个别数据保存并打印下来看,下面可以说明这一点
fr = new FileReader("demo.txt");//demo.txt中的数据为:“abcdefg”
char [] buf = new char[3];
int num = 0;
while(fr.read(buf) != -1) {
     System.out.println(new String(buf));
}
因为demo.txt文件中的字符串长度为7,buf的长度为3
所以读三次,就可以将demo.txt中的数据完全读出来
当你查看结果时,会发现,最后一行输出的是gde,而不是预期的g
这是因为在读取的字符在buf中是从左往右存的,第二次读取完后
buf中的为:def
第三次读:会将g写入第一个位置,接着没有数据了,退出循环
所以第三次读完buf中的数据为:gef
处理的方法为:只打印读取到的字符
int num = 0;
//num中存放的是读取的字符数
while((num=fr.read(buf)) != -1) {
          //String(char[], 0, num)意思是将char[]里面下标从0到num的字符结合成字符串
        System.out.print(new String(buf, 0, num));
}
希望能解决你的问题

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
其实这个问题涉及到两方面了,
1.流的读取问题
2.字符的转换问题

根据你的提问:在用这个方法 dos.write("李明".getBytes());写入到流后,怎么读取出来
解决如下:
在写入的时候:byte[] buf = "李明".getBytes();
然后定义一个成员变量len
给len赋值:len = buf.length;

在读取的时候有好几种方法:
方案一
byte[] buf = new byte[1024];
dos.read(buf, 0, len);

这就读完完了,但这时候你会发现,
System.out.println(buf.toString());
是一堆乱码,没错吧,(我估计你问的其实就是这个)
其实这是因为toString()方法只是把数组的内容转换成字符串输出了,注意,是字符串,不是汉字
所以你需要下面这一步
String str = new String(buf);
System.out.println(str);
这之后你才能看到控制台里打印了“李明”两个字

方案二:
很明显,两个汉字转化成字节,那就是4个字节
所以你在读取的时候
调用4次 dos.readByte();就行了
当然,如果你需要在控制台看到汉字,还是要安装一的处理步骤
但如果你想把c.txt文件Copy到另一个文件,比如d.txt
就直接可以用读取到的字节来输出了,系统通过编码字符集,会自动转换的

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
通过DataInputStream中的read(byte[] b) 或者 read(byte[] b, int off, int len) 读出到byte[] 数组中,具体的话,还要确定一下长度的吧

评分

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

查看全部评分

回复 使用道具 举报
这个应该就要牵扯到一个文件中数据结构定义的问题,实际应用中应该是这样的,像这种写字符串不定长时就要规定前边几个字节来代表后边字符串的长度,读取时先读取字符串的长度,再根据长度读取相应的字节出来就不会有你上边提到的问题了。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马