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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© a6511631 高级黑马   /  2014-7-18 16:21  /  1626 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 a6511631 于 2014-7-18 16:26 编辑

在毕老师的基础视频中关于IO流的部分,有专门介绍这个RandAccessFile对象的片段,并写了一个这样的例子。
附上代码:
  1. import java.io.*;


  2. public class RandromAccessFileDemo {


  3.         public static void main(String[] args) throws IOException {
  4.                 // TODO Auto-generated method stub
  5.                 File f = new File("./Rand.txt");
  6.                 writeFile2(f);
  7.                 readFile(f);
  8.         }
  9.         public static void readFile(File f)throws IOException{
  10.                 RandomAccessFile raf = new RandomAccessFile(f,"r");
  11.                 raf.seek(8);
  12.                 raf.skipBytes(8);
  13.                 byte[] buf = new byte[4];
  14.                
  15.                 while((raf.read(buf))!=-1){
  16.                         
  17.                         //将4个字节从raf中读出来存进buf
  18.                         String name= new String(buf);
  19.                         System.out.println("name="+name);
  20.                         int age = raf.readInt();                //就是读4个字节出来转换为Int
  21.                         System.out.println("age="+age);
  22.                 }
  23.                 raf.close();
  24.         }
  25.         public static void writeFile(File f) throws IOException{
  26.                 RandomAccessFile raf = new RandomAccessFile(f,"rw");
  27.                 raf.writeBytes("lisi");
  28.                 raf.writeInt(13);
  29.                 raf.close();
  30.         }
  31.         public static void writeFile2(File f) throws IOException{
  32.                 RandomAccessFile raf = new RandomAccessFile(f,"rw");
  33.                 raf.write("lisi".getBytes());
  34.                 raf.writeInt(13);
  35.                 raf.write("zhao".getBytes());
  36.                 raf.writeInt(18);
  37.                 raf.write("wang".getBytes());        //如果这里字符串长度不是4个字节,会报错
  38.                 raf.writeInt(20);
  39.                 raf.close();
  40.         }
  41. }
复制代码

疑问是这样的代码示例中是这样写入的:raf.write("lisi".getBytes());但是当我这样写入时:raf.write("zhangsan".getBytes());
如果写入流在写入时,不能保证都是四个字节的字符串的话,就会输出乱码并且抛出异常。
如果将需求设为:写入时,字符串长度在8个字节内波动,那么该如何实现?
比如有个人不叫"lisi",叫"zhangsan",那要怎么才读得出来呢?

4 个回复

倒序浏览
来位大神解救下啊
回复 使用道具 举报
这个问题在毕老师的视频中提过,好像说的比较轻松写意,不会太让人注意。

想要写入时字符串长度在8个内波动,俺实现不了。其实上这样毫无意义,为么一定要在8个内波动,毕老师只是作了个例子而已,10个字节,20个字节都行。

如果叫“zhangsan”,想要读出来,那seek后,想要读出来就不太可能了。除非不是8,还是那句,谁说一定要8了……
回复 使用道具 举报
wisely 发表于 2014-7-18 18:07
这个问题在毕老师的视频中提过,好像说的比较轻松写意,不会太让人注意。

想要写入时字符串长度在8个内波 ...

raf.seek(8);随手写的试验一下seek方法而已,可以删去。我的意思是,这个RandomAccessFile对象,它对数据的要求太高了,要求数据非常规律,觉得应该还需要什么技巧才能更好的使用吧。8个内波动只是举个例子,只是想将需求改为想要写入时字符串长度在一定的范围内波动而已。
回复 使用道具 举报
a6511631 发表于 2014-7-19 10:36
raf.seek(8);随手写的试验一下seek方法而已,可以删去。我的意思是,这个RandomAccessFile对象,它对数据 ...

这个类与多线程结合在一起,创建多个线程,开启多线程下载。

按照俺的意思,API里面的类不可能是万金油和大力丸,什么都干。能把多线程下载做好,这就是很不错了吧。

俺也初学,多多交流。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马