当前位置: 首页 > news >正文

IO模型与NIO基础

File类

      File类主要是JAVA为文件这块的操作(如删除、新建等)而设计的相关类File类的包名是java.io,其实现了Serializable, Comparable两大接口以便于其对象可序列化和比较

创建一个文件/文件夹
删除文件/文件夹
获取文件/文件夹
判断文件/文件夹是否存在
对文件夹进行遍历
获取文件的大小

      File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
重点:记住这第三个单词
file——文件
directory——文件夹/目录
path——路径

绝对路径————是一个完整的路径
以盘符( 比如C:)开始的路径
c:\a.txt
c:\demo\b.txt相对路径————是一个简化的路径
相对指的是相对于当前项目的根目录
如果使用当前项目的根目录,路径可以简化书写
D:\java\Java语言高级\File类\File类\File类的概述.avi–>简化为——File类的概述.avi(可以省略项目的根目录)注意
路径是不区分大小写
路径中的文件名称分隔符widows使用反斜杠,反斜杠是转义字符,`两个反斜杠代表一个普通反斜杠。

File类的静态属性

static String pathSeparator——与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
static char pathSeparatorChar——与系统有关的路径分隔符。
windows下是分号,Linux下是冒号
static String Separator——与系统有关的默认名称分隔符,它被表示为一个字符串。
static char SeparatorChar——与系统有关的默认名称分隔符。
windows下是 \,Linux下是 /
public class filetest {public static void main(String[] args) {System.out.println(File.pathSeparator);  //系统路径分隔符,win是分号,liunx是冒号System.out.println(File.separator);}
}

在这里插入图片描述

File类的构造方法

File(String pathname)——通过将给定路径名字符串转换为抽象路径名来创建一个新的File实例。
参数

String pathname————字符串的路径名称
路径可以是以文件结尾,也可以是以文件夹结尾(win中文件有扩展名就是文件平)。
路径可以是相对路径(以项目根目录),也可以是绝对路径。
路径可以是存在的,也可以是不存在的。
创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况。
public class filetest {public static void main(String[] args) throws IOException {File file = new File("xiong.txt");file.createNewFile();   //只是文件名的话,文件创建放在项目的根目录下。File file2 = new File("xiong");file2.createNewFile();file2.mkdir();}
}

在这里插入图片描述
File(String parent, String child)——根据parent路径名字符串和child路径名字符串来创建一个新的File实例。

参数————————把路径分成了两部分
String parent————父路径,该路径中的文件夹是已存的,不存在会报错
String child—————子路径
好处
父路径和子路径可以单独书写,使用起来非常灵活;父路径和子路径都可以变化。
public class filetest {public static void main(String[] args) throws IOException {File file = new File("C:\\abc\\","ccc.txt");file.createNewFile();System.out.println(file.getAbsolutePath());}
}

在这里插入图片描述

File(File parent, String child)——根据parent路径名字符串和child路径名字符串来创建一个新的File实例。

好处
父路径和子路径可以单独书写,使用起来非常灵活;父路径和子路径都可以变化。
父路径是File类型,可以使用File的方法对路径进行一些操作,在使用路径创建对象。
File fileparent = new File("c:\\abc");fileparent.mkdir();File file = new File(fileparent,"ccc.txt");file.createNewFile();System.out.println(file.getAbsolutePath());

File类中访问文件名相关的常用方法
public String getName()————返回此File标识的文件或目录的名称。
public String getPath()————将此File转换为路径名字符串。
public String getAbsolutePath()————返回此File的绝对路径名字符串,返回的是绝对路径。
public String getParent()————返回File对象所对应的目录(最后一级子目录)的父目录名称。
public boolean renameTo(File newName)————重命名此File对象所对应的文件或目录,成返回true
File类检查文件的相关常用方法
public boolean exists()————此File表示的文件或目录是否实际存在 。
public boolean isDirectory()————此File表示的是否为目录 。
public boolean isFile()————此File表示的是否为文件 。
public canWrite()————此File是否可写
public canRead()————此File是否可读
public isAbsolute()————此判断创建File对象时是不是用的是绝对路径
获取文件常规信息的常用方法
public long lastModified()————返回文件的最后修改时间。
public long length()————返回文件内容的长度。

File类创建删除文件的常用方法
public boolean creatNewFile()——当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
creatNewFile声明抛出了IOException,我们调用这个方法,就必须处理这个异常,要么throws,要么try catch
public boolean delete()——删除由此File表示的文件或目录。
此方法,可以删除构造方法路径中给出的文件/文件夹。注意delete方法直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎。
public boolean mkdir()——创建由此File表示的目录。
创建单级空文件夹
public boolean mkdirs()——创建由此File表示的目录,包括任何必需但不存在的父目录。
既可以创建单级空文件夹,也可以创建多级文件夹

File类遍历(文件夹)目录功能
public String[ ] list( )——返回一个String数组,表示该File目录中的所有子文件或子目录。
public File[ ] listFiles( )——返回一个File数组,表示该File目录中的所有子文件或子目录。
注意
list方法和listFiles方法遍历的是构造方法中给出的目录。
如果构造方法中给出的目录的路径不存在,会抛出空指针异常。
如果构造方法中给出的路径不是一个目录,也会抛出空指针异常。

public class filefind {public static void main(String[] args) {File file=new File("C:\\Users\\Administrator\\Desktop\\STSWORKSPACE\\EduSystem");String[] fileNames = file.list();File[] files = file.listFiles();for(String filename:fileNames){System.out.println(filename);}for(File subfile:files){System.out.println(subfile);}}
}
----------------------------------------------------------------------.classpath
.mymetadata
.project
.settings
src
WebRoot
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\.classpath
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\.mymetadata
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\.project
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\.settings
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\src
C:\Users\Administrator\Desktop\STSWORKSPACE\EduSystem\WebRoot

文件过滤器的原理和使用
          在File类中有两个listFiles重载的方法,方法的参数传递的就是过滤器。
          File[ ] listFiles(FilesFilter filter)
java.io.FilesFilter 接口————用于抽象路径名(File对象)的过滤器。我常通过内部类的方式执行accept方法。
FilesFilter 接口里包含了一个抽象方法:boolean accept(File pathname)
参数
File pathname———使用listFiles方法遍历目录,得到的每一个文件对象。

例:找到一个目录下所有扩展名为.java的文件,并打印其绝对路径

public class filefind {public static void main(String[] args) {File file=new File("C:\\Users\\Administrator\\Desktop\\STSWORKSPACE\\EduSystem");//文件过滤器,筛选想要的文件getJavaFiles(file);}//获得所有.java文件public static void getJavaFiles(File file){if(!file.isDirectory()){return;}//是文件夹,进一步扫描File[] files = file.listFiles(new FileFilter() {@Overridepublic boolean accept(File subFile) {if(subFile.isDirectory()) return true;elsereturn subFile.getName().toLowerCase().endsWith(".java");}});for(File rsFile:files){if(rsFile.isDirectory()){getJavaFiles(rsFile);              //递归,如果找到的子文件还是文件夹的话,再找}else{System.out.println(rsFile);       //输入文件的绝对路径}}}
}

          File[ ] listFiles(FilenameFilter filter)
java.io.FilenameFilter 接口————实现此接口的类实例可用于过滤文件名。
FilenameFilter接口里包含了一个抽象方法:boolean accept(File dir,String name)
参数
File dir ——————构造方法中传递的被遍历的目录
String name————使用lisFiles方法遍历目录,获取的每一个文件/文件夹的名称。

java IO流

Java IO流的概念
      大多数应用程序都需要实现与设备之间的数据传输,例如键盘可以输入数据,显示器可以显示程序的运行结果等。
      在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象的表述为“流”。
      Java中的“流”都位于java.io包中,称之为IO(输入输出)流。
输入流和输出流是相对于内存设备而言的,将外设中的数据读取到内存中即输入,将内存的数据写入到外设中即输出。
注:java的输入流主要是InputStream和Reader作为基类,而输出流则是主要由outputStream和Writer作为基类。它们都是一些抽象基类,无法直接创建实例。
      字节流和字符流的用法几乎完成全一样,区别在于字节流和字符流所操作的数据单元不同,
字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为16位的字符。
字节流主要是由InputStream和outPutStream作为基类,而字符流则主要有Reader和Writer作为基类。

按照流的角色划分为节点流和处理流.
      可以从/向一个特定的IO设备(如磁盘,网络)读/写数据的流,称为节点流。节点流也被称为低级流。

      处理流则用于对一个已存在的流进行连接和封装,通过封装后的流来实现数据的读/写功能。处理流也被称为高级流。

      当使用处理流进行输入/输出时,程序并不会直接连接到实际的数据源,没有和实际的输入和输出节点连接。
      使用处理流的一个明显的好处是,只要使用相同的处理流,程序就可以采用完全相同的输入/输出代码来访问不同的数据源
打个比方在进一步理解流的概念
      java把所有设备里的有序数据抽象成流模型,简化了输入/输出处理。java IO流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java Io流的40多个类都是从如下4个抽象类基类中派生出来的。
      InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
      OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

对于InputStream和Reader而言,它们把输入设备抽象成为一个”水管“,这个水管的每个“水滴”依次排列,如图
在这里插入图片描述
      输入流使用隐式的记录指针来表示当前正准备从哪个“水滴”开始读取,每当程序从InputStream或者Reader里面取出一个或者多个“水滴”后,记录指针自定向后移动;除此之外,InputStream和Reader里面都提供了一些方法来控制记录指针的移动。
      对于OutputStream和Writer而言,它们同样把输出设备抽象成一个”水管“,只是这个水管里面没有任何水滴,如图
在这里插入图片描述
当执行输出时,程序相当于依次把“水滴”放入到输出流的水管中,
输出流同样采用隐示指针来标识当前水滴即将放入的位置,
每当程序向OutputStream或者Writer里面输出一个或者多个水滴后,记录指针自动向后移动。

      处理流可以“嫁接”在任何已存在的流的基础之上,这就允许Java应用程序采用相同的代码,
透明的方式来访问不同的输入和输出设备的数据流。
在这里插入图片描述

字节流和字符流的基类方法

IO体系的基类(InputStream/Reader,OutputStream/Writer)字节流和字符流的操作方式基本一致,
只是操作的数据单元不同——字节流的操作单元是字节,字符流的操作单元是字符。
所以字节流和字符流就整理在一起了。InputStream/Reader,OutputStream/Writer是所有输入/输出流的抽象基类,
本身并不能创建实例来执行输入/输出,
但它们将成为所有输入/输出流的模板,
所以它们的方法是所有输入/输出流都可使用的方法。

在InputStream里面包含读数据的方法。
    int read(); 从输入流中读取单个字节,返回所读取的字节数据(字节数据可直接转换为int类型)。
    int read(byte[] b) 从输入流中最多读取b.length个字节的数据,并将其存储在字节数组b中,返回实际读取的字节数。
    int read(byte[] b,int off,int len); 从输入流中最多读取len个字节的数据,并将其存储在数组b中,放入数组b中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字节数。

在Reader中包含也有如下3个方法。
      int read(); 从输入流中读取单个字符,返回所读取的字符数据(字符数据可直接转换为int类型)。
      int read(char[] b) 从输入流中最多读取b.length个字符的数据,并将其存储在字节数组b中,返回实际读取的字符数。
      int read(char[] b,int off,int len); 从输入流中最多读取len个字符的数据,并将其存储在数组b中,放入数组b中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字符数。
InputStream和Reader提供的一些移动指针的方法:

void mark(int readlimit ); 在记录指针当前位置记录一个标记(mark)。
boolean markSupported(); 判断此输入流是否支持mark()操作,即是否支持记录标记。
void reset(); 将此流的记录指针重新定位到上一次记录标记(mark)的位置。
long skip(long n); 记录指针向前移动n个字节/字符。

OutputStream和Writer:
      OutputStream和Writer的用法也非常相似,两个流都提供了如下三个方法:
   void write(int c); 将指定的字节/字符输出到输出流中,其中c即可以代表字节,也可以代表字符。
   void write(byte[]/char[] buf); 将字节数组/字符数组中的数据输出到指定输出流中。
   void write(byte[]/char[] buf, int off,int len ); 将字节数组/字符数组中从off位置开始,长度为len的字节/字符输出到输出流中。
      因为字符流直接以字符作为操作单位,所以Writer可以用字符串来代替字符数组,即以String对象作为参数。
Writer里面还包含如下两个方法:
   void write(String str); 将str字符串里包含的字符输出到指定输出流中。
   void write (String str, int off, int len); 将str字符串里面从off位置开始,长度为len的字符输出到指定输出流中。

输入输出流的体系

java输入/输出流体系中常用的流的分类
在这里插入图片描述
      访问文件,数组,管道,字符串都是节点流,除了基类,节点流,其它是处理流类,处理流要与它结合起来才起作用。

      下面是整理出这些IO流的特性及使用方法,只有清楚每个IO流的特性和方法。才能在不同的需求面前正确的选择对应的IO流进行开发。
1,文件输入输出流
<1.1>文件输入流
FileInputStream和FileReader,
它们都是节点流——会直接和指定文件关联。

public class inputstream {public static void main(String[] args) throws IOException {//把在c盘上一个文件读出来,如果文件是图片,视频,音频,要用字节流,文本文件,字节流,字符流都可用// InputStream is =new FileInputStream("C:\\a.txt");FileInputStream fis=null;try{fis = new FileInputStream("c:\\a.txt");//定义两个东西,一个水漂-数组,一个计数器byte[] b = new byte[1024];int hasRead = 0;while((hasRead=fis.read(b))>0){System.out.println(new String(b,0,hasRead));}}catch(Exception e){e.printStackTrace();}finally {//为什么必须有finally块呢?fis.close();}}
}

注:上面程序最后使用了fis.close()来关闭该文件的输入流,程序里面打开的文件IO资源不属于内存的资源,
垃圾回收机制无法回收该资源,所以必须在程序里关闭打开的IO资源。
Java 7改写了所有的IO资源类,它们都实现了AntoCloseable接口,因此都可以通过自动关闭资源的try语句来关闭这些IO流。
改进后的代码如下,不要finally块了

public class inputstream {public static void main(String[] args)  {try(FileInputStream fis = new FileInputStream("c:\\a.txt")){//定义两个东西,一个水漂-数组,一个计数器byte[] b = new byte[1024];int hasRead = 0;while((hasRead=fis.read(b))>0){System.out.println(new String(b,0,hasRead));}}catch(Exception e){e.printStackTrace();}}}

http://www.mrgr.cn/news/83044.html

相关文章:

  • 大风车excel:怎么把题库导入excel?题库导入excel
  • 我的前端面试笔记(React篇)
  • 邯郸地标美食导游平台的设计与实现
  • 智元机器人完成 1000 台通用具身机器人下线
  • 009:传统计算机视觉之边缘检测
  • 深度解析与实践:HTTP 协议
  • Ardupilot开源无人机之Geek SDK进展2024
  • PID学习资料
  • SSL VPN
  • rabbitmq——岁月云实战笔记
  • WebSocket 实现指南
  • 排序算法:冒泡排序
  • windows从0开始配置llamafactory微调chatglm3-6b
  • 【C语言】可移植性陷阱与缺陷(八): 随机数的大小
  • UE5 打包要点
  • 【学习笔记】数据结构(十)
  • Halcon在linux及ARM上的安装及c++工程化
  • 豆包ai 生成动态tree 增、删、改以及上移下移 html+jquery
  • React(二)——Admin主页/Orders页面/Category页面
  • 120.Jenkins里的Pipeline Script
  • PyCharm简单调试
  • 左神算法基础巩固--3
  • SpringBootWeb案例-1(day10)
  • jenkins入门13--pipeline
  • 2020 年 12 月青少年软编等考 C 语言五级真题解析
  • moviepy 将mp4视频文件提取音频mp3 - python 实现