当前位置: 首页 > news >正文

IO流部分串讲

一、IO流的概念简析:

java将输入与输出比喻为"流",英文:Stream. 就像生活中的"电流","水流"一样,它是以同一个方向顺序移动的过程.只不过这里流动的是字节(2进制数据).所以在IO中有输入流和输出流之分,我们理解他们是连接程序与另一端的"管道",用于获取或发送数据到另一端.

Java I/O 这里的I和O指的是输入与输出

输入:Input 用来读取数据的

输出:Output 用来写出数据的

二、IO流常用类的分类:

2.1.分类方式1:按照读取数据到电脑内存和将电脑内存输出到内存之外,分为输入流和输出流

输入流: FileInputStream、 BufferedInputStream、 ObjectInputStream、InputStreamReader、 BufferedReader

输出流: FileOutputStream、BufferedoutputStream、 ObjectOutputStream、OutputStreamWriter、PrintWriter

2.2.分类方式2: 按照直接操作数据及间接操作数据的方式分为节点流和处理流或者低级流和高级流。 注: 处理流不能单独使用,需要封装一个节点流。

节点流/低级流: FileInputStream、FileOutputStream。

处理流/高级流: BufferedInputStream和BufferedoutputStream、 ObjectInputStream和ObjectOutputStream、InputStreamReader和OutputStreamWriter、 BufferedReader和PrintWriter

2.3.分类方式3: 按是否可以操作字符,分为字节流和字符流。

字节流: FileInputStream和FileOutputStream、 BufferedInputStream和BufferedoutputStream、 ObjectInputStream和ObjectOutputStream。

字符流: InputStreamReader和OutputStreamWriter、 BufferedReader和PrintWriter

三、API用法演示:

