开始时间 2018年8月10日20:49:01
结束时间 2018年8月10日21:53:42
知识点补充:
一:IO
SequenceInputStream: 序列流:
作用: 实现文件的合并。
实现了文件的切割。
序列化流: 将对象的信息以二进制的形式保存在外部的文件当中。 .obj ObjectOutputStream: writerObject(Object obj);
反序列化: 将二进制信息从外部的文件读取到内存当中。 ObjectInputStream : readObject(); 返回的是Object类型。
打印流:
PrintStream: 字节打印流:
构造器: File
String fileName
OutputStream out
PrintWriter: 字符打印流
File
String fileName
OutputStream out
Writer w
二: RandomAccessFile 随机访问文件的流:
特点:
(1)没有直接继承IO的类。 而是直接继承了Object类。
(2)对象能够实现文件的读取和写入。
(3)对象的内部封装了一个大的字节数组。 通过指针的移动来实现文件的读取和写入。
(4)创建对象的时候,必须指定一个模式。
模式: r 只读模式,不能写,否则抛出IOException;
模式: rw 读写模式, 如果文件不存在,创建文件。
指定的文件存在,那么会追加写,不会覆盖写。
(5) getFilePointer 获得文件的指针。
seek 设置指针的位置。
三: DataOutputStream 和 DataInputStream 流:
特点: 操作基本数据类型。
构造器: new DataOutputStream(OutputStream out); 流不能操作文件。
new DataInputStream(InputStream in);
API方法:
DataOutputStream 写的方法:
writeInt(32); //四个字节:
writeBoolean(true); //一个字节。
writeDouble(3.0); // 八个字节。
DataInputStream 读的方法:
int readInt = dis.readInt();
boolean readBoolean = dis.readBoolean();
double readDouble = dis.readDouble();
四: ByteArrayOutputStream 和 ByteArrayInputStream
1:
ByteArrayOutputStream 字节数组输出流。
特点: (1)内部封装了一个字节数组。 内部的数组自动扩容。
(2)toByteArray() 和 toString() 获取内部数组的数据。
(3)对象和底层的文件没有直接关联,关闭无效。
构造器:
new ByteArrayOutputStream(); 对象的输出目的是: 对象内部的一个字节数组。
API:方法:
writeTo(OutputStream out); 可以将内部数组当中的内容写出到外部的文件当中。
toByteArray(); 获得对象内部数组的内容。
toString(); 获得对象内部数组的内容。
2: ByteArrayInputStream 字节数组输入流:
特点: 内部也是封装了一个字节数组。
将读取的数据读到了内部的数组当中。
对象和底层的文件没有直接关联,关闭无效。
构造器: new ByteArrayInputStream(byte [] buf); 来源是一个byte数组。
RandomAccessFile 随机访问文件的流
https://blog.csdn.net/zhou920786312/article/details/69371073补充
package 面向对象;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class TestRandomAccessFile {
public static void main(String[] args) throws IOException {
RandomAccessFile inout=new RandomAccessFile("E:/Workspaces/MyEclipse 10/yidong/src/面向对象/a.txt","rw" );
inout.setLength(0);
for (int i = 0; i < 200; i++) {
inout.write(i);
}
System.out.println("current file length is"+inout.length());
inout.seek(0);
System.out.println("first"+inout.length());
inout.seek(1*4);
System.out.println("2 "+inout.readInt());
inout.seek(2*4);
System.out.println("3 "+inout.readInt());
inout.seek(3*4);
System.out.println("4 "+inout.readInt());
inout.seek(4*4);
System.out.println("5 "+inout.readInt());
inout.writeInt(555);
inout.seek(inout.length());
inout.writeInt(999);
System.out.println("the new length is "+inout.readInt());
inout.seek(10*4);
System.out.println("the eleventh number is "+inout.readInt());
inout.close();
}
}
readint 一次读取四个字节
下面的方法实现了文件的随机读和写
//实现文件的读取, 和随机读取。
public static void readFile() throws IOException{
//创建对象:
RandomAccessFile raf= new RandomAccessFile("C:/Users/Mrzhang/javaEE/javaSE-07/javaSE-36/random.txt", "r");
// raf.write(32);// 如果指定的模式为只读模式,那么调用writer方法,就会出现异常。 IOException。
// raf.read();// 读取汉字的一半。
// 一次读取四个字节,可以将李四读取出来
/*byte buf[]= new byte[4];
int num = raf.read(buf);
System.out.println(new String(buf));
//读取年龄:
int age= raf.readInt(); //一次读取四个字节。
System.out.println(age);// 256
*/
//可以实现文件的随机读取: 如果想直接读取王五。
// 设置指针的便宜量:
// raf.skipBytes(8);//忽略前八个字节 不读取,从第九个开始读取。 弊端: 只能往后跳,不能往前跳。
raf.seek(8); // seek方法, 可以随机调整。 实现文件的随机读取;
byte buf[]= new byte[4];
raf.read(buf);
System.out.println(new String(buf));// 读取到了王五。
}
//定义一个功能: 使用随机访问文件的对象实现文件的写。
public static void writeFile() throws IOException{
//创建对象:
RandomAccessFile raf= new RandomAccessFile("C:/Users/Mrzhang/javaEE/javaSE-07/javaSE-36/random.txt", "rw");
//调用对象的方法:
raf.write("李四".getBytes());//姓名
//
//raf.write(97); // writer() 在记事本当中会显示a。 RandomAccessFile内部是一个大的字节数组。 最终写出去的97是一个字节类型。
// 记事本夸奖字节类型转换了字符类型。 writer方法,默认只写最低八位。 相当于一个字节。
// raf.write(256); // 1 0000 0000 256 只被写出去了最低八位。
// raf.writeInt(256); //256写出去四个字节。 从高字节开始写。
//继续写:
raf.write("王五".getBytes());
raf.writeInt(99);
//关闭:
raf.close();
}
DataOutputStream 和 DataInputStream 流:
下面代码实现了用DataOutputStream读写wenjian
package 面向对象;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestRandomAccessFile {
public static void main(String[] args) throws IOException {
DataInputStream dis=new DataInputStream(
new FileInputStream(
new File("E:/Workspaces/MyEclipse 10/yidong/src/面向对象/a.txt")));
int readint=dis.readInt();
System.out.println(readint);
double readdouble=dis.readDouble();
System.out.println(readdouble);
}
public static void write2File() throws IOException
{
DataOutputStream dos=new DataOutputStream(
new FileOutputStream(
new File("E:/Workspaces/MyEclipse 10/yidong/src/面向对象/a.txt")));
dos.writeInt(56);
dos.writeBoolean(true);
dos.writeDouble(3.0D);
dos.close();
}
}
ByteArrayOutputStream 和 ByteArrayInputStream
内存数组输入输出流 和底层硬盘无关 只写入到内存中
如下例
package 面向对象;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestRandomAccessFile {
public static void main(String[] args) throws IOException {
write2File();
}
public static void write2File() throws IOException
{
ByteArrayInputStream bis=new ByteArrayInputStream("bb".getBytes());
ByteArrayOutputStream bos=new ByteArrayOutputStream();
boolean var2=false;
int len;
while((len=bis.read())!=-1)
{
bos.write(len);
}
byte[] byteArray =bos.toByteArray();
System.out.println(new String(byteArray));
String string =bos.toString();
System.out.println(string);
bos.writeTo(new FileOutputStream(
new File("E:/Workspaces/MyEclipse 10/yidong/src/面向对象/sss.txt")));
}
}
2018年8月10日21:52:46于易动
加油 离自己架构师的梦想 又近了一步!!!