dedecms企业网站模板seo网站优化外包
一、理解
1.简单而言:流就是内存与存储设备之间传输数据的通道、管道。
2.流的分类:
(1) 按方向 ( 以 JVM 虚拟机为参照物 ) 【重点】
输入流:将< 存储设备 > 中的内容读入到 < 内存 > 中。
输出流:将< 内存 > 中的内容写入到 < 存储设备 > 中
(2) 按单位:
字节流:以字节为单位,可以操作所有类型的文件。
字符流:以字符为单位,只能操作文本类型的文件。
(3) 按功能:
节点流:具有基本的读写功能。
过滤流:在节点流的基础上,增加新的功能。
二、字节流
1.字节流的父类(抽象类)
(1) InputStream :字节输入流
对应的操作为读操作
功能方法:read 方法
(2) OutputStream: 字节输出流
对应的操作为写操作
功能方法:write 方法
2.字节流的子类-节点流
(1) FileOutputStream :文件字节输出流
a. 构造方法:
FileOutputStream fos = new FileOutputStream("D:\\test2\\a.txt");
参数:代表操作文件的路径,指定的文件夹必须存在,否则报错,错误信息为:
java.io.FileNotFoundException(文件找不到的异常);但是指定文件如果不存在,则系统默认创建一个新的
文件路径:绝对路径和相对路径
绝对路径:带有盘符的路径,例如 D:\\test2\\a.txt
相对路径:相对当前项目查找对应的路径,例如:
FileOutputStream fos = new FileOutputStream("file/a.txt");
b. 功能方法:
void write(int a):将单个字节内容写入到文件中
void close():关闭流,释放系统资源
public class TestFileOutputStream {public static void main(String[] args) throws IOException {// 1. 创建文件字节输出流对象FileOutputStream fos = new FileOutputStream("file/a.txt");// 2. 写文件fos.write(97);// 3. 关闭流: 释放资源fos.close();}
}
(2) FileInputStream :文件字节输入流
a.构造方法
FileInputStream fos=new FileInputStream(“file/a.txt”);
参数:代表要读取哪一个文件中的内容;如果指定的文件不存在,则系统不会自动创建,而是抛出异常:
java.io.FileNotFoundException: file\a.txt (系统找不到指定的文件)。
b. 功能方法:
int read():一次性读取一个字节,将读取的内容作为返回值进行返回,如果达到文件尾部,则返回-1
close():关闭流,释放资源
3.字节流的子类-过滤流
(1)
BufferedInputStream/BufferedOutputStream// 1. 创建文件输入 + 输出流FileInputStream fis = new FileInputStream("D:\\test\\ph.mp4");//读文件BufferedInputStream bis = new BufferedInputStream(fis);FileOutputStream fos = new FileOutputStream("file/ph_copy.mp4");BufferedOutputStream bos = new BufferedOutputStream(fos);// 2. 读和写while(true){int n=bis.read(); // 读if(n==-1) break;bos.write(n);}// 3. 关闭流fis.close();fos.close();
(2) 过滤流: ObjectOutputStream/ObjectInputStream
a. 增强了缓冲区功能
增强了读写8种基本数据类型和字符串功能
b. 增强了读写对象的功能 :readObject() 从流中读取一个对象 /
writeObject(Object obj) 向流中写入一个对象
c. 对象放在流上进行传输的过程称为对象序列化。对象序列化的要求: [ 重点 ]
参与对象序列化的对象对应的类,必须实现java.io.Serializable接口
transient修饰的属性,不参与对象序列化
对象序列化达到文件尾部的标识:
如果运行时抛出 java.io.EOFException,代表读取的文件达到尾部
对象序列化的细节:
如果对象的属性,是自定义类型的对象时,则该对象也必须是可序列化的
如果对集合进行对象序列化,必须保证该集合中的所有元素是可序列化的
三、字符流
1.字符流的父类(抽象类):
(1) Reader :字符输入流
对应的操作为读操作
功能方法:read 方法
(2) Writer: 字符输出流
对应的操作为写操作
功能方法:write 方法
2.文件字符输入/输出流
(1) FileWriter 文件字符输出流,继承 Writer 中的方法:
public void write(int n):将单个字符写入到文件中
(2) FileReader 文件字符输入流,继承 Reader 中的方法:
public int read():一次读取一个字符的内容
3.字符过滤流
(1) BufferedReader :增强读取一行内容的方法
String readLine(): 一次性读取一行内容,返回值为 String ,达到文件尾部时,返回 null
(2) PriterWriter :一次性写入一行内容
println(String str):将一行内容写入到文件,自动换行
print(String str):将一行内容写入到文件,不自动换行
4.桥转换流
InputStreamReader 、 OutputStreamWriter
(1) 字符流和字符流之间转换的通道
(2) 指定编解码格式
public class TestInputStreamReader {public static void main(String[] args) throws IOException {// 1. 创建文件字节输入流对象( 基础流 ) -> 不能更改文件编码格式 (GBK)FileInputStream fis = new FileInputStream("file/m.txt");// 2. 创建桥转换流,指定编解码格式为 "GBK"InputStreamReader isr = new InputStreamReader(fis,"GBK");// 3. 包装过滤流:增强读操作BufferedReader br = new BufferedReader(isr);// 4. 读操作while(true){String s = br.readLine();if(s==null) break;System.out.println(s);}// 5. 关闭流br.close();}
}
package testio2;import java.io.*;
public class TestInputStreamReader {public static void main(String[] args) {BufferedReader br = null;try {// 1. 创建文件字节输入流对象(基础流 ) -> 不能更改文件编码格式 (GBK)FileInputStream fis = new FileInputStream("file/m.txt");// 2. 创建桥转换流,指定编解码格式为 "GBK"InputStreamReader isr = new InputStreamReader(fis, "GBK");// 3. 包装过滤流:增强读操作br = new BufferedReader(isr);// 4. 读操作while (true) {String s = br.readLine();if (s == null) break;System.out.println(s);}}catch (Exception e){e.printStackTrace();}finally {if(br!=null){// 5. 关闭流try {br.close();} catch (IOException e) {e.printStackTrace();}}}}
}