3.1.FileInputStream和FileOutputStream演示:


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;/*** 注:因为FileInputStream和 FileOutputStream直接操作的是文件* 不能封装其他字节流,所以无法用FileInputStream和 FileOutputStream* 操作idea控制台数据*/
public class FIS_FOSTestDemo {public static void main(String[] args) throws Exception {//fisWriteTestMethod();fisReadTestMethod();}//true:表示追加写入private static void fisWriteTestMethod() throws Exception {//1.创建文件字节输出流对象,用于操作"剑来.txt"FileOutputStream fos=new FileOutputStream("剑来.txt",true);//2.将一段文字转为字节数组, 然后用fos的write()方法写出到txt文件byte[] bytes=("故事主人翁,现文圣关门弟子。出生在三十六小洞天之一的"+"骊珠洞天。父母皆姓陈,陈平安5岁时,\n有人让他父亲知道了小镇的"+"秘密,就打碎了陈平安的本命瓷").getBytes();fos.write(bytes,0,bytes.length);bytes=("父母因受反噬而双双离世,其父被人(马婆婆的儿子,马苦玄的父亲)"+"害死,\n其母病重而死。陈平安本命瓷被打碎后,宛如黑暗中的萤火,"+"小镇的机缘纷纷向他涌来,但却留不住\n").getBytes();fos.write(bytes,0,bytes.length);//3.关闭文件字节输出流对象fos.close();System.out.println("写出文字到txt文件完毕!!!");}private static void fisReadTestMethod() throws IOException {//long time1=System.currentTimeMillis();//1.创建文件字节输入流对象,用于操作"剑来.txt"FileInputStream fis=new FileInputStream("xz.txt");//2.用fis的read()方法将输入流的数据读到一个字节数组中int c=0;//因为要读取txt文件中的汉字所以需要字节数组存储,//再将字节数组中的数据转化为String字符串//(如果只是读取英文文字就不需要字节数组了)byte[] dataBuffer=new byte[1024];//因为要读取txt文件中的汉字所以需要字节数组存储,//再将字节数组中的数据转化为String字符串//(如果只是读取英文文字就不需要字节数组了)while( (c=fis.read(dataBuffer))  != -1){System.out.print( new String(dataBuffer, 0 ,c));}//3.关闭文件字节输入流对象//(如果只是读取英文文字就需要像下边的写法就可以了)/*FileInputStream fis=new FileInputStream("english.txt");int c=0;while( (c=fis.read())  != -1){System.out.print( (char)c);}*/fis.close();//long time2=System.currentTimeMillis();//System.out.println(time2-time1);}
}

3.2.BufferedInputStream和BufferedOutputStream演示:


import java.io.*;/*** 测试缓冲字节输入流,和缓冲字节输出流* 因为它们俩可以封装节点流,所以可以用来操作idea控制台数据*/
public class BOS_BOSTestDemo2 {public static void main(String[] args) throws Exception {//fisWriteTestMethod1();//fisWriteTestMethod2();//fisReadTestMethod1();//fisReadTestMethod1();fisReadTestMethod2();}/**1.测试将String字符串数据用缓冲字节输出流写出到txt文件*/private static void fisWriteTestMethod1() throws Exception {//true:表示追加写入//1.创建文件字节输出流对象,并将其封装在缓冲字节输出流中,用于操作"剑来.txt"FileOutputStream fos=new FileOutputStream("剑来.txt",true);BufferedOutputStream bos=new BufferedOutputStream(fos);//2.将一段文字转为字节数组, 然后用bos的write()方法写出到txt文件byte[] bytes=("故事主人翁,现文圣关门弟子。出生在三十六小洞天之一的骊珠洞天。父母皆姓陈," +"陈平安5岁时,\n有人让他父亲知道了小镇的秘密,就打碎了陈平安的本命瓷").getBytes();bos.write(bytes,0,bytes.length);bytes=("父母因受反噬而双双离世,其父被人(马婆婆的儿子,马苦玄的父亲)害死,\n其母病重而死。" +"陈平安本命瓷被打碎后,宛如黑暗中的萤火,小镇的机缘纷纷向他涌来,但却留不住\n").getBytes();bos.write(bytes,0,bytes.length);//注意:缓冲字节输出流中也有一个字节缓冲区,会先将bytes字节数组中的数据//暂存到缓冲字节输入流中的字节缓冲区, 填满缓冲区后再写出到txt文件中//(所以用BufferedOutputStream缓冲字节输入流比单纯用FileOutputStream的效率高// 类似于先将数据暂存到一个卡车中,然后拉走// <FileOutputStream相当于一次只拉一点点儿,不是一次拉一车>),//(如果用time2-tim1 再换一个更大的txt文件,就会发现BufferedOutputStream比FileOutputStream效率更高)//3.关闭缓冲字节输出流对象bos.close();System.out.println("写出文字到txt文件完毕!!!");}/**2.测试将String字符串数据用缓冲字节输出流写出到idea控制台*/private static void fisWriteTestMethod2() throws Exception {//true:表示追加写入//1.创建文件字节输出流对象,并将其封装在缓冲字节输出流中,用于操作"剑来.txt"BufferedOutputStream bos=new BufferedOutputStream(System.out);//2.将一段文字转为字节数组, 然后用bos的write()方法写出到txt文件byte[] bytes=("故事主人翁,现文圣关门弟子。出生在三十六小洞天之一的骊珠洞天。父母皆姓陈," +"陈平安5岁时,\n有人让他父亲知道了小镇的秘密,就打碎了陈平安的本命瓷").getBytes();bos.write(bytes,0,bytes.length);bytes=("父母因受反噬而双双离世,其父被人(马婆婆的儿子,马苦玄的父亲)害死,\n其母病重而死。" +"陈平安本命瓷被打碎后,宛如黑暗中的萤火,小镇的机缘纷纷向他涌来,但却留不住\n").getBytes();bos.write(bytes,0,bytes.length);//注意:缓冲字节输出流中也有一个字节缓冲区,会先将bytes字节数组中的数据//暂存到缓冲字节输入流中的字节缓冲区, 填满缓冲区后再写出到txt文件中//(所以用BufferedOutputStream缓冲字节输入流比单纯用FileOutputStream的效率高// 类似于先将数据暂存到一个卡车中,然后拉走// <FileOutputStream相当于一次只拉一点点儿,不是一次拉一车>),//(如果用time2-tim1 再换一个更大的txt文件,就会发现BufferedOutputStream比FileOutputStream效率更高)//3.关闭缓冲字节输出流对象bos.close();System.out.println("写出文字到txt文件完毕!!!");}/** 3.测试从txt文件中,读取String字符串数据并打印*/private static void fisReadTestMethod1() throws IOException {//long time1=System.currentTimeMillis();//1.创建文件字节输入流对象,然后将其封装在缓冲字节输入流对象中,用于操作"剑来.txt"FileInputStream fis=new FileInputStream("剑来.txt");BufferedInputStream bis=new BufferedInputStream(fis);//2.用bis的read()方法将输入流的数据读到一个字节数组中int c=0;//因为要读取txt文件中的汉字所以需要字节数组存储,//再将字节数组中的数据转化为String字符串//(如果只是读取英文文字就不需要字节数组了)//注意:缓冲字节输入流中也有一个字节缓冲区,会先将文件中的数据//读取到缓冲字节输入流中的字节缓冲区, 填满缓冲区后再挪到dataBuffer数组//(所以用BufferedInputStream缓冲字节输入流比单纯用FileInputStream的效率高// 类似于先将数据暂存到一个卡车中,然后拉走// <FileInputStream相当于一次只拉一点点儿,不是一次拉一车>),//(如果用time2-tim1 再换一个更大的txt文件,就会发现BufferedInputStream比FileInputStream效率更高)//外边的dataBuffer此时只起到为了积攒汉字字符串的作用(两个字节组成一个汉字)//如果txt文件全是英文,则就不需要dataBuffer数组byte[] dataBuffer=new byte[1024];while( (c=bis.read(dataBuffer))  != -1){System.out.print( new String(dataBuffer, 0 ,c));}bis.close();//long time2=System.currentTimeMillis();//System.out.println(time2-time1);}/**4.测试用缓冲字节输入流从idea控制台读取文字并打印* (从控制台输入一个 就立即用缓冲字节输入流读取这个信息并打印,* 因为没有关闭System.in控制台输入流所以可以无限输入并读取)* 因为bis.close()方法内不会关闭System.in控制台输入流,所以可以无限输入并读取*/private static void fisReadTestMethod2() throws IOException {//long time1=System.currentTimeMillis();//1.创建文件字节输入流对象,然后将其封装在缓冲字节输入流对象中,用于操作"剑来.txt"BufferedInputStream bis=new BufferedInputStream(System.in);//2.用bis的read()方法将输入流的数据读到一个字节数组中int c=0;byte[] dataBuffer=new byte[1024];while( (c=bis.read(dataBuffer))  != -1){System.out.print( new String(dataBuffer, 0 ,c));}bis.close();//long time2=System.currentTimeMillis();//System.out.println(time2-time1);}
}

3.3.BufferedReader和PrintWriter按行操作的字符流演示:


import java.io.*;/**测试BufferedReader的按行读取的方法readLine(), 和PrintWriter按行写的方法println()*/
public class BR_PW_TestDemo1 {public static void main(String[] args) throws Exception {writeLineTest();readLineTest();}/**1.缓冲字符输出流PrintWriter:  测试将电脑内存数据写出到电脑硬盘txt文件*/private static void writeLineTest() throws FileNotFoundException {/*FileOutputStream fos=new FileOutputStream("仙剑.txt");OutputStreamWriter osw=new OutputStreamWriter(fos);PrintWriter pw=new PrintWriter(osw);*/// A.PrintWriter创建对象时, 也可以调用具有一个参数且类型为Writer的构造方法来传入一个字符转换流// 注: 字符转换流创建时需要传入一个字节流对象//PrintWriter pw=new PrintWriter(new FileOutputStream("仙剑.txt"));// B.PrintWriter创建对象时, 也可以调用具有一个参数且类型为OutputStream的构造方法来传入一个字节输出流PrintWriter pw=new PrintWriter("仙剑.txt");// C.PrintWriter创建对象时, 可以调用具有一个String参数的构造方法可以直接指定文件名pw.println("仙剑1");pw.println("仙剑2");pw.println("仙剑3");System.out.println("向仙剑.txt文件写出数据完毕!!!!!!!!!!");pw.close();}/**2.缓冲字符输入流BufferedReader:  测试读取硬盘txt文件的数据到电脑内存*/private static void readLineTest() throws Exception {FileInputStream fis=new FileInputStream("剑来.txt");InputStreamReader isr=new InputStreamReader(fis);BufferedReader br=new BufferedReader(isr);// readLine(): 可以一次读一行文字String c="";while( (c=br.readLine())   !=  null){System.out.println(c);}br.close();}
}

3.4.BufferedReader和PrintWriter操作控制台的案例演示:


import java.io.*;/**测试BufferedReader的按行读取idea控制台数据的方法readLine(),和PrintWriter按行向idea控制台写数据的方法println()*/
public class BR_PW_TestDemo2 {public static void main(String[] args) throws Exception {//运行提示:要测试哪个方法就放开此方法(注释掉另一个方法)writeLineTest();//readLineTest();}/**1.缓冲字符输出流PrintWriter:* 测试将电脑内存数据用println()按行写出到idea控制台* System.out:代表向idea控制台输出数据的字节输出流*/private static void writeLineTest() throws FileNotFoundException {PrintStream out=System.out;//代表向idea控制台输出数据的输出流PrintWriter pw=new PrintWriter(out);//创建PrintWriter对象时可以调用具有一个参数且类型为//OutputStream的构造方法来传入一个字节输出流pw.println("仙剑1");pw.println("仙剑2");pw.println("仙剑3");pw.close();out.close();//关闭System.out控制台输出流(不会pw.close()方法中关闭System.out流)//不关闭的话本方法会一直运行(不会结束<System.out输出流一直占用cpu>)}//本方法的运行效果就是: 将三行文字输出到idea控制台/**2.缓冲字符输入流BufferedReader:* 测试读取idea控制台数据到电脑内存* System.in:代表从idea控制台读取数据的字节输入流*/private static void readLineTest() throws Exception {InputStreamReader isr=new InputStreamReader(System.in);BufferedReader br=new BufferedReader(isr);// readLine(): 可以一次读一行文字String c="";while( (c=br.readLine())   !=  null){System.out.println(c);}br.close();}//本方法的运行效果如下://你好 //用户输入//你好 //本行打印//程序读取上一行的数据并在本行打印//hello //用户输入//hello //本行打印//程序读取上一行的数据并在本行打印//离离原上草 //用户输入//离离原上草 //本行打印//程序读取上一行的数据并在本行打印
}

四、练习案例:

4.1.FileInputStream 和FileOutputStream 实现文件复制:

public static void main(String[] args)throws  Exception{//1.创建文件字节输入流对象,用于读取"剑来.txt"//创建文件字节输出流对象,用于将读取的数据写出到生成//的一个复制出来的"剑来_bak.txt"FileInputStream fis=new FileInputStream("剑来.txt");FileOutputStream fos=new FileOutputStream("剑来_bak.txt",true);//2.用文件字节输入流fis的read()方法将输入流的数据读到一个字节数组中//然后立即用文件字节输出流fos的write()方法将字节数组中的数据写出到bak文件int c=0;while( (c=fis.read())  != -1){fos.write(c);fos.flush();//刷新缓冲区,将缓冲区中的数据强制写出到bak文件}//3.关闭文件字节输入流对象和文件字节输出流对象fos.close();fis.close();
}

注: 因为FileInputStream 和FileOutputStream 必须直接封装一个String文件路径或者封装一个File对象, 所以不能操作idea控制台数据。

4.2.BufferedOutputStream和BufferedOutputStream实现文件复制及读取控制台数据并向控制台输出数据:

A.文件复制:

/**1.测试用缓冲字节输入流和缓冲字节输出流复制文件*/
private static void bos_bosCopyTestMethod1() throws Exception{//1.创建文件字节输入流对象,然后将其封装在缓冲字节输入流对象中,用于读取"剑来.txt"//创建文件字节输出流对象,并将其封装在缓冲字节输出流中,用于将读取的数据写出到生成//的一个复制出来的"剑来_bak.txt"FileInputStream fis=new FileInputStream("剑来.txt");BufferedInputStream bis=new BufferedInputStream(fis);FileOutputStream fos=new FileOutputStream("剑来_bak.txt",true);BufferedOutputStream bos=new BufferedOutputStream(fos);//2.用缓冲字节输入流bis的read()方法将输入流的数据读到一个字节数组中int c=0;while( (c=bis.read())  != -1){bos.write(c);bos.flush();//刷新缓冲区,将缓冲区中的数据强制写出到bak文件}//注意:缓冲字节输出流中也有一个字节缓冲区,会先将bytes字节数组中的数据//暂存到缓冲字节输入流中的字节缓冲区, 填满缓冲区后再写出到txt文件中//(所以用BufferedOutputStream缓冲字节输入流比单纯用FileOutputStream的效率高// 类似于先将数据暂存到一个卡车中,然后拉走// <FileOutputStream相当于一次只拉一点点儿,不是一次拉一车>),//(如果用time2-tim1 再换一个更大的txt文件,就会发现BufferedOutputStream比FileOutputStream效率更高)bos.close();bis.close();
}

B.读取控制台数据并将读取的数据输出:

/**2.测试用缓冲字节输入流读取idea控制台数据和缓冲字节输出流将读取的数据再写出到idea控制台*/
private static void bos_bosCmdOpeTestMethod2() throws Exception{//1.创建文件字节输入流对象,然后将其封装在缓冲字节输入流对象中,用于读取"剑来.txt"//创建文件字节输出流对象,并将其封装在缓冲字节输出流中,用于将读取的数据写出到生成//的一个复制出来的"剑来_bak.txt"BufferedInputStream bis=new BufferedInputStream(System.in);BufferedOutputStream bos=new BufferedOutputStream(System.out);//2.用缓冲字节输入流bis的read()方法将输入流的数据读到一个字节数组中int c=0;while( (c=bis.read())  != -1){bos.write(c);bos.flush();//刷新缓冲区,将缓冲区中的数据强制写出到bak文件}//注意:缓冲字节输出流中也有一个字节缓冲区,会先将bytes字节数组中的数据//暂存到缓冲字节输入流中的字节缓冲区, 填满缓冲区后再写出到txt文件中//(所以用BufferedOutputStream缓冲字节输入流比单纯用FileOutputStream的效率高// 类似于先将数据暂存到一个卡车中,然后拉走// <FileOutputStream相当于一次只拉一点点儿,不是一次拉一车>),//(如果用time2-tim1 再换一个更大的txt文件,就会发现BufferedOutputStream比FileOutputStream效率更高)bos.close();bis.close();
}

测试:

public static void main(String[] args) throws Exception {bos_bosCopyTestMethod1();bos_bosCmdOpeTestMethod2();
}

4.3.BufferedReader和PrintWriter按行进行文件复制及读取控制台数据并打印到控制台。

A.按行进行文件复制

/**1.一个BufferedReader和PrintWriter按行复制的案例*/
private static void BR_PWCopy_TestMethod1()throws Exception {//1.构建: 缓冲字符输入流和缓冲字符输出流对象FileInputStream fis=new FileInputStream("剑来.txt");InputStreamReader isr=new InputStreamReader(fis);BufferedReader br=new BufferedReader(isr);PrintWriter pw=new PrintWriter("剑来_bak.txt");//注:PrintWriter创建对象时, 可以调用具有一个String参数的构造方法可以直接指定文件名//2.用缓冲字符输入流的readLine()方法读取一行文字,//然后立即用缓冲字符输出流的println()方法写出本行文字到bak文件(实现复制),直到读完为止String strLine="";while( (strLine=br.readLine())   !=  null){pw.println(strLine);pw.flush();}//3.关闭缓冲字符输入流和缓冲字符输出流对象br.close();pw.close();
}

B.读取控制台数据并打印到控制台

/**2.测试用缓冲字符输入流的readLine()按行读取idea控制台数据* 并用缓冲字符输出流将读取的数据再写出到idea控制台*/
private static void BR_ReadCMD_PW_Print_TestMethod2()throws Exception{//1.构建: 缓冲字符输入流(操作idea控制台的数据)和//缓冲字符输出流对象(将数据写出到idea控制台)InputStreamReader isr=new InputStreamReader(System.in);BufferedReader br=new BufferedReader(isr);//System.in字节输入流: 用于读取idea控制台的数据//System.out字节输出流: 用于写出数据到idea控制台OutputStreamWriter osw=new OutputStreamWriter(System.out);PrintWriter pw=new PrintWriter(osw);//2.用缓冲字符输入流的readLine()方法读取一行文字,//然后立即用缓冲字符输出流的println()方法写出本行文字到控制台,直到读完为止String strLine="";while( (strLine=br.readLine())   !=  null){pw.println(strLine);pw.flush();}//3.关闭缓冲字符输入流和缓冲字符输出流对象br.close();pw.close();
}

测试:

public static void main(String[] args) throws Exception {BR_PWCopy_TestMethod1();BR_ReadCMD_PW_Print_TestMethod2();
}

http://www.lryc.cn/news/487995.html

相关文章:

  • Excel——宏教程(2)
  • unity 中 RectTransform 的常用几个属性
  • 项目-摄像
  • 摄像机ISP和DSP的区别?
  • Ubuntu24安装配置NDK
  • 【Next】中间件
  • Vulnhub靶场案例渗透[11]- Momentum2
  • STM32设计防丢防摔智能行李箱-分享
  • Vue Mixin混入机制
  • 数据库类型建表
  • iOS 18 导航栏插入动画会导致背景短暂变白的解决
  • 深度学习之人脸检测
  • 解决前后端发版本时候,手动清除浏览器缓存
  • mysql8.4+mysql router读写分离
  • 鸿蒙NEXT开发-用户通知服务的封装和文件下载通知
  • RHCE——系统的延迟任务及定时任务
  • ForEach刷新UI机制
  • 机器学习(贝叶斯算法,决策树)
  • 实验十三 生态安全评价
  • 二级等保要求及设备有哪些?
  • 无人机的动力系统节能——CKESC电调小课堂12
  • 人机打怪小游戏(非常人机)
  • SpringBoot 集成 Sharding-JDBC(一):数据分片
  • django-ninja 实现cors跨域请求
  • 【论文阅读】InstructPix2Pix: Learning to Follow Image Editing Instructions
  • 常用在汽车PKE无钥匙进入系统的高度集成SOC芯片:CSM2433
  • 【第四课】rust声明式宏理解与实战
  • 渗透测试--Linux下的文件传输方法
  • 浅议Flink中的通讯工具: Akka
  • 基于YOLOv8深度学习的独居老人情感状态监护系统(PyQt5界面+数据集+训练代码)