Java中IO流的学习

一、File 类

​ File 类:文件和目录路径名的抽象表示形式
​ 提供的功能:操作文件外部的能力,不能操作文件内部的内容
​ 能够定义真实存在的路径|文件,不在的也可以定义,所以抽象表现形式
​ 构造器:

​ File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例

​ File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例

​ File(String parent, String child) 根据 parent路径名字符串和child路径名字符串创建一个新File实例

二、IO流

​ IO:上传下载,写入写出
​ 流: 一连串流动的数据,以先入先出的方式进行流动,管道,以程序为中心、程序与网络|文件|服务器|数组… , 一切以java内存为中心

1.分类

1)按照流向

​ 输入流:Input
​ 输出流:Output

2)操作单元分

字节流 (万能流):任何内容都可以转为字节,可以传输文本,图片,音频…

​ InputStream/OutputStream

字符流 :只能操作纯文本数据

​ Reader/Writer

3)按照功能

​ 节点流 : 包裹源头,实现基本功能

​ 字节流:FileInputStream/FileOutputStream

​ 字符流:FileReader/FileWriter

​ 功能流 : 对节点流增强性能,提高效率

​ 转换流 :InputStreamReader/OutputStreamWriter

​ 缓冲流 :BufferedInputStream/BufferedOutputStream

​ BufferedReader/BufferedWriter

​ 4)各个分类之间是相辅相成的

2.字节流

InputStream/OutputStream

1)字节输入流

InputStream 此抽象类是表示字节输入流的所有类的超类

​ 子类:FileInputStream 从文件系统中的某个文件中获得输入字节

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class Demo01 {
	public static void main(String[] args) throws IOException {
        InputStream is=new FileInputStream(new File("D:/test.txt"));
        //读入数据 一个字节一个字节读入
        //使用循环,循环读入  可以简化代码,重复代码只写一次,但是还是一个字节一个字节读入
        /*int num=-1;
        while((num=is.read())!=-1){
            System.out.println((char)num);
        }*/
        //int read(byte[] b)   一个字节数组一个字节数组的读入
        //返回值: 返回读入到字节数组中数据的个数,没有读到返回-1
        byte[] car=new byte[1];
        int len=-1;
        while((len=is.read(car))!=-1){
            System.out.println(new String(car,0,len));
        }
        //关闭
        is.close();
    }
}

2)字节输出流

