Java基础中的IO流

2023-11-12

一、IO流

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

1.分类

1)按照流向: 
		输入流:
		输出流:
2)操作单元分:
		字节流 (万能流):任何内容都可以转为字节,可以传输文本,图片,音频...
		字符流 :只能操作纯文本数据
3)按照功能:
		节点流 : 包裹源头,实现基本功能
		功能流 : 对节点流增强性能,提高效率
4)各个分类之间是相辅相成的

2.字节流:

1)节点流
	(1)字节输入流 : InputStream 	此抽象类是表示字节输入流的所有类的超类
			FileInputStream		从文件系统中的某个文件中获得输入字节
//字节流输入 InputStream 
//导包	导包快捷键: ctrl+shift+o
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 {
		//FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定
		//FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定
		InputStream is=new FileInputStream(new File("D:/test.txt"));//创建D盘符的根目录下的文件
		System.out.println(is);
		//方式1: int read() 读入数据 一个字节一个字节读入
		/*int num=is.read();
		System.out.println((char)num);
		num=is.read();
		System.out.println((char)num);
		System.out.println((char)(is.read()));*/
		//方式2:使用循环,循环读入,可以简化代码,重复代码只写一次,但还是一个字节一个字节的读入
		/*int num=-1;
		while((num=is.read())!=-1){
			System.out.println((char)num);
		}*/
		//方式3:int read(byte[] b) 一个字节数组一个字节数组的读入
		//返回值: 返回读入到字节数组中数据的个数,没有读到返回-1
		byte[] car=new byte[1];
		//int len=is.read(car); 
		int len=-1;
		while((len=is.read(car))!=-1){
			System.out.println(new String(car,0,len));
		}
		//关闭
		is.close();
	}
}
	(2)字节输出流: OutputStream   	此抽象类是表示输出字节流的所有类的超类
			FileOutputStream  		文件输出流是用于将数据写入 File 的输出流
//字节输出流 OutputStream
//导包	导包快捷键: ctrl+shift+o
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)  创建一个向具有指定 name 的文件中写入数据的输出文件流
		//FileOutputStream(File file,boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
		//boolean append	返回值:true追加,false不追加(默认false)
		OutputStream os=null;
		//try...catch(){}	捕捉异常,处理异常
		try {
			//1.选择流
			os=new FileOutputStream("D:/hhh.txt",hhtrue); //文件不存在,系统会自动帮我们创建,但文件夹不会
			//2.准备数据
			String str="要好好学习,天天向上..."; 
			byte[] c和=str.getBytes();
			//3.写出 void write(byte[] b)  
			os.write(ch);
			//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.字符流:

只能操作纯文本
1)节点流:
	(1)字符输入流:Reader 	读取字符流的抽象类
			FileReader 		用来读取字符文件的便捷类
