1.IO流
1.1分类
流的方向分类:输入流: 读数据
输出流: 写数据
流的类型分类:
字节流:
字节输入流:InputStream(此抽象类是表示字节输入流的超类)
FileInputStream 基本的字节输入流
BufferedInputStream 高效的字节缓冲输入流
字节输出流: OutputStream
FileOutputStream 基本的字节输出流(此抽象类是表示字节输出流的超类)
BufferdOutputStream 高效的字节缓冲输出流
字符流:
字符输入流: Reader(此抽象类是表示字符输入流的超类)
转换流 InputStreamReader 可以完成解码的操作
FileReader 对文件进行读取的便捷类
BufferedReader 高效的字符缓冲输入流
字符输出流: Writer(此抽象类是表示字符输出流的超类)
转换流 OutputStreamWriter 可以完成编码的操作
FileWriter 对文件进行写入的便捷类
BufferedWriter 高效的字符缓冲输出流
1.2字节流
写数据的方式4种基本的流,一次一个字节
基本的流,一次一个字节数组
高效的流,一次一个字节
高效的流,一次一个字节数组
读数据的方式4种
基本的流,一次读一个字节
基本的流,一次读一个字节数组
高效的流,一次读一个字节
高效的流,一次读一个字节数组
1.3字符流
写数据的方式5种一次一个字符
一次一个字符数组
一次一个字符数组一部分
一次一个字符串
一次一个字符串一部分
特殊方式:
通过BufferedWriter 高效的流
newLine() 写一个换行符
读数据的方式2种
一次一个字符
一次一个字符数组
特殊方式
通过BufferedReader 高效的流
readLine() 读取一行字符串
1.4FileOutputStream
构造方法:public FileOutputStream(File file) 通过File对象 , 创建 文件字节输出流对象
public FileOutputStream(String name)通过文件的字符串路径 , 创建 文件字节输出流对象 FileOutputStream构造方法如果参数append 设置为true, 那么,会在原有数据的基础上,追加新的数据:
public FileOutputStream(File file, boolean append)
public FileOutputStream(String name, boolean append)
写数据的方法public abstract void write(int b)
BufferedOutputStream: 字节缓冲输出流
特点: 在字节输出流的基础上,内部包含了一个用来缓冲数据的数组
作用: 为基本的字节输出流,提高效率,而产生的高效流,那么这个高效流的底层还是通过的流 完成的操作
构造方法: public BufferedOutputStream(OutputStream out)采用默认大小的缓冲区8192个字节,创建字节缓冲输出流对象
public BufferedOutputStream(OutputStream out, int size) 指定缓冲区大小,创建自己而缓冲输出流对象
1.5FileInputStream
构造方法:public FileInputStream(File file) 通过File对象, 得到一个字节输入流对象
public FileInputStream(String name) 通过文件的字符串路径,得到一个字节输入流对象 读取数据的方式
InputStream: 方式1: public abstract int read() 一次读取一个字节
方式2:public int read(byte[] b) 一次读取一个字节数组
BufferedInputStream: 字节缓冲输入流
特点: 把一个基本的流,进行了高效的包装,自身包含了一个缓冲数组
构造方法: public BufferedInputStream(InputStream in)
public BufferedInputStream(InputStream in, int size)
1.6四种方式完成avi文件复制
package cn.IOtest_4method;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FourMethodAvi {
public static void main(String[] args) throws IOException {
//method1("20.14_IO.avi", "Copy1.avi");
//method2("20.14_IO.avi", "Copy3.avi");
//method3("20.14_IO.avi", "Copy3.avi");
method4("20.14_IO.avi", "Copy4.avi");
}
private static void method4(String src, String dest) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));
byte[] bys = new byte[1024];
int len = -1;
while((len = bis.read(bys)) != -1){
bos.write(bys, 0, len);
}
bos.close();
bis.close();
}
private static void method3(String src, String dest) throws IOException {
FileInputStream bis = new FileInputStream(src);
FileOutputStream bos = new FileOutputStream(dest);
byte[] bys = new byte[1024];
int len = -1;
while((len = bis.read(bys)) != -1){
bos.write(bys, 0, len);
}
bis.close();
bos.close();
}
private static void method2(String src, String dest) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));
int ch = -1;
while((ch = bis.read()) != -1){
bos.write(ch);
}
bis.close();
bos.close();
}
public static void method1(String src , String dest) throws IOException{
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
int ch = -1;
while((ch = fis.read()) != -1){
fos.write(ch);
}
fos.close();
fis.close();
}
}
2.打印流
打印流: 只要输出操作,不能输入数据可以输出任意类型的数据分类: 字节打印流: PrintStream
字符打印流:PrintWriter
特点:如果启用了自动刷新,则只有在调用 println、printf 或 format 可以完成数据的自动刷新
构造方法: PrintWriter(File file)
PrintWriter(String filename)
PrintWriter(OutputStream out)
PrintWriter(Writer out)
实现自动刷新的构造方法:PrintWriter(OutputStream out, boolean autoFlush)
PrintWriter(Writer out, boolean autoFlush)
public class PrintWriterDemo {
public static void main(String[] args) throws IOException {
//创建打印流对象
PrintWriter pw = new PrintWriter(new FileWriter("pw.txt"), true);//开启自动刷新
//写数据
pw.println(3.14);
//关闭
}
}
3.print() 与 println()方法的区别
print方法:方法必须有参数
不能进行换行
如果开启了自动刷新功能,不能实现数据的自动刷新
println方法:
方法可以没有参数
可以实现换行
如果开启了自动刷新功能,能实现数据的自动刷新
4.序列化流和反序列化流
ObjectOutputStream 就是把 对象 存储到流中ObjectInputStream 就是从流中 读取对象
注意的:无论使用的是序列化流还是反序列化流,都需要当前对象先进行序列化操作
java.io.NotSerializableException: cn.itcast_06_SerializableStream.Person NotSerializableException - 某个要序列化的对象不能实现 java.io.Serializable 接口
说明当前Person类 没有实现序列化操作, 需要实现序列化
public interface Serializable
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
序列化接口没有方法或字段,仅用于标识可序列化的语义
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializableStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//write();
read();
}
//通过反序列化流,从流中 读取Person对象
private static void read() throws IOException, ClassNotFoundException {
//创建 对象输入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("序列化.txt"));
//从流中读取对象
Object obj = ois.readObject();
System.out.println(obj.toString());
//关闭流对象
ois.close();
}
//通过序列化流,把Person对象写入到流中
private static void write() throws IOException {
//创建 对象输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("序列化.txt"));
//写对象到流中
Person p = new Person("虎哥", 20);
oos.writeObject(p);
//关闭流对象
oos.close();
}
}
import java.io.Serializable;
public class Person implements Serializable {
/**
* 序列化版本号
*/
private static final long serialVersionUID = 4553866630186546227L;
private String name;
//private int age;
transient int age;//把年龄不参与序列化操作
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
5.多层文件夹的复制
package IOEncodeBufferedTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
//"第一次班会资料"---> Copy
public class BigTestDemo {
public static void main(String[] args) throws IOException {
File srcPath = new File("第一次班会资料");
File destPath = new File("Copy");
copyMothed(srcPath,destPath);
}
private static void copyMothed(File srcPath,File destPath) throws IOException {
destPath.mkdir();
File[] file = srcPath.listFiles();
for (File file2 : file) {
if (file2.isDirectory()){
File dest = new File(destPath, file2.getName());
copyMothed(file2, dest);
}else {
File dest = new File(destPath,file2.getName());
copy(file2,dest);
}
}
}
private static void copy(File file2, File dest) throws IOException {
FileInputStream fis = new FileInputStream(file2);
FileOutputStream fos = new FileOutputStream(dest);
int ch = -1;
while((ch = fis.read()) != -1){
fos.write(ch);
}
fis.close();
fos.close();
}
}