黑马程序员---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:要操作的文件不存在,会自动创建,如果存在则不会被覆盖。
编码解码:
编码:字符串变成字节数组;解码:字节数组变成字符串
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:要操作的文件不存在,会自动创建,如果存在则不会被覆盖。
相关文章推荐
- 黑马程序员——Java基础---IO(二)---对象流、管道流、RandomAccessFile、数据流、数组流、字符编码
- 黑马程序员---2015.6.26java基础笔记--File类--Properties--PrintStream--SequenceInputStream--RandomAccessFile
- 黑马程序员_Java第21天知识总结对象流_管道流_RandomAccessFile_数据流_字节数组流
- day21对象流。管道流。RandomAccessFile。DataStream。字节流。常见的编码表。编码解码。联通问题。
- 黑马程序员--javaIO 之RandomAccessFile
- 【java编程】IO特殊类之RandomAccessFile实现多线程文件下载
- 黑马程序员----浅谈RandomAccessFile格式化数据问题和多个对象序列化存取的两个方法
- Java RandomAccessFile用法
- Java IO的RandomAccessFile的使用
- Java RandomAccessFile随机访问类
- Java--使用多线程下载,断点续传技术原理(RandomAccessFile)
- Java IO体系之强大的RandomAccessFile
- Java RandomAccessFile用法
- Java RandomAccessFile用法
- Java之RandomAccessFile(随机访问文件)
- java IO RandomAccessFile的写入和随机读取
- IO_文件分割与合并_RandomAccessFile_初始化参数_SequenceInputStreamJAVA164-167
- Java RandomAccessFile用法
- Java RandomAccessFile用法
- Java RandomAccessFile