I / O 流
流是一个对象,是JVM与外部用来传递数据的
I / O编程步骤:
- 创建节点流
- 封装过滤流
- 读写数据
- 关闭流
有三个分类:
a.按数据方向:输入流、输出流
b.按数据单位:字节流、字符流
字节流:以字节为单位,可以处理一切数据
字符流:以字符为单位,只能处理文本数据
c.按流的功能:节点流、过滤流
节点流:实际传输数据的流
过滤流:给节点类怎去功能
字节流
字节流父类:InputStream(相对JVM,从外部读到JVM) /OutputStream
文件字节流(节点流):FileInputStream/FileOutputStream
①文件输出流:FileOutputStream
常见的方法:
write(int a);写出一个字符到文件里,例如写A:write(65);
write(byte[] b); 写出字节数组到文件
write(byte[] b, int startIndex, int length); 写出固定长度字节数组到文件
close(); 关闭流
使用方法:
OutputStream os = new FileOutputStream(“D:/test.txt”, true);//第二个参数是否追加,不追加则覆盖原有文件
os.write(65);
②文件输入流:FileInputStream
常见的方法: 返回-1结束
int read(int a); 从文件读入一个字符到JVM,
int read(byte[] b); 从文件读入字节数组
int read(byte[] b, int startIndex, int length); 从文件读入固定长度字节数组到
使用方法:
InputStream os = new FileInputStream(“D:/test.txt”);//第二个参数是是否追加,若不追加则覆盖原有文件
System.out.prinltn((char)os.read());
--------------------------------------------------------
数据流:DataOutputStream/DataInputStream 向文件写、读八种基本类型数据和String
常见方法:
writeUTF(); 写出字符串类型
writeLong(); 写长整型
writeDouble(); 写double类型
readUTF(); 读入字符串类型
readLong(); 读长整型
readDouble(); 读double类型
用法:InputStream is = new FileInputStream(“D: est.txt”); //创建节点流
DataInputStream dis = new DataInputStream(is); //将节点流封装为数据流
dis.readLong(); //读文件中的长整型数据
dis.close();
--------------------------------------------------------
I / O 增加缓冲区:BufferedInputStream、BufferedOutputStream
最后一步是清空缓冲区(flush)
用法:FileOutputStream fos = new FileOutputStream(“D: est.txt”);
BufferedOutputStream bos = enw BufferedOutputStream(fos);//增加缓冲区
bos.write(‘A’);
bos.flush(); //清空缓冲区,将数据写到文件里
--------------------------------------------------------
多层包装:
FileOutputStream fos = new FileOutputStream(“D: est.txt”);
BufferedOutputStream bos = enw BufferedOutputStream(fos);//增加缓冲区
DataOutputStream dos = new DataOutputStream(bos); //增加过滤
PrintStream既有缓冲,又有过滤,例如常见的System.out
可以写八种基本类型
--------------------------------------------------------
管道流:PipedInputStream / PipedOutputStream 用来在线程间进行数据交换
RandomAccessFile:随机访问文件
字符流
编解码问题:由于字符的编码与解码方式不统一,可能造成乱码
String str = “abc”;
byte[] b = str.getBytes(“GBK”); //以GBK编码方式转化
String s = new String(b, “GBK”); //再以GBK编码方式接受
乱码问题解决:如果编码和解码方式不统一,可在一次用错误的顺序从小编解码
---------------------------------------------------------
字符流:Reader / Writer (处理文本)
文件字符流:FileReader / FileWriter
FileReader fr = new FileReader(“D: est.txt”, true);
字符缓冲流:BufferedReader / BufferedWriter (一般在写字符串是用PrintWriter )
需要清空缓存flush;
桥转换:InputStreamReader / OutputStreamWriter
实现字节流与字符流的转换
FileOutputStream fos = new FileOutputStream(“D: est.txt”);
Writer s = new OutputStreamWriter(fos, “GBK”); //将字节流转换为字符流
BufferedWriter bw = new BufferedWriter(w);//添加缓冲区
或
PrintWriter pw = new PrintWriter(“文件路径”); //****与上面的三行代码的功能类似,比较简便
pw.println(“asdg”); //写出一行
对象的序列化
将对象通过流进行传递
ObjectOutputStream / ObjectInputStream
只用实现了Serializable 接口的对象才能进行序列化,并且也需要其对象属性也实现该接口
用transient修饰的属性为临时属性,不会参与对象的序列化
用法:
class Student implements Serializable {假设里面有四个属性和其他方法}
main函数中:
Student s = new Student(“jiang”, 23, “男”, 14823412344);
OutputStream os = new FileOutputStream(“D: est.txt”);
FileWriter fw = new OutputStreamWriter(os, “GBK”);
ObjectOutputStream oos = new ObjectOutputStream(fw);
oos.writeObject(s); /将对象写出到文件内;
对象序列化扩展、对象的克隆(clone)
对象序列化扩展:
对象序列化-版本号作用: public static final long serialVersionUID = 666L;
1.为了类的变化后,在对象的的序列化(存对象)和反序列化(读对象,先加载类)时,尽可能的不影响其结果,可以为类添加SerialVersionUID私有静态长整型的常量。控制类的版本号,当类的版本号修改时,意味着之前的序列化数据全部作废
2.当反序列化一个类对象时,如果这个类实现了Serializable接口,那么可以直接还原对象,如果这个类没有实现Serializable(这个类必是父类),那么就需要其调用构造方法
对象的克隆:
即对象的复制:在内存中复制出一个内容完全相同的对象,调用Object类中clone()方法,返回Object对象
1.覆盖clone()方法:clone是受保护的,复写时应将其修饰符提高到public
2.需要被克隆的类必须实现Cloneable接口(标记接口),
浅拷贝:Object.clone();
深拷贝:对象复制过程中,对象的属性如果又是对象,则递归的进行复制;实现深拷贝,利用对象序列化自定义克隆方法时,可以不实现Cloneable
接口
使用ByteArrayOutputStream将对象写入字节数组,再利用ByteArrayInputStream将对象读回,此方法在内存中操作,很快
Commso – io.jar 工具包
jar引入项目:右键对jar包BuildPath 再点击Add to BuildPath
类:
FileUtils
方法:
(static) copyFile(scrFile, destFile); //参数为路径 复制文件