每周总结13
io
缩写。
Input:输入
Output:输出
计算机中,
1.输入就是往内存中装入硬盘上的数据。
数据传输方向。
Disk ----------------------> Memory Read;
这叫读入 read 读
memory 读 Disk 上的数据。
2.输出就是从内存中往硬盘上写数据,
Memory ----------> Disk Write.
叫做写 write.
3.读写
write and read. 读写的主体都是内存。内存读取硬盘中的数据,或者是内存往硬盘里面写入数据
客体都是硬盘。
像硬盘里面读,read,往硬盘里面写,write。
流
分类
按方向分: 输入输出流。
对象还是内存。输入内存是宾语客体,输出内存是主语主体。
内存读取数据。 往内存里存入,叫做输入,也称读 read. Input
内存取出数据。 从内存往外面拿,叫输出,也称写 write.Output.
输入输出(流),读取和写入。
按读取数据类型分。分为 字节流和字符流。
字节流每次读取一个字节,8bit 1byte.
字符流, 帮你包装好了。
每次读一个字符。
碰见英文 ‘a’ 就读一个字节。
碰见中文 “汉” 就读 2 byte。
自动识别,包装,可以中文英文一起读(其他语种可以吗?)
只要是文本文件还是可以的吧。
字节流可以读取任何形式的数据,如文本、音频、图像、视频等待。Everything.
而字符流。
只能读取纯文本形式的数据,也就是txt格式。
但是很方便快捷,效率高,因为相对比较单一。
以 Stream 结尾都是 字节流
Reader or或者 Writer 皆是 字符流。
流的步骤
1.确定源
2.打开流
3.操作 (流?)
4.关闭流
流常搭配使用,Input 对应 Output;
输出流一定要刷新,即是调用flush()方法。
有异常要捕获。(不捕获会终止吗,系统异常不需要我们管理吧。还是自定义了异常吧。
没有,系统的异常也可以由我们捕获处理,这样就不会上抛到JVM导致系统停止运行了吧。)
抽象类
InputStream , and OutputStream 始祖。
常用
fileInputStream 对应 fileOutputStream 。
读写文件file.
InputStream f1 = new fileInputStream(String or file)
String类型的参数表示:文件的路径
file类型的参数表示: 一个文件对象。
String 直接写文件路径即可。应该是写了方法自动识别,索引找到了对应文件。
文件操作完毕后必须关闭,否则长期保持对文件的连接状态,造成内存溢出的现象发生。
File类的对象可以是一个文件,也可以是一个路径(即目录),可以是具体存在的文件,也可以是尚未存在的文件。
//文本文件拷贝案例。
package com.XGX.Test.IO;
import java.io.*;
public class IO {
public static void main(String[] args){
FileReader fr = null;
FileWriter fw = null;
try {
//1.创建File类的对象,指明读入和写出的文件。
File srcFile = new File("C:\\Users\\XGX\\Desktop\\Hello.txt");
File destFile = new File("C:\\Users\\XGX\\Desktop\\Hello1.txt");
//这里填的是文件的路径,存储路径。在文件属性中找到就可以了。
//2.创建输入和输出流的对象。
fr = new FileReader(srcFile);//把之前已经指向你所指定文件的2个File类型的引用类型(指针)赋值过来。
fw = new FileWriter(destFile);//1.这里可以否直接写文件路径呢?一定要绕一下File对象吗。
//尝试了看来不行,他应该是没有这种传参方式,只能通过File类引用中间传输了。
//3.数据的读入和写出操作
char[] cbuf = new char[5];//字符数组
int len;//记录每次读入到cbuf数组当中的字符的个数
while (( len = fr.read(cbuf) ) != -1) {//什么意思
//read方法
//无参返回值是下一个字节的字节码,即默认读1byte。
//有参的read方法返回的是读取的字节数。那就是每次读5个。
//如果已经达到流的最后面就返回-1,即是不满足while循环条件终止操作。
fw.write(cbuf, 0, len);
//没有看懂这个中间参数0的意义是什么。
//write参数格式好像同read
//按照len长度进行读取。
//那就是len存在设定上限 cbuf的5个char类型?
System.out.print(cbuf);//读出并在控制台打印。
//这里相当于操作成功的标识,实际操作可以省略,但是为了反馈提示故做此。
}
}catch(Exception e){
e.printStackTrace();//是个异常就捕获了吧?然后打印某个相关信息。
}finally{
//4.关闭流资源
try{//关闭的操作依旧是放在try语句块中进行
if(fw != null)
fw.close();//先关掉了输出流。
}catch(IOException e){//Exception的子类异常。
e.printStackTrace();
}finally{
try{
if(fr != null)
fr.close();//然后再关掉输入流。重置到指向null.
}catch(IOException e){
e.printStackTrace();//关闭完成,无需finally了。
}
}
}
}
}
/*
java中操作流的基本过程可以总结为以下4个步骤:
1.声明流对象的引用变量,附初始值null;
2.在try代码块中完成对输入、输出流的操作。
3.在catch代码块中对可能抛出的异常进行捕获处理。
4.在finally代码块中关闭输入输出流,甘比流的操作也需要在try-catch代码块中书写。
*/