大家好= = 小白白来了。javase其实对于我们小白白而言最开始了解其概率和主要的一些用法和类就行。像集合深入,多线程哪里的轻量锁、重量锁等、以及IO流在网络编程方面的具体使用。反射到底有什么用。单例模式到底干什么的我们不用深究。上面我已经把FileInputStream、和FileOutputStream很具体的写了出来下面我将把I/O流这一整个部分的思维导图画出。
这个大总结是告诉你IO到底是什么。具体每个流操作有那些常用方法我会放在别的文档中讲
首先你得看过我之前得思维导图、四个基类的流是抽象类、Writer和Reader是处理字符流的inputStream和OutputStream是处理字节流的。
带了Buffered的叫做转换流只不过是在基础的四个实例流上套一个流。这个流有一些很好用的方法。并且最重要的是他会自带8kb缓存区。也就是在内存中这个流占了8kb缓存,所以每一次去磁盘读写数据都是最多可以读8kb的速度很快。
再其次输入转换流的作用就是将字节流转换为字符流。这里常常在网络编程中使用。记住在网络中只能传输字节流,那么中文字符怎么办呢?所以需要转换流。而且如果你们传入的字符是使用不同的编码集比如GBK和UTF-8就需要使用
这两个流帮我们转换不同编码集下的字符。
这就是流。说到底就是把文件变成字节流传输的一种类而已。
2.1、4大基类流
InputStream,字节输入流:抽象的
OutputStream:字节输出流:抽象的
Reader:字符输入流:抽象的
Writer:字符输出流:抽象的
2.2、IO流的操作步骤
step1:确定数据从哪到哪。文件信息。
step2:创建流:
流向:输入,输出
单位:字节,字符
子类流:文件,内存。。。。
step3:操作流
读取数据:输入
read()
写出数据:输出
write()
step4:关闭流
close()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4iEO6rjL-1589045101525)(img\IO流的结构.png)]
2.3、FileInputStream
用于以字节为单位,读取文件中的数据,到程序中。
1、构造方法:
FileInputStream(String name)
通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
FileInputStream(File file)
通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
read()–>int
每次读取一个字节。返回值就是读入的数据本身。如果读到文件的末尾了,-1。
read(byte[] bs)–>int
每次读取多个字节,最多是bs数组的长度个。返回值是本次读取的实际的字节个数。如果到达末尾,-1.
int read(byte[] bs, int off, int len)
从该输入流读取最多 len字节的数据为字节数组 。第一个参数表示要存储本地读取的数据的数组,第二个参数,表示从哪个下标开始存储,第三个参数是表示本次读取预计的读取数量。该方法的返回值是本次读取的实际数量。如果到达文件末尾,-1。
byte[] bs = new byte[3];//内存资源
数据源:250个字节
数组:100个长度
1次:100,剩150 读取100个
2次:100,剩50 读取100个
3次:50,读完了 读取50个
int read(byte[] bs) -->读多个,最多数组长度,实际看返回值,数据在数组中,将读取到的数据存入到数组中,默认从头开始存储。
在操作IO流读取本地文件的数据,提升效率。
硬盘和内存
read()–>每次读取一个数据,
read(byte[] bs)–> 1000
每次读取一个字节:
我有点感觉你想问为什么可以一次读一个字节为什么可以一次读8kb。?
你的计算机为什么叫64位、32位你知道吗?就是指你的CPU有多少条线路可以同时并行访问你的内存。所以你的内存实际上读一个字节或者是多个字节都是可以的。这么多字节去访问磁盘是一起访问的。所以就快,
???你又想问那你内存是可以同时取出来那你磁盘呢可以同时给这些内存写吗?
CPU发出指令>北桥>南桥>硬盘 硬盘寻道后读取数据>南桥>北桥>内存缓存>CPU最后到内存里读取数据处理。
确实是有这么个问题。磁盘和内存不可能无限大。磁盘和内存一样只不过速度慢你也可以理解为单位时间内读写内存少。
OK总体大纲讲完下面我会分几章写清楚这几个转换流如果你需要测试代码私信我。
在这里插入代码片
package com.qf.demo01;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;
public class Test2FileInputStream {
public static void main(String[] args) {
/*
* 需求:将haha.txt中的数据,读入到程序中,打印
* step1:数据从哪到哪,文件信息
* step2:创建流
* step3:操作流:读,写
* step4:关闭流
*/
//step1:准备文件信息:path,File
File file = new File("C:\\Ruby\\pro\\aa\\haha.txt");
FileInputStream fis = null;
try {
//step2:创建流
fis = new FileInputStream(file);
//step3:操作流:读取数据
// int data = fis.read();//效率太低
byte[] bs = new byte[3];
int len = 0;
while((len = fis.read(bs))!=-1){
//循环里,处理bs数组中的数据
// for(int i=0;i<len;i++){
// System.out.println((char)bs[i]);
// }
String s1 = new String(bs,0,len);
System.out.println(s1);
}
/*
System.out.println(Arrays.toString(bs));//[0, 0, 0]
//第一次读
int len = fis.read(bs);
System.out.println(Arrays.toString(bs));//[97, 98, 99]
System.out.println(len);//3
//遍历数组,打印数据
for(int i=0;i<bs.length;i++){
System.out.println((char)bs[i]);
}
//第二次读
len = fis.read(bs);
System.out.println(Arrays.toString(bs));//[100, 101, 102]
System.out.println(len);//3
for(int i=0;i<bs.length;i++){
System.out.println((char)bs[i]);
}
//第三次读
len = fis.read(bs);
System.out.println(Arrays.toString(bs));//[103, 104, 102]
System.out.println(len);//2
for(int i=0;i<len;i++){
System.out.println((char)bs[i]);
}
//第四次
len = fis.read(bs);
System.out.println(Arrays.toString(bs));
System.out.println(len);//-1
*/
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fis!= null){
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}