Java常用工具_6.Java输入输出流

本文深入讲解Java中的输入输出流概念,包括文件操作、字节流、缓冲流、字符流及对象序列化等核心内容,通过代码示例展示如何在实际项目中应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、输入输出流

1.输出流

在这里插入图片描述
流就是指一连串流动的字符,以先进先出的方式发送信息的通道

2.输入流

在这里插入图片描述
文件输入:读
文件输出:写

二、File类

1.什么是文件

文件可认为是相关记录或放在一起的数据的集合
在Java中,使用java.io.File类对文件进行操作.

2.绝对路径和相对路径

• 绝对路径:是从盘符开始的路径
• 相对路径:是从当前路径开始的路径

3.File(java.io包中)

(1)分隔符
Windows:""
Linux:"/"
(2)常量
在这里插入图片描述
(3)构造方法
在这里插入图片描述
(4)常用方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.代码实现

package com.study.file;

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

public class FileDemo {

	public static void main(String[] args) {
		// 创建File对象
		// 方式1:File file1 = new File("d:\\java word\\FileProj\\io\\score.txt");
		// 方式2:File file1 = new File("d:\\java word","FileProj\\io\\score.txt");
		// 方式3:
		File file = new File("d:\\java word");
		File file1 = new File(file, "FileProj\\io\\score.txt");
		// 判断是文件还是目录
		System.out.println("是否是目录:" + file1.isDirectory());
		System.out.println("是否是文件:" + file1.isFile());
		// 创建目录和多级目录
		File file2 = new File("d:\\java word\\FileProj\\set", "HashSet");
		if (!file2.exists()) {// 判断文件是否存在
			file2.mkdir();// 创建目录
		}
		File file3 = new File("d:\\java word\\FileProj\\set\\HashSet1\\test1");
		if (!file3.exists()) {// 判断文件是否存在
			file3.mkdirs();// 创建多级目录
		}
		// 创建文件
		File file4 = new File("d:\\java word\\FileProj\\io\\file.txt");
		if (!file4.exists()) {
			try {
				file4.createNewFile();// 创建文件
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

三、字节流

1.字节输入流InputStream

在这里插入图片描述

2.字节输出流FileOutputStream

在这里插入图片描述

3.FileInputStream

(1)从文件系统中的某个文件中获得输入字节
(2)用于读取诸如图像数据之类的原始字节流

4.FileInputStream方法

(1)构造方法
在这里插入图片描述
(2)常用方法
在这里插入图片描述
(3)如果返回值为-1,则表示已经到达文件末尾

5.FileInputStream代码实现

package com.study.file;

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

public class FileInputDemo1 {

	public static void main(String[] args) {
		// 创建一个FileInputStream对象
		try {
			FileInputStream fis = new FileInputStream("file.txt");
//			int n = fis.read();
//			while (n != -1) {
//				System.out.print((char) n);
//				n = fis.read();
//			}
			int n = 0;
			while ((n = fis.read()) != -1) {
				System.out.print((char) n);
			}
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

package com.study.file;

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

public class FileInputDemo2 {

	public static void main(String[] args) {
		// 创建一个FileInputStream对象
		try {
			FileInputStream fis = new FileInputStream("file.txt");
			byte[] b = new byte[100];
			fis.read(b, 0, 5);// 0是偏移量,5是读取数据长度
			System.out.println(new String(b));
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

6.FileOutputStream方法

(1)构造方法
在这里插入图片描述
(2)常用方法在这里插入图片描述

7.FileOutputStream代码实现

package com.study.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("file.txt", true);// 新增
			fos = new FileOutputStream("file.txt");// 覆盖
			fis = new FileInputStream("file.txt");
			fos.write(50);
			fos.write('a');
			int n = 0;
			while ((n = fis.read()) != -1) {
				System.out.print((char) n);
			}
			fis.close();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

package com.study.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("happy.jpg");
			// FileOutputStream fos = new FileOutputStream("happycopy.jpg");
			FileInputStream fis = new FileInputStream("happy.gif");
			FileOutputStream fos = new FileOutputStream("happycopy.gif");
			int n = 0;
			byte[] b = new byte[1024];
			while ((n = fis.read(b)) != -1) {
				// fos.write(b);// happycopy文件总比happy文件多1k,最后一次写数据会多,解决方法:
				fos.write(b, 0, n);
			}
			fis.close();
			fos.close();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

四、缓冲流

1.缓冲流包括

缓冲输入流BufferedInputStream
缓冲输出流BufferedOutputStream

2.BufferedInputStream

(1)常量
在这里插入图片描述
(2)构造方法
在这里插入图片描述
(3)常用方法
在这里插入图片描述

3.BufferedOutputStream

(1)常量
在这里插入图片描述
(2)构造方法
在这里插入图片描述
(3)常用方法
在这里插入图片描述

4.代码实现

package com.study.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("file.txt");
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			FileInputStream fis = new FileInputStream("file.txt");
			BufferedInputStream bis = new BufferedInputStream(fis);
			long startTime = System.currentTimeMillis();// 获取系统当前时间(长整型的:当前时间-1970.1.1)
			bos.write(50);
			bos.write('a');
			bos.flush();// 缓冲区未满,不会触发写操作,flush和close方法调用一个即可强制清空缓冲区中的数据
			System.out.println(bis.read());
			System.out.println((char) bis.read());
			long endTime = System.currentTimeMillis();
			System.out.println(endTime - startTime);// 共用时间
			fos.close();
			fis.close();
			bis.close();
			bos.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

五、字符流

1.类结构图

字符输入流Reader
在这里插入图片描述
字符输出流Writer
在这里插入图片描述

2.字符流和字节流对比

(1)字节流:2进制格式数据
(2)字符流:支持字符数据–写-->转为2进制–读-->字符数据读出

3.字节字符转换流

InputStreamReader
(1)构造方法
在这里插入图片描述
(2)常用方法
在这里插入图片描述

OutputStreamWriter
(1)构造方法
在这里插入图片描述
(2)常用方法
在这里插入图片描述

4.代码实现

package com.study.charstream;

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("file.txt");
			InputStreamReader isr = new InputStreamReader(fis, "GBK");
			BufferedReader br = new BufferedReader(isr);
			FileOutputStream fos = new FileOutputStream("file1.txt");
			OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
			BufferedWriter bw = new BufferedWriter(osw);
			int n = 0;
			char[] cbuf = new char[10];
//			while ((n = isr.read()) != -1) {
//				System.out.print((char) n);
//			}
//			while ((n = isr.read(cbuf)) != -1) {
//				String s = new String(cbuf, 0, n);
//				System.out.print(s);
//			}
			while ((n = br.read(cbuf)) != -1) {
//				String s = new String(cbuf, 0, n);
//				osw.write(s);
				bw.write(cbuf, 0, n);
				bw.flush();
			}
			fis.close();
			isr.close();
			fos.close();
			osw.close();
			br.close();
			bw.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

5.其他字符流

BufferedReader/BufferedWriter
FileReader/FileWriter

六、对象序列化与反序列化

1.步骤:

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

2. 对象输入流ObjectInputStream

在这里插入图片描述
在这里插入图片描述

3.对象输出流ObjectOutputStream

在这里插入图片描述
在这里插入图片描述

4.代码实现

package com.study.serial;

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 + "]";
	}

}

package com.study.serial;

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("file.txt");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			FileInputStream fis = new FileInputStream("file.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());  
			fis.close();
			ois.close();
			fos.close();
			oos.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

5.序列化与反序列化

序列化:把Java对象转换为字节序列的过程(写对象)
反序列化:把字节序列恢复为Java对象的过程(读对象)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值