IO流
1.概念
-
流:数据传输通道
-
模型:采用Decorator装饰者模式。依照功能可以对流进行分类。
2.分类
-
按数据流方向:
- 输入流
- 输出流
-
按传输类型:
这4种均是抽象流,为所有IO流的超类
- 字节流(用来处理图像,视频,PPT,Word)
- Reader
- Writer
- 字符流(只能处理纯文本)
- InputStream
- OutputStream
字符字节流区别:
-
字节输出流没有缓冲区,直接输出,字符流必须经过缓冲区,正常情况下只有调用close()才会输出,否则需要手动调用flush()才可输出
字节 字符 读写单位 Byte 字符(根据码表映射) 处理对象 视频,图片 纯文本(优先考虑)
- 字节流(用来处理图像,视频,PPT,Word)
-
按功能:
- 节点流:特定节点读取数据的过程
- 处理流:连接和封装一个已存在的流,通过该封装流调用实现数据读写。ep:BufferedReader。处理流的构造方法传入一个流对象作参数。
-
字符流:Java中采用Unicode标准,字符流指基于字节流读取查询对应的Unicode表。
3.特性
- FIFO,先写入的数据也先被读取
- 顺序存取,不可随机访问。(RandomAccessFile可从任意位置访问IO,此类继承自Object)
- 只读/只写,流只有一种功能,传输通道同时存在需要两个流。
4.五类一接口
Java.io包:
-
类
-
File:文件特征与管理,对文件系统中文件以及文件夹进行封装的对象,可通过对象的思想操作文件和文件夹,保存文件或目录的元数据信息,包括文件名,文件大小,最后修改时间,是否可读,获取文件路径,判断文件是否存在,获取当前文件列表,创建/删除文件或目录
-
InputStream
-
OutputStream
-
Reader
-
Writer
RandomAccessFile:随机文件操作
-
-
接口:Serializable
5.IO流对象
6.System类
输入输出 | 读取方式 |
---|---|
System.out(标准输出) | 显示器 |
System.err(标准错误输出) | 显示器 |
System.in(标准输入) | 键盘输入 |
7.Scanner
//字节流套接
Scanner(InputStream source)
//字符流套接
Scanner(Readable source)
8.序列化
-
序列化:具体对象数据 --> 二进制数据
- 实现方法:java.io.Serializable
-
反序列化:二进制数据 --> 具体对象数据
- 实现方法:Object readObject()方法从ObjectInputStream读取对象
-
-
基本类型和String默认都实现了这个接口,所以不需要处理。
-
类中的一个属性不参与序列化:transient,表示标记的属性不参与序列化。
transient关键字:某些属性不需要保存。
private transient String name;
-
static定义的变量也不参与序列化。
-
-
标记接口:Serializable,Cloneable.
只定义了一种功能,没有具体内容。它的功能由JVM实现。
优先使用的:
输入流 | 输出流 | |
---|---|---|
字节流 | Scanner(首选) | printStream(打印流) |
字符流 | BufferReader(次选,缓冲流) | printWriter(打印流) |
Scanner简单不赘述
BufferedReader
- 单字符
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BRRead {
//单字符读写
public static void main(String[] args) throws IOException {
char c;
//使用System.in创建BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("输入\'q\'退出:");
/*读取:读取一个字符使用read()方法
int read() throws IOException
*/
do{
c = (char)br.read();
System.out.println("退出");
}while(c != \'q\');
}
}
-
字符串
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class BRReadLine { //多字符读取 public static void main(String[] args) throws IOException { String str; //System.in创建BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入一行字符如\'end\'来结束"); /*读取一行字符 String readLine() throws IOException */ do{ str = br.readLine(); System.out.println("您输入了一行字符,已退出"); }while(!str.equals("end")); } }
-
FileInputStream
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class Fileinputstream { public static void main(String[] args) throws IOException { int i = 0; FileInputStream fi = null; try { fi = new FileInputStream("C:\\\\Users\\\\Administrator\\\\Desktop\\\\a.txt"); } catch (FileNotFoundException e) { System.out.println("找不到文件"); System.exit(-1); } try { int num = 0;//计数 while((i=fi.read()) != -1){ System.out.println((char)i); num++; } fi.close(); System.out.println("传输个数:"+num); } catch (IOException e) { System.out.println("读取文件错误"); } } }
-
FileOutputStream
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Fileoutputstream { public static void main(String[] args) throws IOException { int i = 0; FileInputStream fi = null; FileOutputStream fo = null; try { fi = new FileInputStream("C:\\\\Users\\\\Administrator\\\\Desktop\\\\a.txt"); fo = new FileOutputStream("C:\\\\Users\\\\Administrator\\\\Desktop\\\\b.txt"); while((i=fi.read())!=-1){ fo.write(i); System.out.println((char)i); } fi.close(); fo.close(); System.out.println("文件已复制"); } catch (IOException e) { System.out.println("文件复制错误"); System.exit(-1); } } }
-
Reader,Writer
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Filereaderwriter { public static void main(String[] args) throws IOException { int i = 0; try { FileReader fr = new FileReader("C:\\\\Users\\\\Administrator\\\\Desktop\\\\a.txt"); FileWriter fw = new FileWriter("C:\\\\Users\\\\Administrator\\\\Desktop\\\\c.txt"); while((i=fr.read())!=-1){ fw.write(i); System.out.println((char)i); } fr.close(); fw.close(); } catch (IOException e) { System.out.println("文件复制错误"); } } }