OutputStream 此抽象类是表示输出字节流的所有类的超类
​ 子类:FileOutputStream 文件输出流是用于将数据写入 File 的输出流

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Demo02 {
	public static void main(String[] args) {
		//FileOutputStream(String name)
		//FileOutputStream(String name,boolean append)  true追加,false不追加(默认)
		//FileOutputStream(File file,boolean append) 
		OutputStream os=null;
		try {
			//1.选择流
			os=new FileOutputStream("D:/hehe.txt",true); 
			//"D:/hehe.txt"文件不存在,系统会自动帮我们创建,但是文件夹不会
			//2.准备数据
			String str="今天晚上敲代码..."; 
			byte[] car=str.getBytes();
			//3.写出 	void write(byte[] b)  
			os.write(car);
			//4.刷出
			os.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			//5.关闭
			try {//预防空指针异常
				if(os!=null){
					os.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

3.字符流

​ Reader/Writer 只能操作纯文本

1)字符输入流

Reader 读取字符流的抽象类
FileReader 用来读取字符文件的便捷类

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class CharDemo01 {
	public static void main(String[] args) {
		//FileReader(String fileName) 
		Reader rd=null;
		try {
			//1.选择流
			rd=new FileReader("D:/hehe.txt");
			//2.读取
			//int read() 读取单个字符。 
			/*	System.out.println((char)rd.read());
				System.out.println((char)rd.read());
				System.out.println((char)rd.read());
				System.out.println((char)rd.read());
			*/
			int len=-1;  //存储读到的数据  如果为-1,证明已达到末尾
			/*while(-1!=(len=rd.read())){
				System.out.println((char)len);
			}*/
			// int read(char[] cbuf)  将字符读入数组。
			char[] ch=new char[1024];
			while((len=rd.read(ch))!=-1){
				System.out.println(new String(ch,0,len));
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			if(rd!=null){
				try {
					rd.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

2)字符输出流

Writer 写入字符流的抽象类
FileWriter 用来写入字符文件的便捷类

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
public class CharDemo02 {
	public static void main(String[] args) {
		//FileWriter(File file)    //默认不追加
		//FileWriter(File file, boolean append)  
		//FileWriter(String file)  
		//FileWriter(String file, boolean append)  
		Writer rt=null;
		try {
			//1.选择流
			rt=new FileWriter("D:/houhou.txt",true);
			//2.写入
			/*
			 *  void write(char[] cbuf) 写入字符数组。 
				abstract  void write(char[] cbuf, int off, int len)  写入字符数组的某一部分。 
				void write(int c) 写入单个字符。 
				void write(String str) 写入字符串。 
				void write(String str, int off, int len) 写入字符串的某一部分。 
			 */
			rt.write(97);
			rt.write("\r\n");  //换行
			rt.write("你真好看!!!!");
			rt.write("\r\n");
			rt.write("你真好看!!!!",2,2);
            rt.write("\r\n");
            char[] ch={'上','海','尚','学','堂'};
			rt.write(ch);
			rt.write("\r\n");
			rt.write(ch,2,3);
			rt.write("\r\n");
			//3.刷出
			rt.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			//4.关闭
			if(null!=rt){
				try {
					rt.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}
}

4.功能流(节点流)

​ 缓冲流: 增强功能,提高性能,加快读写效率

1)字节流

BufferedInputStream 字节输入流缓冲流
BufferedOutputStream 字节输出流缓冲流
​ 没有新增方法,可以发生多态使用

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class BufferedInputStream01 {
	public static void main(String[] args) throws IOException {
		//1.选择流
		//BufferedInputStream(InputStream in) 
		InputStream is=new BufferedInputStream(new FileInputStream("D:/hehe.txt"));
		OutputStream os=new BufferedOutputStream(new FileOutputStream("E:/hengheng.txt") );
		//2.读写
		byte[] car=new byte[1024];
		int len=-1;
		while((len=is.read(car))!=-1){
			os.write(car,0,len);
		}
		//3.刷出
		os.flush();
		//4.关闭
		os.close();
		is.close();
	}
}

2)字符流

BufferedReader 字符输入流缓冲流
​ 新增方法: String readLine() 读取一个文本行
BufferedWriter 字符输出流缓冲流
​ 新增方法: void newLine() 写入一个行分隔符

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedReader02 {
	public static void main(String[] args) throws IOException {
		//1.选择流  导包快捷键: ctrl+shift+o
		BufferedReader br=new BufferedReader(new FileReader("D:/hehe.txt"));
		BufferedWriter bw=new BufferedWriter(new FileWriter("D:/ccc.txt"));
		//2.读写
		String msg=null;
		while((msg=br.readLine())!=null){
			bw.write(msg);
			bw.newLine();
		}
		//3.刷出
		bw.flush();
		//4.关闭
		bw.close();
		br.close();
	}
}

5.date流(字节节点流)

1)字节节点流

读写基本数据类型+String类型数据

  • 是字节流功能流的一种
  • DataInputStream 新增方法: readXxx()
  • DataOutputStream 新增方法: writeXxx()
  • 存在新增方法不能发生多态,先写出再写入
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataDemo01 {
	public static void main(String[] args) throws IOException {
		//write("D:/data.txt");
		read("D:/data1.txt");
	}
	//读入
	public static void read(String path) throws IOException{
		//1.输入流 数据类型+数据
		DataInputStream in=new DataInputStream(new  BufferedInputStream(new FileInputStream(path)));
		//2.读入
		int i=in.readInt();
		boolean b=in.readBoolean();
		String s=in.readUTF();
		System.out.println(i+"-->"+b+"-->"+s);
		//3.关闭
		in.close();
	}
	//写出
	public static void write(String path) throws IOException{
		//1.输出流
		DataOutputStream out=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path)));
		//2.准备数据
		int i=101;
		boolean f=false;
		String s="哈哈";
		//3.写出  写出和读入的顺序要保持一致
		out.writeInt(i);
		out.writeBoolean(f);
		out.writeUTF(s);
		//4.刷出
		out.flush();
		//5.关闭
		out.close();
	}
}

6.对象流 Object

​ 保存数据类型+数据

​ 字节的功能流:当想要传输|读写对象类型数据的时候,可以使用一个对象流

1)序列化

把对象类型的数据转化为可存储|可传输的状态的过程

ObjectInputStream() 反序列化输入流 新增方法: readObject()

ObjectOutputStream() 序列化输出流 新增方法: writeObject()

2)序列化(Serializable)

  1. 先序列化后反序列化

  2. 序列化反序列读写顺序一致

  3. 不是所有的类都能序列化 实现 java.io.Serializable 空接口

  4. 不是所有的属性都需要序列化 transient

  5. static内容不会被序列化

  6. 如果父类实现Serializable接口,子类中可以序列化所有内容

    ​ 如果子类实现Serializable接口,但是父类没有实现,子类只能序列化子类独有的内容

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;
public class ObjectDemo02 {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		write("D:/object.txt");//写入到文件
		read("D:/object.txt");//读取文件内容
	}
	//反序列化输入
	public static void read(String path) throws IOException, ClassNotFoundException{
		//1.输入流
		ObjectInputStream is=new ObjectInputStream(new BufferedInputStream(new FileInputStream(path)));
		//2.读入
		Object p= is.readObject();
		int[] arr= (int[]) is.readObject();
		if(p instanceof Person){
			Person person=(Person)p;
			System.out.println(person.getName());
		}
		System.out.println(p);
		System.out.println(Arrays.toString(arr));
		//3,关闭
		is.close();
	}
	//序列化输出
	public static void write(String path) throws IOException{
		//1.输出对象信息
		ObjectOutputStream os=new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(path)));
		//2.准备数据
		Person p=new Person("冬冬",18);
		int[] arr={1,2,3,4};
		//3.输出
		os.writeObject(p);
		os.writeObject(arr);
		//4.刷出
		os.flush();
		//5.关闭
		os.close();		
		p.setAge(100);
	}
}
//自定义Person这个类
class Person implements Serializable{//实现序列化接口
	private String name;//私有的属性
	private static int age;	
	public Person() {}//空构造
	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;
	}
	@Override//重写toString方法
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值