//字符输入流 Reader
//导包	导包快捷键: ctrl+shift+o
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Demo03 {
	public static void main(String[] args) {
		//FileReader(String fileName) 
		Reader rd=null;
		try {
			//1.选择流
			rd=new FileReader("D:/hehe.txt");//创建D盘符的根目录下的文件
			//2.读入
			//方法1: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,证明已达到末尾
			//方法2:
			/*while(-1!=(len=rd.read())){
				System.out.println((char)len);
			}*/
			//方法3:int read(char[] cbuf)  将字符读入数组。
			char[] car=new char[1024];
			while((len=rd.read(car))!=-1){
				System.out.println(new String(car,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		用来写入字符文件的便捷类
//字符输出流:Writer
//导包	导包快捷键: ctrl+shift+o
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)  写入字符数组 
				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={'a','b','c','d','e'};
			rt.write(ch);
			rt.write("\r\n");
			rt.write(ch,2,3);
			//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.Data流(字节节点流)

Data流(字节节点流):
	读写基本数据类型+String类型数据,是字节流功能流的一种
		DataInputStream		新增方法: readXxx()
		DataOutputStream 	新增方法: writeXxx()
	存在新增方法不能发生多态,先写出再写入
可能碰到的异常:EOFException 文件有,内容读入不到,必须读入的是写出的源文件
//导包
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 Data01 {
	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 保存数据类型+数据
	字节的功能流:当想要传输|读写对象类型数据的时候,可以使用一个对象流
	序列化: 把对象类型的数据转化为可存储|可传输的状态的过程
		ObjectInputStream()    反序列化输入流   新增方法: readObject()
		ObjectOutputStream()   序列化输出流       新增方法: writeObject()
注意:
	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("aaa",18);
		int[] arr={1,2,3,4};
		//3.输出
		os.writeObject(p);
		os.writeObject(arr);
		//4.刷出
		os.flush();
		//5.关闭
		os.close();
	}
}
//接口
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
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

二、File 类

File 类:文件和目录路径名的抽象表示形式
	提供的功能:操作文件外部的能力,不能操作文件内部的内容
	能够定义真实存在的路径|文件,不在的也可以定义,所以抽象表现形式
	构造器:	File(File parent, String child)   根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例 
	  		File(String pathname)  通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例 
	 		File(String parent, String child)   根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础中的IO流 的相关文章

随机推荐

  • 制作长方形表贴焊盘

    第一步 打开Pad Designer 第二步 点击File new 创建一个焊盘文件 第三步 修改小数点后几位 一般是三位 第四步 勾选Single layer 第五步 点击建构的框架 然后选择焊盘形状 Rectangle 矩形 然后填写宽
  • 4月24日云栖精选夜读

    点击订阅云栖夜读周刊 轻松筹首创了 大病救助 模式 帮助了众多病患在第一时间解決了医疗资金等问题 为了从源头解决了医疗资金问题 而在轻松筹这样全球5 5亿用户信赖的大病筹款平台的背后 是日益增长的各种数据 面对这样数据量所造成的巨大挑战 阿
  • 安装PyTorch-Lightning踩坑

    官网地址 PyTorch PyTorch Lightning 安装PyTorch Lightning 1 不能直接使用pip install pytorch lightning 否则如下图会直接卸载掉你的torch而安装cpu版本的torc
  • 这些有趣的AI人脸特效背后,腾讯云都做了什么?

    导语 深受泛娱乐场景喜爱的人脸特效产品 在不断的尝试和拓展中已挖掘出很多火爆的玩法及积累了不少优秀落地案例 本文是对腾讯云高级工程师 李凯斌老师在 云加社区沙龙online 的分享整理 以人脸特效产品 人脸融合 人脸试妆包括试唇色和美颜 人
  • 后代,后裔 descendant offspring posterity progeny

    后代 后裔 descendant offspring posterity progeny 后代 后裔 descendant offspring posterity progeny posterity descendant 和 offspri
  • xp能ping通kali,而kali却ping不了winxp的解决方案

    今天天气不错 手机响了 学妹向我提问了一个问题 她的win xp能ping通linux kali 而linux kali却ping不了winxp 这个问题起初我以为是vmware 15版本的虚拟网卡乱掉了 等到问题解决的时候发现 大错特错
  • 【ESP-IDF】ESP32利用wifi联网(STA模式)

    1 AP和STA的含义 AP模式 Access Point模式 提供无线接入服务 允许其它无线设备接入 提供数据访问 STA模式 Station模式 类似于无线终端 sta本身并不接受无线的接入 它可以连接到AP设备 2 STA模式例程 官
  • 卫星安全组网认证论文详解

    文章 卫星安全组网认证关键技术研究 文章链接 卫星安全组网认证关键技术研究 中国知网 1 摘要 对象 双层卫星网络 通常由地球同步轨道卫星 GEO 和低地球轨道卫星 LEO 组成 其中GEO在通信中起到中继器的作用 能够提供广域覆盖区域 但
  • python中的键不允许重复_在python中使用重复键字典

    在python中使用重复键字典 我有以下列表 其中包含具有不同值的重复的汽车登记号码 我想把它转换成一个字典 接受这个汽车登记号码的多个键 到目前为止 当我尝试将列表转换为字典时 它消除了其中一个键 有人可以告诉我如何使用重复的键字典列表是
  • FFmpeg x264编码b帧时时间戳,帧率等总结

    1 在进行FFmpeg API转码视频时 解码出来的视频帧是包含有frame gt pict type字段的 如果编码前不处理 x264会按照该类型强制编码 如果希望x264自动插入b帧编码 在编码前需要将frame gt pict typ
  • c语言什么是关键字,c语言关键字是什么

    c语言关键字是什么 c语言关键字又称为保留字 就是已被C语言本身使用 不能作其它用途使用的字 C语言简洁 紧凑 使用方便 灵活 ANSI C标准C语言共有32个关键字 9种控制语句 程序书写形式自由 区分大小写 把高级语言的基本结构和语句与
  • 关于项目启动;500报错问题

    HTTP Status 500 An exception occurred processing JSP page index jsp at line 1 type Exception report message An exception
  • 2017 年最推荐的五篇深度学习论文

    价值 思考 共鸣 简评 2017 年度最值得深入阅读的五篇深度学习相关论文 如果没读过的可以行动了 1 最酷视觉效果 使用 CycleGAN 在不成对图像集之间转换 论文 https arxiv org abs 1703 10593 目标
  • 用 clang 编译成 IR 汇编 和 目标机器汇编语言文件

    clang emit llvm c sum c o sum bc clang emit llvm S c sum c o sum ll clang S sum c o sum asm 一 C源文件 sum c int sum int x i
  • Redis基础

    Redis 简介 Redis 是完全开源免费的 遵守BSD协议 是一个高性能的key value数据库 Redis 与其他 key value 缓存产品有以下三个特点 Redis支持数据的持久化 可以将内存中的数据保存在磁盘中 重启的时候可
  • 更改/去除 a链接默认样式

    比较常见的一个需求 但是点击a链接的时候又不想让它变色 下面的代码就可以解决 a text decoration none important color C00017 important
  • 小白也能操作的“电脑恢复出厂设置”,windows8/10通用型

    出厂设置恢复到出厂时的默认状态 删除所有的文件和软件 在手机上很多朋友都会设置出厂设置 那么你们知道电脑如何恢复出厂设置吗 今天 我给大家带来了电脑恢复出厂设置的两种方法 一起来了解一下吧 电脑是我们当今社会发展的必备利器 各行各业都不开电
  • Markdown数学语法

    Markdown数学语法 文章目录 Markdown数学语法 1 基本格式 1 1 行内公式 1 2 块级公式 行间公式 1 3 角标 1 4 整体内容 1 5 多行公式 equation CSDN不支持 align CSDN不支持 支持a
  • 24点

    刚学c 的我是怎么解决判断24点问题的 本人大一狗 高中因为高考 浙江选考 学过vb 开学两周后 教c的老师突然在一节课教完if for switch语句 然后出了个挑战题 如何随意输入四个数判断能否用 计算出24点 有人写了几十行的if语
  • Java基础中的IO流

    一 IO流 IO 上传下载 写入写出 流 一连串流动的数据 以先入先出的方式进行流动 管道 以程序为中心 程序与网络 文件 服务器 数组 1 分类 1 按照流向 输入流 输出流 2 操作单元分 字节流 万能流 任何内容都可以转为字节 可以传