IO操作!~~~超 淦/详细 的3500字

news/2025/1/26 15:05:09/

目录

💕💕一、数据流

​编辑

为什么input是读取,output是写入?

💕💕二、InputStream 概述

😘😘1. 方法

😘😘2. FileInputStream 子类

👻👻①构造方法👻👻

👻👻②代码案例👻👻

                 代码1:试用 read()

                代码2:尝试读取中文字符

                 代码3:使用 Scanner 读取

💕💕三、OutputStream概述

😘😘1. 方法

😘😘2. FileInputStream 子类

👻👻1. 构造方法👻👻

👻👻2.代码案例👻👻

                代码1:写入文件

                代码2:利用 PrintWriter 这种高效的方法完成输出

 

 

一、数据流

文件的读写采用数据流的方式,类似于一个储水池,输入的一端叫做 输入流,输出的一端叫做 输出流。而输入流和输出流采用的是 不同的类。如下图的关系。

为什么input是读取,output是写入?

程序和运行时数据是在内存中驻留的,而 input,output都是相对内存来说 的,input是从磁盘读取到内存 ,output是从内存写到磁盘.

二、InputStream 概述

1. 方法

InputStream 只是一个抽象类,如果要创建实例化还需要具体的实现类。关于InputStream 的实现类有很多,而我们只关心从文件中读取,所以通常用 FileInputStream 实现

  • read() -从文件输入流中读取一个字节。
  • read(byte[] b) -从此输入流中读取最多b.length个字节的数据到一个字节数组中。
  • read(byte[] b, int off, int len) -从此输入流中读取最多len个字节的数据到一个字节数组中。

2. FileInputStream 子类

①构造方法

  • FileInputStream(File file) -创建文件输入流以从File对象读取。
  • FileInputStream(String name) -创建文件输入流以从指定的文件名读取。
  • FileInputStream(FileDescriptor fdObj) -创建从指定文件描述符读取的文件输入。

②代码案例

注意 !!!! 

~ ~ 为什么每次关闭代码一定要关闭文件?

  • 每个进程对应着一个PCB,而PCB里有一个文件描述符表(同一个进程中多个PCB共同使用一份文件描述符表),文件描述附表其实就相当于一个 数组\顺序表。每次进程打开一个文件,都会在这个表里创建一个项,这个项就表示一个文件。
  • 表的项最大容量,可以进行配置。
  • 如果关闭一个文件就相当于把表里对应的项 给释放掉,但是如果一直不关闭,就会一直占用。这就意味着一直打开都不关闭,就会导致 表项被耗尽~~这是一个非常严重的bug

~ ~ 所以才能每次都关闭呢?

1. 使用 close() , 但是要注意每次一定能执行到这一条语句

2. 使用 try-with-resource 结构(推荐使用!),try结束就能保证关闭文件,不用考虑是否执行到close 语句。(下面的代码案例就是这样写的) 

 代码1:试用 read()

public class Demo1 {public static void main(String[] args) throws IOException {try (InputStream stream = new FileInputStream("./文件部分/测试.txt")) {while (true) {int b = stream.read();System.out.print(b);if (b == -1) {//代表文件已经读完break;}}}}
}

文件中的内容是: Hello word.

输出结果是

代码2:尝试读取中文字符

