当前位置: 首页 > 后端技术 > Java

Java的IO流技术详解

时间:2023-04-02 01:43:40 Java

什么是IO?首先我们看一下百度给出的解释。I/O输入/输出(Input/Output)分为两部分:IO设备和IO接口。i是写的,Input的第一个字母。o是输出,Output的第一个字母。IO也叫IO流,IO=stream,其核心是对文件的操作,针对字节和字符类型的输入输出流。IO分类IO流主要分为两大类,字节流和字符流。按照角色分类,可以分为输入流和输出流。流动?数据在电脑上有三种存储方式,一种是外存,一种是内存,还有一种是缓存。比如电脑上的硬盘、磁盘、U盘都是外存,电脑上还有内存条,缓存在CPU里面。外存的存储量最大,其次是内存,最后是缓存。但是从外存读取数据最慢,其次是内存,缓存最快。这里总结一下从外存读取数据到内存和从内存写数据到外存。对于内存和外存的理解,我们可以简单的理解为一个容器,即外存是一个容器,内存是另一个容器。那么如何将外部存储容器中的数据读取到内存容器中,又如何将内存容器中的数据存储到外部存储中呢?我们可以把这个整体想象成一个水池。出水管和注水管连接在水池中。Outflow相当于我们的输出流。注水相当于我们的输入流。文件(文件类)首先,如果我们需要使用IO流,我们肯定需要创建我们所说的“池”。如何创建它?我们直接创建一个File类对象。packageIoDemo;importjava.io.*;publicclassIoDemo{publicstaticvoidmain(String[]args){//createFileobjectFilefile=newFile("D:\\test.txt");}}actual说白了,这个对象就是用来存放一个IO流的文件地址的。对象创建后,没有任何操作,操作必须使用这个对象来调用方法。我们首先使用createNewFile()方法在我们上面的路径中创建文件。文件.createNewFile();请注意,定义文件路径时可以使用“/”或“\”。并且在创建文件时,如果目录中有同名文件,则会覆盖掉。因为有时候,我们的路径中可能已经存在对应的同名文件,所以我们需要使用exists()方法来判断文件是否已经存在。//创建一个File对象Filefile=newFile("D:\\test.txt");//创建文件try{//判断文件是否存在if(!file.exists()){file.createNewFile();}}catch(IOExceptione){e.printStackTrace();}其实File类中有很多方法,用法直接调用即可。当使用相应的方法。下面列出了一些常用的方法。①.创建方法    1.booleancreateNewFile()不存在返回true,存在返回false2.booleanmkdir()创建目录,如果上层目录不存在则创建失败    3.booleanmkdirs()创建一个多级目录。如果上级目录不存在,会自动创建  ②。删除方法    1。booleandelete()删除文件或目录。如果表示目录,则目录必须为Empty才能删除    2.booleandeleteOnExit()使用完成后删除文件Readable    3.booleancanWrite()判断文件是否可写    4.booleanexists()判断文件或目录是否存在    5.booleanisDirectory()判断路径是否为目录    6.booleanisFile()  判断是否为文件    7.booleanisHidden()  判断是否为隐藏文件    8.booleanisAbsolute()判断是否为绝对路径文件不存在判断 ④,获取方式    1.StringgetName()获取此路径所代表的文件或目录名    2.StringgetPath()将此路径名转换为路径名字符串    3.StringgetAbsolutePath()返回此抽象路径名的绝对形式    4.StringgetParent()//如果没有父目录则返回null    5.longlastModified()//获取最后一次修改的时间    6.longlength()返回此抽象路径名表示的文件的长度。    7.booleanrenameTo(Filef)重命名此抽象路径名表示的文件。    8.File[]liseRoots()//获取机器的盘符    9.String[]list()返回一个字符串数组,命名该抽象路径名表示的目录中的文件和目录。    10.String[]list(FilenameFilterfilter)返回一个字符串数组,命名该抽象路径名表示的目录中满足指定过滤器的文件和目录。字节流的使用我们现在已经构建了这个“池”,我们也可以通过方法来获取“池”的一些信息。接下来,我们可以尝试创建一组流。字节流相当于管道中输送的一滴水。我们可以把这个管道抽象地称为流。先来看看知乎上几位大佬的解释。大哥的解释中,蓝色是主要对应部分,红色是非对应部分,黑色虚线代表这些流一般需要配合使用。从上图可以看出,JavaIO中的字节流是非常对称的。让我们看一下这些字节流中的几类不对称性。当LineNumberInputStream主要完成从流中读取数据时,会得到对应的行号。至于何时何地分支,是由重分类主动决定的,原来并没有这样的行号。输出部分没有相应的部分。我们可以自己创建一个LineNumberOutputStream。第一次写的时候会有一个基准行号,以后每次遇到换行都会在下一行加上一个行号。好像也是可以的。它似乎不太受欢迎。PushbackInputStream的作用是检查最后一个字节,不满意就放入缓冲区。它主要用于编译器的语法和词法分析部分。输出部分中的BufferedOutputStream做几乎相同的事情。StringBufferInputStream已经被Deprecated,本身不应该出现在InputStream部分,主要是因为String应该属于字符流的范围。已被弃用,当然输出部分不再需要它了!它也被允许存在只是为了版本的向后兼容性。SequenceInputStream可以被认为是一个实用程序类,它将两个或多个输入流按顺序读取为一个输入流。完全可以从IO包中去掉,完全不影响IO包的结构,反而让它更“纯粹”——纯Decorator模式。PrintStream也可以看作是一个辅助工具。它主要可以向其他输出流或者FileInputStream写入数据,其内部实现还是缓冲的。它本质上是一个综合使用其他流的工具。也可以踢出IO包!System.out和System.out是PrintStream的实例。不完全学习视图听起来有点困难,让我们忽略这些高级用法。我们先来看看它是如何工作的。那又有人说了,你不学完全,以后不知道怎么用怎么办?答:其实你只需要掌握主要的方法即可,因为如果你需要实现一个非常有用的东西,一定要提前查阅相关资料,在日常开发中,很容易想出常用的。OutputStream(字节输出流)这个抽象类是所有表示输出字节流的类的超类。!!!这里的输出不是我们正常的输出。相反,它将字节写入文件,可以理解为将字节输出到文件。看看一些常用的方法。我们先来演示一下,如何使用字节输出流?//定义一个字符串值Stringstr="HelloWorld";稍后我们使用字节流将这个String写入我们的文件中。ETC!这里是字节流,如何直接写入String?嘿,我们使用String类中的getBytes()方法将String转换为字节数组。//将String值转换为字节数组byte[]bytes=str.getBytes();整个代码是这样的:packageIoDemo;导入java.io.*;publicclassIoDemo{publicstaticvoidmain(String[]args){//创建一个File对象Filefile=newFile("D:\\test.txt");//创建文件try{//判断文件是否存在if(!file.exists()){file.createNewFile();}}catch(IOExceptione){e.printStackTrace();}//定义一个字符串值Stringstr="HelloWorld";//创建字节流FileOutputStreamfos=null;try{//设置File对象(即地址)为FileInputStreamfos=newFileOutputStream(file);//将String值转换为字节数组byte[]bytes=str.getBytes();//循环将字节数组写入文件for(inti=0;i