您的位置:首页 > 职场人生

黑马程序员---Java 编码解码的案例及特殊类RandomAccessFile

2015-04-22 09:18 309 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

编码解码: 

编码:字符串变成字节数组;解码:字节数组变成字符串

Stringàbyte[]:str.getByte(charsetName);

byte[]àString:   new String(byte[],charsetName);

备注:charsetName可以省略,省略的时候表示使用平台的类型编码

import java.io.*;

 

/*

 * DataInputStream与DataOutputStream

 * 可以用于操作基本数据类型的数据的流对象。

 * */

public
class
DataStreamDemo {

 

     public
static void
main(String[] args)
throws IOException {

           // TODO Auto-generatedmethod stub

           writeData();

           readData();

 

     }

    

     public
static void
readData()
throws
IOException{

           DataInputStreamdis = new DataInputStream (new FileInputStream("C:\\data.txt"));

           int i = dis.readInt();

           boolean b =dis.readBoolean();

           double d =dis.readDouble();

           dis.close();

           System.out.println("i="+i);

           System.out.println("b="+b);

           System.out.println("d="+d);

     }

    

     public
static void
writeData()
throws
IOException{

           DataOutputStreamdos = new DataOutputStream(new FileOutputStream("C:\\data.txt"));

           dos.writeInt(1);

           dos.writeBoolean(true);

           dos.writeDouble(98.21);

          

           dos.close();

          

     }

 

}

这个代码是个正常运行的代码,DataOutputStream类有write(int b)方法和writeInt()方法,两个方法都是针对写入int类型的数字,与之相对应DataInputStream类有read():int – FilterInputStream方法和readInt()方法,这两个方法也是针对int类型的读操作,那么问题就来了,这两个方法有什么区别呢?能不能串着用呢?串着用会有什么样的结果呢?

1.两者的区别:

write(int b)是 将指定字节(参数 b 的八个低位)写入基础输出流。而writeInt()是将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。同样的read():int – FilterInputStream也是可以处理int类型的,readInt()是读取四个输入字节并返回一个 int 值。

2. 能不能串着用呢?串着用会有什么样的结果呢?

                还是以上面的程序为案例,我尝试着串着用,编译运行肯定不会有错,但结果却不一定。①写入用dos.writeInt(1),读取用int i = dis.read(),没问题,可以正常的输出正确的结果。②写入用dos.write(1),读取用int i = dis.readInt(),这时编译不会出错,但运行时就会报java.io.EOFException异常,说明在读取所有字节之前已经到达末尾了

RandomAccessFile类:

这是一个特殊类,它的实例支持对随机访问文件的读取和写入,是IO包中的成员,但它既不是inputStream()的子类也不是outputStream()的子类,它直接继承自object类。内部封装了一个数组,而且可以通过指针对数组进行操作,可以通过getFilePointer()获取指针位置,同时可以通过seek()改变指针的位置。它的读写原理就是内部封装了字节输入流和字节输出流。通过构造函数可以看出,该类只能操作文件,而且操作文件还有模式:只读-r,读写-rw等。

如果模式为只读r:不会创建文件,会去读取一个已存在的文件,如果该文件不存在就会出现异常

如果模式是rw:要操作的文件不存在,会自动创建,如果存在则不会被覆盖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息