之前写了一些有关Java知识点的基础知识,这一次开始总结一些新的知识点,有关Java中的流知识点。虽然学习很累,但是让人心里踏实。我始终坚信只有学习脚踏实地、才能够走的远!不积小流无以致千里,不积跬步无以至千里!
流的定义
首先我们来了解一下什么叫做流?
流是一个相对抽象的概念,所谓流就是一个传输数据的通道,这个通道可以传输相应类型的数据。进而完成数据的传输。这个通道被实现为一个具体的对象
在Java程序中,对于数据的输入输出操作以流Stream方式进行,JavaSE提供各种各样的类用于使用相同的方法获取不同类型的数据,程序中通过标准的方法输入或者输出数据。
输入流:从外部空间(文件、网络连接、内存块)读入字节序列的管道(对象)。
输出流:可以向外部空间(文件、网络连接、内存块)写入字节序列的管道(对象)。
流的分类
从Java不同版本上来说,流可以分为BIO、NIO和AIO三大类。Java 中的BIO、NIO和AIO理解为是Java语言对操作系统的各种I0模型的封装。
1.BIO即同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。
2.NIO即同步非阻塞,一个线程不断的轮询每个输入输出的状态改变,如果有状态发生了改变,则进行下一步的操作。
3.AIO即异步非阻塞I/O模型,无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。
按流向分为输入流和输出流:
可以从输入流读取数据但不能写,要从输入流读取数据,则必须有一个与这个流相关的字符源。
按传输单位分为字节流和字符流:
1.字节流从InputStream/OutputStream派生出来,以字节为基本处理单位,一般用于操作二进制数据,字节次序是有意义的
2.字符流从Reader/Writer派生出来的,以16位的Unicode码表示字符为基本处理单位,一般用于操作字符数据
按功能还可以分为节点流和过滤流:
1.节点流:负责数据源和程序之间建立连接,结点流对特定的地方读写
2.过滤流:用于给节点增加功能,过滤流使用结点流进行输入/输出并添加附加功能
字符流就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表以获取对应的文字。简单的说:字符流=字节流+编码表
1.字符流的两个顶层父类: Reader和Writer
2.字节流的两个顶层父类:InputStream和OutputStream
3.输入输出靠reader和writer, inputstream和outputstream四个类和子类支持
4.读入的内容有对象,字符,图像和声音等
注意:VO流是一类很宝贵的资源,使用完后必须调用close()方法关闭流并释放资源。在关闭流时只用关闭最外层的流。
File类
java.io.File用于封装和平台无关的文件夹和文件对象。
//获取一个文件夹的字节数(针对windows平台)
File ff=new File("file.txt");
//length():long 用于获取文件的字节数,若果不存在返回0
//一个汉字=2B
System.out.println(file.length()+"B");
常见的构造方法
1.File(String pathName)以path为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储
File ff=new File("dd.txt");//使用的是相对路径,这个路径将从项目的根目录开始算起
File ff=new File("d:/data/dd.txt");//使用的是绝对路径,从d:开始(windows系统)
string ss=system.getProperties().getProperty("user.dir");
system.out.print1n(ss); //D: \workspace\ecipse-2020\2022-01-04
2.File(String parent,String child)这里文件对象的路径为相对于parent路径的child路径,相当于parent+"/""+child
访问文件名的方法
getName():String 获取文件名称
getPath():String 获取路径,如果构建File时使用的是相对路径,则这里返回的就是相对路径;如果创建时参数为绝对路径,返回绝对路径。
getAbsolutePath():String 获取绝对路径
getParent():String 获取当前文件对象的上级File对象,如果构建文件对象时使用的是相对路径,则这里返回为null。
文件检测相关方法
canWrite():boolean 是否可写
canRead():boolean 是否可读
isFile():boolean 是否是文件,因为File对象可以封装文件和文件夹
isDirectory():boolean 是否为文件夹
isAbsolute():boolean 是否为绝对路径
isModified():long 文件的最后修改时间
常见操作
1.createNewFile():boolean 创建一个新文件【如果文件不存在则返回true,表示创建成功;如果文件已经存在则返回false,表示创建失败】
2.exists():boolean文件或者文件夹是否存在
3.length():long 获取文件大小,单位是字节,如果是文件夹则返回值没有指定
4.renameTo(File):boolean 修改文件或文件夹名称
5.delete():boolean 删除文件,也可以删除文件夹,要求文件夹为空,不能有文件和子文件夹
deleteOnExit():void退出系统时自动删除
6.目录操作
mkdir():boolean只能创建一层文件夹,如果创建d:/a1/a2/a3时,当父文件夹d:/a1/a2不存在时则创建失败
mkdirs():boolean自动创建多级文件夹
7.list():String[]获取当前文件夹所有的子文件信息
listFiles():File[]获取当前文件夹所有子文件信息,子文件为File对象
8.static listRoots():File[]列出系统所有的根路径
文件过滤器FilenameFilter
带参数的listFiles方法支持对于子文件进行过滤,只获取需要满足条件的文件对象。
FilenameFilter接口中包含一个accept(File dir,String name)方法,该方法用于对指定File的所有子目录或者文件进行迭代,如果方法返回true则list方法会获取该目录或者文件。