p612-637
IO流
IO流原理及流的分类
Java lO流原理
1.I/O是Input/Output的缩弓,IV/O技术是非常实用的技术,用于处理数据传输。
如读/写文件,网络通讯等。
2. Java程序中,对于数据的输入/输出操作以”流(stream)”的方式进行。
3. java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过方
法输入或输出数据
字节流:二进制文件
字符流:文本文件
Java的IO流共涉及40多个类,心儿都碎了
字节流
lnputStream:字节输入流
lnputStream抽象类是所有类字节输入流的超类lnputStream常用的子类
1.FilelnputStream:文件输入流
2.BufferedInputStream:缓冲字节输入流
3.ObjectInputStream:对象字节输入流
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Day31 {
public static void main(String[] args) {
new Day31().read1();
}
FileInputStream fileInputStream = null;
public void read1(){
String filePath = "e:\\JAVA\\Ioliu\\day31.txt";
int readData = 0;
try {
fileInputStream = new FileInputStream(filePath);
while((readData = fileInputStream.read())!=-1){
//这里汉字乱码了。它按照一个一个字节读取的,而UTF-的格式汉字是3个字节
这里推荐用字符流。目前这种是一个一个字节读,效率比较低。
System.out.println((char)readData);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//一定要关闭流,不然浪费资源。
System.out.println("结束");
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
OutputStream:字节输出流
public void writeFile(){ //创建输出流 String filePath = "D:\\madake\\mdk1.txt"; FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(filePath, true);//如果不写这个true就会覆盖 //写入一个字节 // fileOutputStream.write('m'); //写入字符串 String str = "aaaahello!"; // fileOutputStream.write(str.getBytes());//方法1 fileOutputStream.write(str.getBytes(),0,str.length());//方法2:0是起始位置,后面的长度是你要写入的长度 } catch (IOException e) { e.printStackTrace(); }finally { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
文件拷贝
边读编写,使用循环。
buf等使用。
字符流
FileReader和 FileWriter是字符流,即按照字符来操作io
FileReader相关方法:
1) new FileReader(File/String)
2) read:每次读取单个字符,返回该字符,如果到文件末尾返回-1
3) read(char):批量读取多个字符到数组,返回读取到的字符数,如果读到文件末尾返回-1
相关APl:
1) new String(char门:将char[]转换成String
2) new String(char[.off,len):将char[的指定部分转换成String
FileWriter常用方法
FileWriter常用方法
1) new FileWriter(File/String):覆盖模式,相当于流的指针在首端
2) new FileWriter(File/String,true):追加模式,相当于流的指针在尾端.
3) write(int):写入单个字符
4) write(char[]):写入指定数组
5) write(char[].off,len):写入指定数组的指定部分
6) write (string):写入整个字符串
7)write(string.off,len):写入字符串的指定部分
相关APl: String类:toCharArray:将String转换成char[注意:
FileWriter使用后,必须要关闭(close)或刷新(flush),否则写入不到指定的文件!
节点流和处理流
节点流和处理流的区别和联系
1.节点流是底层流/低级流,直接跟数据源相接。
2.处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
3.处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连[模拟修饰器设计模式]
处理流的功能主要体现在以下两个方面:
1.性能的提高:主要以增加缓冲的方式来提高输入输出的效率。
2操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便
对象流
●对象流-ObjectlnputStream和ObjectOutputStream
>看一个需求
1.将int num = 100这个int数据保存到文件中,注意不是100数字,而是int 100,并且,能够从文件中直接限复int 100
2将Dog dog = new Dog(“小黄”,3)这个dog对象保存到文件中,并且能够从文件恢复.·
3.上面的要求,就是能够将基本数据类型或者对象进行序列化和反序列化操作
>序列化和反序列化
1.序列化就是在保存数据时,保存数据的值和数据类型
2反序列化就是在恢复数据时,恢复数据的值和数据类型,注:反序列化的顺序需要和序列化的顺序一致。
3.需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该
类必须实现如下两个接口之一:
>Serializable 这是一个标记接口,里面没有任何方法
>Externalizable 里面有方法需要实现,一般推荐上面的
不同包下的类导入、修改序列化的类问题:0630_韩顺平Java_ObjectInputStream_哔哩哔哩_bilibili
一些处理流
节点流和处理流
>注意事项和细节说明
1)读写顺序要一致
2)要求实现序列化或反序列化对象,需要实现 Serializable
3)序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性:当你修改这个类的时候,只会觉得是版本的修改,而不是全新的类。
4)序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
5)序列化对象时,要求里面属性的类型也需要实现序列化接口
6)序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化
打印流: