挑灯夜读——Java(基础):IO流
IO流
- IO流就是我们电脑频繁使用到的一个环节,也就是说我们电脑在无时无刻不在输入输出(IO流)。就像我们电脑通过键盘将我们想要键入的文字输入电脑内存中,结果一系列转码,将我们想要的结果显示在屏幕上。
File类
- 该类包含对文件的各项操作方式,比如创建、删除或其它操作
先通过该类让我们打入IO流的大门
- 下面是演示:
public class Demon1{
public static void main(String[] args){
//对文件的加载
File files = new File("D:\\1.txt");
//判断是否为文件,返回true或false
boolean flag = files.isFile();
//判断是否为文件夹
boolean flag1 = files.isDirectory();
if(flag){
System.out.println("文件存在");
}
else if(flag1){
System.out.println("文件夹存在");
}
}
}
- 这只是一个问D盘下的文件查看是否存在的代码。就像我们需要查询是否存在这个文件一样,同样的思考发现,这个文件还可以帮助我们判断文件是否存在,从而避免出现错误而无法处理。
public class Demon2{
public static void main(String[] args){
//对文件的加载
File files = new File("D:\\1.txt");
//创建该文件,一般用于发现该文件不存在后使用
boolean flag = files.createNewFile();
//返回该文件夹字节长度
int len = files.length();
//返回文件路径
String paths = files.getPath();
}
}
- 以上就是我们接触File类时使用最多的类,下面继续介绍我们的IO流
字节流
- 字节流,就是我们对数据的输入输出都是以字节为单位进行,当然这样的好处就是我们可以对任何文件进行处理,因为所以文件的数据都是通过字节来储存在内存磁盘中,但是听闻它的名称就知道,它的传输指定很慢,因为它是一个字节一个字节来传输文件。
输入
-
FileInputStream
该方法是从文件中获取字节,是相对于文件系统中。当然什么文件都可以,就像用来读取我们的图像数据,其参数可以为File文件对象(new File()的对象),或者是文件的路径path,其所有方法就不做过多的赘述,在idea或者Java api中都有详细介绍。 -
BufferedInputStream
该方法是将我们的字节添加到另一个输入流中,这个输入流就相当于运输车的概念,有了这辆车,我才能不使用一个字节一个字节传输数据,而是装好一辆车后,将该数据运过去,再装一辆车。如此反复直到数据结束。一般使用该方法来输入输出数据都会相当快,当然取决于你的车容量,太小作用没有发挥出来,太大转载较慢。 -
直接上代码:
-
FileInputStream输入:
public class Demon3{
public static void main(String[] args){
File files = new File("C:\\Users\\12978\\Desktop\\大三下学期课程\\自然语言处理\\题目.docx");
long startTime = System.currentTimeMillis();
FileInputStream fileInputStream = new FileInputStream(files);
int len = 0;
while((len = fileInputStream.read())!= -1){
// System.out.println(len);
}
fileInputStream .close();
long endTime = System.currentTimeMillis();
System.out.println((endTime - startTime)+"ms");
}
}
- 输出结果如下:
//读取整个文件需要3931ms,文件大小为1.21MB
3931ms
- BufferedInputStream输入:
public class Demon3{
public static void main(String[] args){
long startTime = System.currentTimeMillis();
FileInputStream ios = new FileInputStream("C:\\Users\\12978\\Desktop\\大三下学期课程\\自然语言处理\\自然语言处理个人实验报告.docx");
BufferedInputStream buffer = new BufferedInputStream(ios);
int len = 0;
byte[] car = new byte[1024];
while((len = buffer.read(car))!= -1){
//System.out.println(len);
}
buffer.close();
long endTime = System.currentTimeMillis();
System.out.println((endTime - startTime)+"ms");
}
}
- 不吹不黑,该方法的结果实在是惊人,如下所示:
2ms
异同点 | FileInputStream | BufferedInputStream |
---|---|---|
相同点 | 输入数据 | 输入数据 |
- | 继承InputStream | 继承InputStream |
- | 无数据返回-1 | 无数据也返回-1 |
不同点 | 参数为File或者Path | 参数为io |
- | 单字节传输 | 多字节传输(有大货车) |
- | 传输速度慢 | 速度快 |
- 好了,上面就是我们对这两个InputStream的子类做一个简单的介绍,明明我们使用BufferedInputStream的可能性更高一点,谁会去一个一个的传输字节数据呢?
- 但是我们学习FileInputStream的目的不就是为了给BufferedInputStream创建一个细管道?
- 目的很简单,就像上图一样,大概就知道具体意思了
输出
- FileOutputStream
该方法和上述的File方法很像,都是一个对字节进行处理,不过方向变为输出,也就是将我们的数据写入磁盘或者内存 - BufferedOutputStream
该方法和上述的Buffered方法类似,就不作过多赘述
小结
- 一、为输入流创建管道
就是new一个FileInputStream,创建一个管道,该管道对准指定文件
这个可以理解为细管道
对于BufferedInputStream来讲还要加一个粗管道
new该方法后,将细管道接入粗管道内
- 二、打开水龙头
就是我们通过一个方法read()来读取我们的数据,该数据像水一样被源源不断(当然没了就断了),经过管道的搭建送出来,由len承接
当然len是一个字节,也就是数字,该数字经过转换会变成原来的数据
- 三、关闭水龙头
关闭水龙头是一个良好的习惯,对于我们的电脑内存而言,是一个极其关键的一个步骤,不要忘记哦!!
对象.close()
字符流
输入
-
FileReader
reader一词,很明显就是读的意思,当然也就是我们的输入流,专门用来读取字符,也就是纯文本文件。既然说了是纯文本,那明显对于视频或者图片来说就无法传输了,因为这是该方法的特点,也可以用“这就是其特色”来说明。 -
或不多说,上代码:
public class Demon3{
public static void main(String[] args){
File file = new File("C:\\\\Users\\\\12978\\\\Desktop\\\\大三下学期课程\\\\自然语言处理\\\\自然语言处理个人实验报告.docx");
FileReader files = new FileReader(file);
long startTime = System.currentTimeMillis();
int len = 0;
while((len=files.read())!= -1){
System.out.println(len);
}
long endTime = System.currentTimeMillis();
System.out.println((endTime - startTime)+"s");
}
}
- 同样对于这样一个FileReader方法来说,对于1.21MB的文本文件,读取时间如下:
//读取该文本数据花费时间
5600ms
- BufferedReader
可以知道Buffered一词出现指定是有车的存在,该车就是我们所说的大管道,具体情况就不做过多赘述。 - 直接上代码
public class Demon3{
public static void main(String[] args){
FileReader file = new FileReader("C:\\\\Users\\\\12978\\\\Desktop\\\\大三下学期课程\\\\自然语言处理\\\\自然语言处理个人实验报告.docx");
BufferedReader files = new BufferedReader(file,1024);
long startTime = System.currentTimeMillis();
int len = 0;
char[] car = new char[1024];
while((len = files.read(car,0,car.length))!= -1){
System.out.println(len);
}
long endTime = System.currentTimeMillis();
System.out.println((endTime - startTime)+"s");
}
}
- 可以看到我们的容器大小为1024,也就是说理论上会快很多,那我们来看看最终的结果如何呢?
//这里只花费了131ms,可见其有多快速
131ms
在上面我们看到,我们创建的容器大小为1024,类型为char型,因为其是字符型,所以创建这样的数组
输出
- FileWriter和BufferedWriter,其原理不用多讲,和上面的字节型输出流类似
今天的内容到此结束!
每日杂谈
- 今天心情不错,就想起了在知乎看到的一篇关于中国“梧桐”形式,讲了讲中国现在和阿三打起来的可能性,最终的情况会怎样?总的来说,观点很客观,也解释了其实陷入持久战也会把我们拉入泥潭,最好的方法就是转换战场,来一个“梧桐”,把我们的海岸线扩至外海,这样某国的军事基地就完全在我们的射程范围之内了,所谓“炮弹覆盖的范围既是真理的范围”。