    public static void main(String[] args) throws IOException {try (InputStream stream = new FileInputStream("./文件部分/测试.txt")){byte[] b = new byte[12];int len;while (true){len = stream.read(b);//每次读取一个字节,返回刚读到的字节if (len == -1){break;}}for (int i =0;i< b.length;i+=3){////每次读取3字节进行TTF-8解码,得到中文字符//利用String的构造方法完成,这个方法不是通用解法,知道就行String s = new String(b,i,3,"UTF-8");System.out.printf("%s",s);}}}

文件中的内容是: 你好中国

输出结果是:

 代码3:使用 Scanner 读取

  • Scanner(InputStream ,String charset) --使用charset字符集进行 is 的扫描读取
    public static void main(String[] args) throws IOException {try (InputStream is = new FileInputStream("./文件部分/测试.txt")){Scanner s = new Scanner(is);while (s.hasNext()){String ch = s.next();System.out.println(ch);}}}

 文件中的内容是: 你好中国

输出结果是:

三、OutputStream概述

1. 方法

  • write() -写入要给字节的数据。
  • read(byte[] b) -将b这个字符数组中的数据全部写入OS(OutputStream)中。
  • read(byte[] b, int off, int len) -将b这个字符数组中从off开始的数据写入OS中,一共写len个
  • close() -关闭字节流。
  • flush() -重要!我们知道I/O操作是比较慢的,大多的OutputStream为了减少设备操作的次数,在写数据的时候会 先暂时写入内存的一个指定区域,知道这个区域满了以后才一起写入设备中,而这个区域一般称为 缓冲区。但是因此我们的部分数据可能会留在缓冲区,因此我们在一段代码完成的时候,记得进行 flush(刷新) 操作。

2. FileInputStream 子类

1. 构造方法

  • FileOutputStream(File file) -从File对象读取。
  • FileOutputStream(String name) -从指定的文件名读取。
  • FileOutputStream(FileDescriptor fdObj) -从指定文件描述符读取。

2.代码案例

代码1:写入文件

    public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("./文件部分/测试.txt")){os.write('I');//传入一个字符os.write(' ');byte[] am = {'a','m',' '};//传入一个 byte类型的数组os.write(am);String str = "a boy.";byte[] boy = str.getBytes();//将字符串转换为 数组os.write(boy);//再从内存写入到文件中String s = "你呢?";byte[] b = s.getBytes("utf-8");//使用utf-8将其转换为中文传入os.write(b);os.flush();//不要忘记 flush}}

程序运行结束后,文件内容发生改变:

代码2:利用 PrintWriter 这种高效的方法完成输出

    public static void main(String[] args) throws IOException {//创建一个文件流实例os 与本地文件 对应try (OutputStream os = new FileOutputStream("./文件部分/测试.txt")){//这个构造是 把输入的内容存放到os这个实例中,才用utf-8编码try(OutputStreamWriter osWriter= new OutputStreamWriter(os,"utf-8")){//这个构造 封装了print等输入方法,print到osWrite这个实例中try (PrintWriter printWrite = new PrintWriter(osWriter)){printWrite.println("第一行!");printWrite.print("第二行\n");printWrite.flush();}}}}

程序运行结束后,文件内容发生改变:


http://www.ppmy.cn/news/583721.html

相关文章

常用汉字3500

阿啊哎哀唉埃挨癌矮艾爱碍安氨俺岸按案暗昂凹熬傲奥澳八巴叭吧拔把坝爸罢霸白百柏摆败拜班般颁斑搬板版办半伴扮瓣邦帮膀傍棒包胞宝饱保堡报抱豹暴爆卑杯悲碑北贝备背倍被辈奔本崩逼鼻比彼笔币必毕闭辟碧蔽壁避臂边编蝙鞭扁便变遍辨辩标表别宾滨冰兵丙柄饼并病拨波玻剥播脖伯驳…

3500/33 149992-01安全监测系统

3500/33 149992-01安全监测系统 前言&#xff1a;机械振动监测系统是一款通用的、拥有故障预警功能的设备在线监测系统。 集装箱码头作为水陆联运的枢纽站&#xff0c;是集装箱货物在转换运输方式的缓冲地&#xff0c;也是货物的交接地点&#xff0c;随着集装箱运输的发展&…

奋斗5年 从月薪3500到700万!

奋斗5年 从月薪3500到700万&#xff01; 文中主人公记述了在上海5年的事业及生活经历。曲折离奇&#xff0c;但心得颇多&#xff0c;在此与各位淘友分享&#xff0c;希望各位朋友能从中有所感悟。原帖如下?? 偶的忠告&#xff1a;要想学点什么&#xff0c;首先学会有耐心 …

2021(1500-3500价位段)手机推荐

手机推荐 点击标题直达京东自营店网页&#xff0c;图片包含近90天价格走势及历史最低价 1.RedmiK40-2499&#xff08;618价格&#xff1a;2299&#xff09; 配置&#xff1a; 1.处理器&#xff1a;高通骁龙870 2.电池续航&#xff1a;4520mAh 33W 3.摄像&#xff1a;4800W主摄…

解决Citrix workspace 3500报错

一 报错信息 当用户访问Citrix交付的资源时&#xff0c;无法启动并提示citrix workspace出现3500报错信息。 登录citrix资源报错 二&#xff1a;排查步骤 原因 1&#xff1a;对于多会话操作系统计算机&#xff0c;VDA 计算机正在达到您在以下负载管理策略之一中指定的最大负…

中科大遭钓鱼邮件攻击了?3500名师生中招

近日有中国科学技术大学学生在社交媒体发帖称&#xff0c;收到了学校发的“中秋免费月饼领取” 的邮件&#xff0c;但填写资料后没有领到月饼&#xff0c;却反倒把自己信息泄露了。 据新闻消息&#xff0c;9月8日上午&#xff0c;中科大网络信息中心程老师表示&#xff0c;这其…

二叉树OJ题:LeetCode--100.相同的树

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中第100道二叉树OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人…

excel批量插入图片url显示方法

步骤&#xff1a; 1.建个t.html页面&#xff0c;并写好格式数据 <html> <head></head> <body> <table border"1" align"center"> <!--这里excel数据粘贴处--></table> </html> 2.整理好excel的表格格式…