引言
本人大二计算机专业生,Java在b站大学的动力节点(对初学者非常友好)自学的,毕竟大学嘛,懂的都懂,不能依靠老师,还得自己来,在本章节内如中分享我自学IO流这章的的学习笔记,毕竟学习路上从不缺少经验的分享者,希望大家一键三连支持一下!!!!
学习IO流的基础知识(初学需看)
一、什么是IO流:(是硬件与内存之间的一个通道)
I :Input(硬件到内存的输入)
O:Output (从内存输出到硬件)
二、IO流的分类
按流的大小分类:1.字节流(单个字节传输的万能流,什么都能传输) 2:字符流:(以字符为单位传输的流,只能传输普通文本文件)
3。看到以"steam"结尾的都为字节流,以Reader/Writer 结尾的流都为字符流
三、四大家族的首领(abstract class)
java.io.InputStream 字节输入流
java.io.OutputStream 字节输出流
java.io.Reader 字符输入流
java.io.Writer 字符输出流
四、所有流都实现了 java.io.Closeable 接口,都是可关闭的,都有close()方法,
毕竟一个流开启后使用,基于内存和硬件之间的通道,占用内存资源,用完之后要关闭
五、 所有输出流都实现了: java.io.Flushable 接口,都是可刷新的,都有flush()方法
养成一个好习惯,输出流最终输出之后,一定要记得flush()刷新一下,
这个刷新表示将管道中未完成输出的数据强制输出完成(清空管道!!)。
六、java.io 包下主要掌握的流有16个:
文件专属:
java.io.FileInputStream(重点)
java.io.FileOutputStream(重点)
java.io.FileReader
java.io.FileWriter
转换流 :(将字节流转化为字符流)
java.io.InputStreamReader
java.io.OutputStreamWriter
缓存流专属:
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream
数据流专属:
java.io.DateInputStream
java.io.DateOutputSteam
标准输出流:
java.io.PrintWriter
java.io.PrintStream(重点)
对象专属流:
java.io.ObjectInputStream(重点)
java.io.ObjectOutputStream(重点)
这里有附图可帮助大家构造起IO这块的基本结构:
废话不多说我们进入今天的主题:FileInputStream和FileOutputSteam
测试代码加图片讲解
程序一:FileInputStream的主要内容
-----------------------------FileInputStream (字节读取流,万能流)
FileInputStream类读取文件:1.文件字节输入流,任何文件都可使用该流读。
2.字节方式:完成输入操作,硬盘——————>内存
3.利用while()循环以字节读文件内容:
int read()读取函数
- 中单个字节读太慢了
可以使用 int read(byte [] b ) 以b.length 长度读取
(注:read(byte [] b )的返回值不是具体的字节,而是读到的字节数量)
(注2:read读到的东西都存入了byte[] b 数组之中)
(注3:第二次调用read读到的后面的元素会将byte数组中前面的数组元素覆盖)
例:文件内有:abcdef,第一次读到abcd,第二次读到ef 则数组内元素为:efcd
5.java 中文件路径默认路径为项目的根,也就是和src项目同级
6.利用java.lang.String类的 构造方法可将 字节数组--------> 字符串
7.主要利用的Sting构造方法为: new String(byte[] b, int began ,int end)
该方法指定位置转换成为String字符串,(注:不包括 end下标元素)
8.//int available();// 可以获取文件内的字节个数,配合byte数组可以直接一次性读完(仅适用于文本较少的)
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamTest01 {
public static void main(String[] args) {
java.io.FileInputStream file=null;
int countRead=0;
byte[] bytes=new byte[4];
try {
file=new java.io.FileInputStream("TestIO03.txt");
//file.available();// 可以获取文件内的字节个数,配合byte数组可以直接一次性读完(仅适用于文本较少的)
//while()循环读到多少个就转化多少个
while((countRead=file.read(bytes))!=-1){
System.out.print(new String(bytes,0,countRead));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (file!=null){
try {
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
实验结果:
程序2 :FileOutputSteam的主要内容
FileOutputStream :文件输出流(字节) 内存————————>硬盘
主要构造方法: 1.new FileOutputStream(String s) 如果调用该构造方法,当调用write()方法的时候,
是把文件内容清空,重写编写 !!!!(慎用!)
2.new FileOutputStream(String s,Boolean b) b为true则调用write()方法则是在文件内容后面追加写入内容
3.调用构造方法后,当文件不存在的时候会自动新建该文件!!!!!!
4。写完内容记得调用flush()方法,将管道清空
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class FileOutputStreamTest01 {
public static void main(String[] args) {
FileOutputStream fileOutputStream=null;
try {
fileOutputStream=new FileOutputStream("TestFileOut.txt",true);
String s="我爱中国!!!!";
fileOutputStream.write(s.getBytes());//调用write(byte[] b)方法将数据写入文件
fileOutputStream.flush();// flush()清空管道
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream!=null){
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
运行前:
运行后:
自我总结:
新的知识点学习完后需要通过亲手敲代码,去实现一下,毕竟实践是检验真理的唯一标准,之后我也会更新IO流的其他内容放在JavaSE IO专栏中希望大家一键三连支持一下!!!