【Java】I/O流学习笔记

1.File类概述


  • 什么是文件?

    文件可以认为是记录相关记录或存放在一起的数据集合。

    在Java中,使用java.io.File类对文件进行操作。

常用方法


package com.imooc.file;

import java.io.File;
import java.io.IOException;

public class FileDemo {

	public static void main(String[] args) {
		//创建File对象
		File file1 = new File("c:\\imooc\\io\\score.txt");
		//判断是文件还是目录
		System.out.println("是否是目录:"+file1.isDirectory());
		System.out.println("是否是文件:"+file1.isFile());
		//创建目录
		File file2 = new File("c:\\imooc\\set\\HashSet");
		if(!file2.exists()) {//判断目录是否存在
			file2.mkdirs();//mkdir加s表示添加多级目录
		}
		//创建文件
		if(!file1.exists()) {//判断文件是否存在
			try {
				file1.createNewFile();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
		
	}

}

2.绝对路径与相对路径


  • 绝对路径:从盘符开始的路径

  • 相对路径:从当前路径开始的路径

返回上一级目录:…\

  • isAbsolute() 判断路径是绝对路径还是相当路径,true绝对路径,false相对路径

  • getPath() 获取相对路径

  • getAbsolutePath() 获取绝对路径

  • getName()获取文件名字

3.字节流


字节流


  • 字节输入流:InputStream
  • 字节输出流:OutputStream

1、字节输入流:InputStream

  • 体系

在这里插入图片描述

2、字节输出流:OutputStream

  • 体系

在这里插入图片描述

4.FileInputStream


FileInputStream


  • 从文件系统中的某个文件中获得输入字节

  • 用于读取诸如图像数据之类的原始字节流


常用方法

  • public int read() 从输入流中读取一个数据字节
  • public int read(byte[] b) 从输入流中将最多b.length个字节的数据读入一个byte数组中
  • public int read(byte[] b,int off,int len) 从输入流中将最多len个字节的数据读入byte数组中
  • public void close() 关闭此文件输入流,并释放与此流有关的所有系统资源

如果返回值为-1,则表示已经达到文件末尾!


使用

案例1

package com.imooc.file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputDemo1 {

	public static void main(String[] args) {
		//创建一个 FileInputDemo1对象
		 try {
			FileInputStream fis = new  FileInputStream("C:\\Users\\吴秀祥\\eclipse-workspace\\IOProj\\imooc.txt");
//			int n = fis.read();
			int n = 0;
//			while(n!=-1) {
//				System.out.print((char)n);
//				n=fis.read();
//			}
			while((n=fis.read())!=-1) {//注释代码简写式
				System.out.println((char)n);
			}
			
			System.out.println((char)n);
			fis.close();//关闭资源
		} catch (FileNotFoundException e) {
			// 
			e.printStackTrace();
		}catch(IOException e) {
			e.printStackTrace(); 
		}

	}

}

案例2

package com.imooc.file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputDemo1 {

	public static void main(String[] args) {
		//创建一个 FileInputDemo1对象
		 try {
			FileInputStream fis = new  FileInputStream("C:\\Users\\吴秀祥\\eclipse-workspace\\IOProj\\imooc.txt");
//			int n = fis.read();
			int n = 0;
//			while(n!=-1) {
//				System.out.print((char)n);
//				n=fis.read();
//			}
			while((n=fis.read())!=-1) {//注释代码简写式
				System.out.println((char)n);
			}
			
			System.out.println((char)n);
			fis.close();//关闭资源
		} catch (FileNotFoundException e) {
			// 
			e.printStackTrace();
		}catch(IOException e) {
			e.printStackTrace(); 
		}

	}

}

5.FileOutputStream


FileOutputStream文件输出流


主要作用:写入数据

常用方法

public void write(int b)//将指定字节写入此文件输出流
public void write(byte[] b)//将b.length个字节从指定byte数组写入此文件输出流中
public void write(byte[] b,int off,int len)//将指定byte数组中从偏离量off开始的len个字节写入此文件输出流
public void close()//关闭此文件输出流并释放与此流有关的所有系统资源

案例1:基本使用

package com.imooc.file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputDemo {

	public static void main(String[] args) {
		//声明
		FileOutputStream fos;//输入流
		FileInputStream fis;//输出流
		try {
			fos = new FileOutputStream("C:\\Users\\吴秀祥\\eclipse-workspace\\IOProj\\imooc.txt",true);//true代表覆盖写入
			fis = new FileInputStream("C:\\Users\\吴秀祥\\eclipse-workspace\\IOProj\\imooc.txt");
			fos.write(50);
			fos.write('a');
			System.out.println(fis.read());
			System.out.println((char)fis.read());
			fos.close();
			fis.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch(IOException e) {
			e.printStackTrace();
		}
		
	}

}

案例2:文件拷贝

package com.imooc.file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputDemo1 {

	public static void main(String[] args) {
		//文件拷贝
		try {
			FileInputStream fis = new FileInputStream("C:\\imooc\\Demo.jpg");
			FileOutputStream fos = new FileOutputStream("C:\\imooc\\Democopy.jpg");
			int n = 0;
			byte[] b = new byte[1024];
			while((n=fis.read(b))!=-1) {
				fos.write(b,0,n);//参数0和n是为了保证拷贝前后文件大小一致
			}
			fis.close();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch(IOException e) {
			e.printStackTrace();
		}

	}

}

6.缓冲流


缓冲流


  • 缓冲输入流:BufferedInputStream

  • 缓冲输出流:BufferedOutputStream


为什么要使用缓冲流?

答:提高文件的读取和写入速度(普通流是从硬盘读取数据,而缓冲流是通过内存)


案例

package com.imooc.file;

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 BufferedDemo {

	public static void main(String[] args) {
		
		try {
			//输出流
			FileOutputStream fos = new FileOutputStream("C:\\imooc\\imooc.txt");//写操作
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			//输入流
			FileInputStream fis = new FileInputStream("C:\\\\imooc\\\\imooc.txt");
			BufferedInputStream bis = new BufferedInputStream(fis);
			//使用缓冲流对象进行写入
			bos.write(50);
			bos.write('a');
			//清空缓冲区,否则无法写入
			bos.flush();//也可以使用close()方法,二者选其一
			//把读取到的数据进行输出
			System.out.println(bis.read());
			System.out.println((char)bis.read());
			//关闭所有流
			fos.close();
			bos.close();
			fis.close();
			bis.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}

	}

}

7.字符流


字符流


  • 字符输入流:Reader

  • 字符输出流:Writer


字符输入流类结构图
在这里插入图片描述

字符输出流类结构图
在这里插入图片描述


字节流:主要操作二进制数据,如图片之类的

字符流:主要运用于文字

8.字节字符转换流


字节字符转换流


  • InputStreamReader

  • OutputStreamWriter

package com.imooc.file;
//输入流的使用
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class ReaderDemo {

	public static void main(String[] args) {
		try {
			//读数据部分
			FileInputStream fis = new FileInputStream("C:\\imooc\\imooc.txt");
			InputStreamReader isr = new InputStreamReader(fis);
			//写数据部分
			FileOutputStream fos = new FileOutputStream("C:\\imooc\\newimooc.txt");//文件没有,java会自动创建
			OutputStreamWriter osw = new OutputStreamWriter(fos);
			
			
			//读取数据
			//方法1
			System.out.println("----方法1读取数据-----");
			int n = 0;
			char[] cbuf = new char[10];
			while((n=isr.read())!=-1) {
				System.out.println((char)n);
			}
			//方法2
			System.out.println("----方法2读取数据-----");
			while((n=isr.read(cbuf))!=-1) {
				String s = new String(cbuf,0,n);
				System.out.println(s);
			}
			
			//写入数据
			while((n=isr.read(cbuf))!=-1) {
				//String s = new String(cbuf,0,n);
				osw.write(cbuf,0,n);
				osw.flush();//osw.flush()也可以写在循环外面
			}
			
			//关闭流
			fis.close();
			fos.close();
			isr.close();
			osw.close();
			
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}

	}

}

9.其他字符流


package com.imooc.file;
import java.io.BufferedReader;
import java.io.BufferedWriter;
//输入流的使用
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class ReaderDemo {

	public static void main(String[] args) {
		try {
			//读数据部分
			FileInputStream fis = new FileInputStream("C:\\imooc\\imooc.txt");
			InputStreamReader isr = new InputStreamReader(fis);
			BufferedReader br = new BufferedReader(isr);
			//写数据部分
			FileOutputStream fos = new FileOutputStream("C:\\imooc\\newimooc.txt");//文件没有,java会自动创建
			OutputStreamWriter osw = new OutputStreamWriter(fos);
			BufferedWriter bw = new BufferedWriter(osw);
			
			
			//读取数据
			//方法1
			System.out.println("----方法1读取数据-----");
			int n = 0;
			char[] cbuf = new char[10];
			while((n=br.read())!=-1) {
				System.out.println((char)n);
			}
			//方法2
			System.out.println("----方法2读取数据-----");
			while((n=br.read(cbuf))!=-1) {
				String s = new String(cbuf,0,n);
				System.out.println(s);
			}
			
			//写入数据
			while((n=br.read(cbuf))!=-1) {
				//String s = new String(cbuf,0,n);
				bw.write(cbuf,0,n);
				bw.flush();//osw.flush()也可以写在循环外面
			}
			
			//关闭流
			fis.close();
			fos.close();
			isr.close();
			osw.close();
			br.close();
			bw.close();
			
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}

	}

}

10.对象的序列化与反序列化


对象的序列化与反序列化


对象序列化

步骤:

  1. 创建一个类,继承Serializable接口
  2. 创建对象
  3. 将对象写入文件
  4. 从文件读取对象信息

涉及到的类:

  • 对象输出流:ObjectInputStream
  • 对象输出流:ObjectOutputStream

序列化和反序列化

  • 序列化:把Java对象转换为字节序列的过程
  • 反序列化:把字节序列恢复为Java对象的过程

案例

Goods类

package com.imooc.file;

import java.io.Serializable;

public class Goods implements Serializable{
	private String goodsId;
	private String goodsName;
	private double price;
	public Goods(String goodsId,String goodsName,double price){
		this.goodsId=goodsId;
		this.goodsName=goodsName;
		this.price=price;
	}
	public String getGoodsId() {
		return goodsId;
	}
	public void setGoodsId(String goodsId) {
		this.goodsId = goodsId;
	}
	public String getGoodsName() {
		return goodsName;
	}
	public void setGoodsName(String goodsName) {
		this.goodsName = goodsName;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return "商品信息 [编号:" + goodsId + ", 名称:" + goodsName 
				+ ", 价格:" + price + "]";
	}
	
}


GoodsTest类

package com.imooc.file;

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 GoodsTest {

	public static void main(String[] args) {
		// 定义Goods类的对象
		Goods goods1 = new Goods("gd001", "电脑", 3000);
		try {
			FileOutputStream fos = new FileOutputStream("C:\\imooc\\imooc.txt");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			FileInputStream fis = new FileInputStream("C:\\\\imooc\\\\imooc.txt");
			ObjectInputStream ois = new ObjectInputStream(fis);
			// 将Goods对象信息写入文件
			oos.writeObject(goods1);
			oos.writeBoolean(true);
			oos.flush();
			// 读对象信息
			try {
				Goods goods = (Goods) ois.readObject();
				System.out.println(goods);
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(ois.readBoolean());

			fos.close();
			oos.close();
			fis.close();
			ois.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值