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却需要那么久
  • 答案就是!

  • 他有车
异同点 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型,因为其是字符型,所以创建这样的数组

输出

  • FileWriterBufferedWriter,其原理不用多讲,和上面的字节型输出流类似

今天的内容到此结束!

每日杂谈

  • 今天心情不错,就想起了在知乎看到的一篇关于中国“梧桐”形式,讲了讲中国现在和阿三打起来的可能性,最终的情况会怎样?总的来说,观点很客观,也解释了其实陷入持久战也会把我们拉入泥潭,最好的方法就是转换战场,来一个“梧桐”,把我们的海岸线扩至外海,这样某国的军事基地就完全在我们的射程范围之内了,所谓“炮弹覆盖的范围既是真理的范围”。