hello,大家好!我依旧是你们熟悉的槿凉。那么上周呢也是结识了很多咋们C平台的小伙伴,然后本周我的本地博主排名就到达了第二名,第一名也是我们学校的一位大三的学长,他非常厉害,目前已经拿到了网易的offer,真是非常羡慕呐! 那么,不能沉浸在这一丝丝喜悦当中,博客还是得继续更新,好了废话不多说,今天就来分享一下JAVA I/O篇的知识点,讲得不是很好,还希望小伙伴们多加指导啦!
定义:流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流两种。
输入流InputStream类是字节输入流的抽象类,它是所有字节输入流的父类,具体层次结构图如下:(掌握画黄线的地方即可)
输出流OutputStream类是字节输出流的抽象类,此抽象类是表示字节流的所有类的超类,其具体层次结构图如下:(同样,只掌握黄色标记部分即可)
注:输入输出流在遇到错误时都会引发IOException异常。(看不懂没关系,接下来的代码段就能理解了)
好,那么我们已经了解了输入输出流的基本概念,接下来我们讲File类
File类是java.io包中唯一代表磁盘文件本身的类,File类的对象主要用来获取文件本身的一些信息,如文件所在的目录,文件的长度,文件读写权限等。那么接下来我们看一个具体的例子:
packageyinghang; importjava.io.File; publicclassfile1 { publicstaticvoidmain(String[] args) { Filefile=newFile("D:\\word.txt"); // 创建文件对象if (file.exists()) { // 如果该文件存在file.delete(); // 将文件删除System.out.println("文件已删除"); // 输出的提示信息 } else { // 如果文件不存在try { // try语句块捕捉可能出现的异常file.createNewFile(); // 创建该文件System.out.println("文件已创建"); // 输出的提示信息 } catch (Exceptione) { e.printStackTrace(); } } } }
这个代码段的具体作用是向我们电脑的D盘根目录的word.txt文件中写入一句话,然后再读取出来输出在控制台上。(if else 语句的作用是判断D盘中是否有名为word的文件,如果有->删除,如果没有->创建一个名为word的文件)我们来看看具体运行结果:
这里我们提前创建好一个名称为word的文件我们来看运行结果:
好,这个时候我们打开D盘看一下:
D盘里确实被我们创建了一个名为word的文件。
是不是很有趣呢?哈哈哈 ,那有的小伙伴就要问了,那可不可以向该word文档里面写入我们想写入的内容呢? 答案当然是可以的!
这里我们来介绍一下文件输入/输出流!
即FileInputStream 和 FileOutputStream类是用来操作磁盘文件。那么这里我们借助这两个类向D盘根目录的word.txt文件中写入我们想写入的内容,然后读取出来输出在控制台上。
importjava.io.*; publicclassio { publicstaticvoidmain(String[] args) { // TODO 自动生成的方法存根Filefile=newFile("D:\\word.txt"); // 创建文件对象try { // 捕捉异常FileOutputStreamout=newFileOutputStream(file); // 创建FileOutputStream对象bytebuy[] ="人生苦短,及时行乐,吃喝玩乐,样样具占。".getBytes(); // 创建byte型数组out.write(buy); // 将数组中的信息写入到文件中out.close(); // 将流关闭 } catch (Exceptione) { // catch语句处理异常信息e.printStackTrace(); // 输出异常信息 } try { // 创建FileInputStream类对象FileInputStreamin=newFileInputStream(file); bytebyt[] =newbyte[1024]; // 创建byte数组intlen=in.read(byt); // 从文件中读取信息System.out.println("文件中的信息是:"+newString(byt, 0, len));// 将文件中的信息输出in.close(); // 关闭流 } catch (Exceptione) { e.printStackTrace(); } } }
显然,我们的代码是正确的。
同时这里我们再介绍一下FileReader 和 FileWriter 类,这两个类都只提供了对字节或字节数组的读取方法,这两个类对应了FileInputStream 和 FileOutputStream类。FileReader类顺序地读取文件,只要不关闭流,每次调用read()方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭。
我们来看一个具体的例子:
importjava.io.*; publicclassxie { publicstaticvoidmain(String[] args) { // TODO 自动生成的方法存根Filefile=newFile("D:\\word.txt"); // 创建文件对象try { FileWriterfw=newFileWriter(file); // 创建字符输出流Stringword="努力下去,你一定可以的,加油!!!"; // 写入的字符串fw.write(word); // 将字符串写入到文件中fw.close(); // 关闭流 } catch (IOExceptione) { e.printStackTrace(); } try { FileReaderfr=newFileReader(file);// 创建字符输入流charch[] =newchar[1024]; // 缓存字符数组intlen=fr.read(ch); // 将文件中的字符读入到缓存数组中System.out.println("文件中的信息是:"+newString(ch, 0, len));// 将字符转为字符串输出fr.close(); // 关闭流 } catch (IOExceptione) { e.printStackTrace(); } } }