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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴振良 黑马帝   /  2012-3-30 21:36  /  2511 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴振良 于 2012-3-30 21:53 编辑

import java.io.RandomAccessFile;
public class Test
{        
        public static void main(String[] args) throws Exception
        {
                RandomAccessFile rdf = new RandomAccessFile("abc.txt","rw");
                rdf.write(255);
                rdf.close();
               
                RandomAccessFile rd = new RandomAccessFile("abc.txt","rw");
                System.out.println(rd.read());
        }
}


write( int b)方法,向此文件写入指定的字节
这个方法我不太理解,1个字节能表示的最大数是255,read()方法是读取一个字节,所以write(255)的时候read()是能正确读出255的,如果write(256)则read()读出来的是0,这也说明了我write(int b)这个方法里如果给的参数是0-255的话,就是写入了一个字节,但如果我给的参数是256的话,那是写入了几个字节呀?该用什么方法把它正确的读出来呀?

4 个回复

倒序浏览
本帖最后由 戴振良 于 2012-3-31 00:12 编辑
yocean 发表于 2012-3-30 22:07
这个类实现了 DataOutput接口,其中的write方法就是实现自这个接口,接口中的write(int b)方法是这 ...


也就是说,不管write方法的参数给任何的int 数据都只写入一个字节,是吧{:soso__8961432591078930798_3:}
回复 使用道具 举报
本帖最后由 了无尘 于 2012-3-31 01:13 编辑

如果是256你需要把它转换成字节,即写进去2个字节,一般的包装流之类的都是这么干的,只不过他们内部都有不同解码方式
  1. 256
  2. 00000000 00000000 00000001 00000000
复制代码
  1. import java.io.IOException;
  2. import java.io.RandomAccessFile;
  3. public class Test
  4. {        
  5.         public static void main(String[] args) throws Exception
  6.         {
  7.                 RandomAccessFile rdf = new RandomAccessFile("abc.txt","rw");
  8.                 writeInt(rdf, 256);
  9.                 rdf.close();
  10.                
  11.                 RandomAccessFile rd = new RandomAccessFile("abc.txt","rw");
  12.                 byte[] bytes = new byte[]{(byte)rd.read(),(byte)rd.read(),(byte)rd.read(),(byte)rd.read()};
  13.                System.out.println(readInt(rdf, bytes));
  14.                System.out.print(byteToBin(bytes[0]));
  15.                System.out.print(byteToBin(bytes[1]));
  16.                System.out.print(byteToBin(bytes[2]));
  17.                System.out.println(byteToBin(bytes[3]));
  18.         }
  19.         
  20.         public static void writeInt(RandomAccessFile rdf,int i) throws IOException
  21.         {
  22.                 byte[] bytes = new byte[]{
  23.                                 (byte) (i>>24),
  24.                                 (byte) ((i>>16) & 0xff),
  25.                                 (byte) ((i>>8) & 0xff),
  26.                                 (byte) (i & 0xff)
  27.                 };
  28.                
  29.                 for (byte b : bytes)
  30.                         {
  31.                         rdf.write(b);
  32.                         }
  33.         }
  34.         
  35.         public static String byteToBin(byte b)
  36.         {
  37.                 StringBuffer sb = new StringBuffer();
  38.                 byte t = b;
  39.                 for(int i = 0; i < 8; i++, t=(byte)(t>>1))
  40.                 {
  41.                         sb.append(t%2);
  42.                 }
  43.                 return sb.reverse().toString() + " ";
  44.         }
  45.         
  46.         public static int readInt(RandomAccessFile rdf,byte[] bytes)
  47.         {
  48.                 return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
  49.         }
  50. }
复制代码
回复 使用道具 举报
RandomAccessFile还提供writerShort(),writerInt(),writerLong()方法。
writerShort()占用两个字节。
writerInt()占用四个字节。
writerLong()占用八个字节。
超过一个字节的读取建议用readLine()方法读取。
RandomAccessFile存储文件是以大型byte数组形式存储,也就是字节流。如果楼组只想传递一个数字参数信息而不是字节流信息那么建议用wretierBytes()方法以字符串形式写入。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马