File类和IO流
1.File类概述
1.file类存在于java.io的包下,本质是文件和目录路径名的抽象表示形式,java把电脑的文件/文件夹封装成一个file类进行操作,间接对电脑的文件/文件夹操作,而且与操作系统无关,任何操作均可跨平台;
2.file类对文件/文件夹的操作主要有:创建、删除、获取、判断存在、遍历;
2.File类的静态成员变量
1.static String pathSeparator:系统路径分隔符(例子:环境变量下多个路径间所用的分隔符),win为分号(;),Linux为冒号(:);
2.static char pathSeparatorChar:同上,只是变成char类型;
3.static String separator:系统名称路径分隔符(例子:多个文件夹形成的路径所用的分隔符),win为“\”,Linux为"/",代表字符串,更灵活的跨操作系统(例子:“C:”+File.separator+“文件夹”);
4.static char separatorChar:同上,只是变成char类型;
3.绝对路径和相对路径
1.绝对路径以盘符(C:)开始,一个完整的路径;
2.相对路径是一个简化的路径,相对于以当前项目的根目录开始,无需从头写一遍;
3.路径不区分大小写;
4.java中的“\”表示转移,如配合n,t进行换行,空格操作,所以"\"代表普通反斜杠用来名称路径分隔符;
4.File类构造方法
1.File(String pathname):通过路径名字字符串转换为抽象路径进行file实例创建输出到控制台,路径名可以绝对或相对,不考虑路径是否存在;
2.File(String parent,String child):同上,只是把路径拆成两半,更加灵活,父子类均可更改;
3.File(File parent,String child):同上,只是父类变成file类,可以通过file类的方法对父类进行操作后再使用路径创建对象;
5.File类获取方法
1.public String getAbsolutePath():返回一个该file类的绝对路径字符串;
2.public String getPath():返回一个该file类的路径字符串;
3.public String getName():返回一个该file类(路径结尾)的文件/文件夹名称;
4.public long length():返回该file类的文件大小(字节单位),文件夹不可获取因为没有大小概念,路径不存在返回0;
6.File类判断功能方法
1.public boolean exists():判断该file类路径结尾的文件/文件夹是否存在;
2.public boolean isDirectory():判断该file类路径结尾是否为文件夹;
3.public boolean isFile():判断该file类路径结尾是否为文件;
4.输出true均为表示存在或是,反之;
7.File类创建删除功能方法
1.public boolean createNewFile():创建一个新的空文件,前提是创建前文件不存在,但路径必须存在;
2.public boolean delete():删除该file类表示的文件/文件夹;
3.public boolean mkdir():创建该file类表示的结尾文件夹;
4.public boolean mkdirs():创建该file类表示的单个或多个文件夹;
8.File类遍历方法
1.public String[] list():表示该file文件夹中所有子文件/文件夹,返回数组类型;
2.public File[] listFiles():同上,返回file类数组;
3.遍历方法遍历的均为构造方法中的文件夹(包括隐藏文件夹),路径不存在或结尾为文件均抛出异常;
9.递归
1.递归分为直接和间接两种。直接则直接调用自己,间接为通过A调用B,B调用C,C调用A这样,递归主要用作调用的实例参数一直变化的情况;
2.递归需要设置停下来的点,比如n==0,f(n)=1这样,不停下来会发生栈内存溢出,同样递归次数也不能过多,不然也栈内存溢出;
3.构造方法是创建对象的,不可递归,敲写时直接编译报错;
10.过滤器
1.在file类中有两个和listFiles重载的方法,方法的参数传递的就是过滤器;
2.File[] listFiles(FileFilter filter):java.io.FileFilter接口用于过滤抽象路径名(file对象),主要通过该接口下的boolean accept(File pathname)测试指定抽象路径名是否应该包含在某个路径名列表中,参数pathname使用listFiles方法遍历目录,得到每个文件对象;
3.File[] listFiles(FilenameFilter filter):java.io.FilenameFilter接口实现该接口的类实例可用于过滤器文件名,同样是boolean accept(File dir,String name),前一个参数为构造方法中传递的被遍历目录,后者同上方法;
11.IO流概述
1.I:input,指把硬盘中的数据读取到内存中使用;
2.O:output,指把内存中的数据写入到硬盘中保存;
3.流:指数据(字节,字符),1字符=2字节,1字节=8位(二进制);
4.IO流顶级父类:字节流(InputStream,OutputStream),字符流(Reader,Writer);
5.写入数据的原理:java程序(IO流程序)–>JVM–>OS(操作系统)–>methods(操作系统调用本地写数据方法)–>写入数据到文件中;
12.字节流
1.一切皆为字节,计算机只能存取二进制,底层的传输始终为二进制数据;
13.字节流输出
1.超类(顶级父类)OutputStream的成员方法主要有public void close()/flush()/write(),分部表示关闭,刷新和写入,其中写入又根据参数类型分成3种,write(byte[] b)写入数组字节,write(byte[] b,int off,int len)带偏移量写入数组字节,abstract void write(int b)指定字节输出,拥有多个子类;
2.FileOutputStream继承了字节输出流OutputStream,主要把文件字节写入到硬盘文件中。构造方法有FileOutputStream(String name)和FileOutputStream(File file),参数的区分在于一个写入文件的路径,一个写入文件。两个方法均在传递文件/文件路径中创建一个空文件;
3.字节输出流使用三步骤:创建对象–>调用创建对象的write方法–>close;
4.当创建对象调用write()方法,写入97整数时,创建出来的文件通过文本编辑器(记事本)打开时会查询编码表(0-127查ASCII表,其他查GBK表或UTF-8,当一开始的数是负数时,会结合下一个数形成一个数,生成一个中文,来自GBK表,直至没有负数结合后再判断是否为0-127,UTF-8需要3个结合),所以打开文本后显示的不是97,而是ASCII表对应的小写a;
5.byte[] b="*****".getBytes()可获得对应的码;
14.字节流续写和换行
1.续写构造方法:public FileOutputStream(String name,boolean append) throws FileNotFoundException创建文件输出流以指定的名称写入文件。 如果第二个参数是true ,则字节将写入文件的末尾而不是开头,一般没有续写的输出都是直接覆盖新建的;
2.换行:"\r\n".getBytes(),注这是win系统的,Linux为/n,mac为/r;
15.字节输入流
1.Class InputStream表示输入字节流的所有类的超类。abstract int read() 从输入流读取数据的下一个字节(没有字节可读取返回-1,通常配合while使用)。int read(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b 。int read(byte[] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。 void close() 关闭此输入流并释放与流相关联的任何系统资源;
2.FileInputStream继承了字节输出流InputStream,主要把文件字节写入到硬盘文件中。构造方法有FileInputStream(String name)和FileInputStream(File file);
3.字节输入流整体和输出流基本一样;
16.字节流文件复制
1.原理就是一读一写,关闭时先关写后关读;
17.字符流
1.字符流主要解决字节流读取中文乱码的情况;
18.字符输入流
1.Reader用于读取字符流的抽象类。 子类必须实现的唯一方法是read(char [],int,int)和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者;
2.public class FileReader extends InputStreamReader是阅读字符文件的便利类,该类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的,构造方法有FileReader(File file) 创建一个新的 FileReader ,给出 File读取。FileReader(FileDescriptor fd) 创建一个新的 FileReader ,给定 FileDescriptor读取。 FileReader(String fileName) 创建一个新的 FileReader ,给定要读取的文件的名称;
3.使用步骤和字节流一样;
19.字符输出流
1.Writer用于写入字符流的抽象类。 子类必须实现的唯一方法是write(char [],int,int),flush()和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者;
2.public class FileWriter extends OutputStreamWriter方便类写字符文件。 该类的构造函数假定默认字符编码和默认字节缓冲区大小是可以接受的;
3.字符输出流使用步骤:创建对象,构造方法填入参数–>调用write方法,把数据写入内存缓冲区中(字符转换为字节过程)–>调用flush方法刷新(把内存缓冲区数据刷到文件中)–>关闭(刷新可要可不要,因为close自带刷新,和flush区别在于流对象能不能再使用);
20.字符流续写和换行
1.和字节流一样使用;
21.IO流捕获异常
1.try(流对象){方法体}catch(IOException e){sout};
21.属性集
1.Class Properties继承java.util.Hashtable<k,v>类和Map<k,v>接口 ,Properties类表示一组持久的属性。 Properties可以保存到流中或从流中加载。 属性列表中的每个键及其对应的值都是一个字符串;
2.Properties是唯一和IO流相结合的集合,store方法可把集合的临时数据写入硬盘从而持久化,反之也可通过load方法把硬盘的键和值(键,值默认字符串)读取到集合使用;
3.set/getProperty()设置和获取集合的键和值,stringPropertyNames()把集合的键取出来放到set集合里;
4.store方法使用和输出流一样;
5.load方法使用和输入流一样,只是可以通过遍历来确保是否成功输入,需要注意存储键值对的文件,键值对的连接可以用“=”或空格说明,对带“#”的键值对不进行读取,键值对不用加引号;