File类
一、定义:
①File类是文件管理的操作类;它是java中提供的唯一跟文件有关的类。主要是实现文件和目录的操作。
②文件和目录是可以通过File封装为对象的。
③对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已.它可以是存在的,也可以是不存在的.将来是要通过具体的操作把这个路径的内容转换为具体存在的。
注意:File类只能对文件本身进行操作,但不能读写文件里面存储的数据。
二、构造方法
1、public File(“文件路径名称”):设置一个需要操作的文件的完整目录
注意:
①此时的路径可以是相对路径,也可以是绝对路径。
②可以存在,也可以不存在。
③创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况。
2、public File(String parent,String child):根据parent路径名字符串和child路径名字符串创建一个新的File实列。
3、public File(File parent,String child):根据parent抽象路径名和child路径名字符串创建一个新的File实例
三、File类中的常用方法
1、获取功能的方法
①getAbsolutePath():返回此File的绝对路径名字符串。
注意:无论File对象中的是绝对路径还是相对路径,最终返回的都是绝对路径。
②getpath():将File转换为路径名字符串
③getName(): 返回由此File表示的文件或目录名称
注意: 获取的是构造方法传递路径的结尾部分(要么是文件,要么是文件夹)
④length():返回由此File表示的文件的长度
注意:获取的是构造方法中指定的文件的大小,以字节为单位。
注意:
①文件夹是没有大小写的概念的,不能获取文件夹的大小;
②如果构造方法中给出的路径不存在,那么length方法返回0。
代码演示
2、判断功能的方法(都是boolean类型)
①exists():判断File表示的文件或目录是否实际存在。
②isDirectory():判断File表示的是否为目录。
注意:用来判断构造方法中给定的路径是否是以文件夹结尾的;是为true,否为false。
③isFile():判断File表示的是否为文件。
注意:用来判断构造方法中给你定的路径中是否以文件结尾;是为true,否为false。
注意:
①电脑的硬盘中只有文件/文件夹,所以isDirectory方法和isFile方法是互斥的。
②这两个方法使用前提,路径必须是存在的,否则都返回false。
3、创建和删除功能的方法
①createNewFile():当且仅当只有该名称的文件不存在时,才能创建新的空文件。
注意:
①此方法只能创建文件,不能创建文件夹。
②创建文件的路径必须存在,否则会抛出异常。
③此方法需要声明抛出IOException异常。
②delete():删除由此File表示的文件或目录。如果文件夹中有内容,不会删除返回false;构造方法中路径不存在false。
注意:delete方法是直接在硬盘删除文件/文件夹,不走回收站,所以删除需要谨慎。
③mkdir():创建由此File表示的目录。创建单级文件夹
④mkdirs():创建由此File表示的目录,包括任何必需但不存在的父目录。即可创建单级文件夹,也可创建多级文件夹。
4、File类遍历文件夹目录的功能
①String[] list():返回一个String数组,表示该File目录中的所有子文件或目录
②File[] listFiles():返回一个File数组,表示该File目录中的所有的子文件或目录
注意:
①list方法和listFiles方法遍历的时构造方法中给出的目录。因此构造方法中最后不能是一个文件。
②如果构造方法中给出的目录的路径不存在,会抛出空指针异常。
③如果构造方法中给出的路径不是一个目录,也会抛出空指针异常。
IO
一、IO流体系
字节流适合做数据的拷贝转移。
字符流适合读写文本内容。
二、IO流
1、定义:存储和读取数据的解决方法。
2、作用:用于读写文件中的数据(可读写文件,或网络中的数据)。
3、IO流的分类
流的方向:
输入流(读取文件中的数据)
输出流(把数据写到本地文件中)
操作文件类型:
字节流: 他可以操作所有类型的文件
字符流:只能操作纯文本文件
纯文本文件:Windows自带的记事本打开能读懂的文件。(如:txt文件,md文件,xml文件,lrc文件等)
4、流最终一定要关闭
关闭顺序:
一般情况下是:先打开的后关闭,后打开的先关闭
另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b
例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法
如果将节点流关闭以后再关闭处理流,会抛出IO异常;
三、文件字节输入流和文件字节输出流
1、FileInputStream(文件字节输入流)
作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。
构造方法
FileInputStream(File file):创建字节输入流管道与源文件接通。(创建File类)
FileInputStream(String pathname)【常用】:创建字节输入流管道与源文件接通。(直接书写文件路径)
读取文件中的数据的方法:
①read():每次读取一个字节返回,如果没有数据可读,则会返回-1.
注意事项:
①读取汉字会乱码,因为该方法是一个字节一个字节输出,而一个汉字需要两个字节来存储,所以不行。
②每次读一个字节,读取性能差。
②read(byte[] buffer):每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读,则会返回-1。
这里用到了解码中的String(字节集合,开始位置,读取的个字节个数):读取多少,倒出多少。
注意:
①他也不能避免读取汉字时出现乱码。
②使用FileInputStream每次读取多个字节,读取性能有所提高。
数组能接收到的字符个数
2、FileOutputStream(文件字节输出流)
作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去。
构造方法:
①FileOutputStream(File file):创建字节输出流管道与源文件路径接通。
②FileOutputStream(String filepath):创建字节输出流管道与源文件路径接通。
③FileOutputStream(File file, boolean append):创建字节输出流管道与源文件路径接通,可追加数据。
④FileOutputStream(String filepath, boolean append):创建字节输出流管道与源文件路径接通,可追加数据。
常用方法:
①write(int a):写一个字节出去。
②write(byte[] buffer):写一个字节数组出去。
③write(byte[] buffer, int pos , int len):写一个字节数组的一部分出去。
④close() throws IOException:关闭流
四、文件字符输入流和文件字符输出流
1、FileReader(文件字符输入流)
作用:以内存为基准,可以把文件中的数据以字符的形式读入到内存中去。
构造方法:
FileReader(File file)
创建字符输入流管道与源文件接通。
FileReader(String pathname)
创建字符输入流管道与源文件接通。
方法:
read()
每次读取一个字符返回,如果发现没有数据可读,则会返回-1。
read(char[] buffer)
每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读,则会返回-1。(每次可读取多个字符那么就会减少系统调用,从而性能增强。)
2、FileWriter(文件字符输出流)
作用:是以内存为基准,把内存中的数据以字符的形式写出到文件中去。
构造方法:
①FileWriter(File file)
创建字符输出流管道与源文件路径接通。
②FileWriter(String filepath)
创建字符输出流管道与源文件路径接通。
③FileWriter(File file, boolean append)
创建字符输出流管道与源文件路径接通,可追加数据。
④FileWriter(String filepath, boolean append)
创建字符输出流管道与源文件路径接通,可追加数据。
方法:
①write(int c)
写一个字符
②write(String str)
写一个字符串
③write(String str, int off, int len)
写一个字符的一部分
④write(char[] cbuf)
写一个字符数组
⑤write(char[] cbuf, int off, int len)
写一个字符数组的一部分
注意:
①文件字符输出流写出程序后,必须进行刷新流,或者关闭流操作。否则写出去的数据不会生效。
(原因:在字符输出流中增加了一个缓冲区机制,该机制是将需要写出的字符保存到一个缓冲区中,没有直接写到文件中。然后经过刷新流操作或关闭流操作,将数据刷新到文件中去。)
②关闭流的操作中包含了刷新流的操作。
③如果缓冲区装满了,则会自动执行刷新流操作。
④刷新流操作:
flush方法
⑤使用该操作后,仍然可以继续使用流。而关闭流则不能继续使用流。
五、IO-缓冲流
1、字节缓冲流
作用:提高字节流读写数据的性能
输入输出的构造方法:
①输入:
BufferedInputStream( InputStream is )
把原始的字节输入流包装为一个高级的缓冲字节输入流,来提高性能。
②输出:
BufferedOutputStream( OutputStream os )
把原始的字节输出流包装为一个高级的缓冲字节输出流,来提高性能。
原理:
字节缓冲输入流自带了8KB的缓冲池;字节缓冲输出流也自带了8KB的缓冲池。
他们在内存中进行数据的传输很快并且减少了对系统性能的调用。
2、字符缓冲流
BufferedReader(字符缓冲输入流)
作用:自带8KB(8192)的字符缓冲池,可以提高字符输入流读取字符数据的性能。
构造方法:
BufferedReader( Reader r )
把原始的字符输入流包装为字符缓冲输入流管道,从而提高字符输入流读字符数据的性能。
字符缓冲输入流新增功能:按照行读取字符
方法:
readLine()
读取一行数据返回,如果没有数据可读了,会返回null
BufferedWriter(字符缓冲输出流)
作用:
自带8KB的字符缓冲池,可以提高字符输出流写字符数据的性能。
构造方法:
BufferedWriter( Writer r)
把原始的字符输出流包装为一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能。
字符缓冲输出流新增的功能:换行
方法:
newLine()
换行
六、IO-转换流
1、InputStreamReader(字符输入转换流)
作用:解决不同编码时,字符流读取文本内容乱码的问题。
解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了。
构造方法:
InputStreamReader( InputStream is ,String charset )
把原始的字节输入流,按照指定字符集编码转换为字符输入流。
InputStreamReader(InputStream is)
可把原始的字节输入流,按照代码默认编码转换为字符输入流。
2、OutputStreamWriter(字符输出转换流)
作用:可以控制写出去的字符使用什么字符集编码。
解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了。
构造方法:
OutputStreamWriter( OutputStream os )
可把原始的字节输出流,按照代码默认编码转换为字符输出流。
OutputStreamWriter( OutputStream os , String charset )
可以把原始的字节输出流,按照指定字符集编码转换成字符输出流。
七、IO-打印流
作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印什么出去,就是什么出去。(这里的打印就是写出数据)
1、PrintStream
构造方法:
PrintStream( OutputStream / File / String path )
打印流直接通向字节输出流/文件/文件路径。
PrintStream( String fileName , Charset.forName(“字符集名称”) )
可以指定写出去的字符编码。
PrintStream( OutputStream out , boolean autoFlush )
可以指定实现自动刷新。
PrintStream( OutputStream out , boolean autoFlush , String encoding )
可以指定实现自动刷新,并可指定字符的编码。
方法:
println(Xxx xx)
打印任意类型的数据出去。
write( int / byte[] / byte[]的一部分)
可以支持写字节数据出去。
2、PrintWriter
构造方法:
PrintWriter( OutputStream / File / String path )
打印流直接通向字节输出流/文件/文件路径。
PrintWriter( String fileName , Charset.forName(“字符集名称”) )
可以指定写出去的字符编码。
PrintWriter( OutputStream out , boolean autoFlush )
可以指定实现自动刷新。
PrintWriter( OutputStream out , boolean autoFlush , String encoding )
可以指定实现自动刷新,并可指定字符的编码。
方法:
println(Xxx xx)
打印任意类型的数据出去。
write( int / byte[] / byte[]的一部分)
可以支持写字节数据出去。
PrintStream和PrintWriter的区别:
①打印数据的功能上是一样的:都是使用方便,性能高效。(核心优势)
②PrintStream继承字节输出流OutputStream,因此支持写字节数据的方法。
③PrintWriter继承字符输出流Writer,因此支持写字符数据出去。
八、IO-数据流
1、DateOutputStream(数据输出流)
作用:允许把数据和其类型一并写出去。
构造方法:
DataOutputStream(OutputStream out)
创建新数据输出流包装基础的字节输出流。
方法:
writeByte(int v) throws IOException
将byte类型的数据写入基础的字节输出流。
writeInt(int v) throws IOException
将int类型的数据写入基础的字节输出流。
writeDouble(Double v) throws IOException
将double:类型的数据写入基础的字节输出流。
writeUTF(String str) throws IOException
将字符串数据以UTF-8编码成字节写入基础的字节输出流。
write(int/byte[]/byte[]-部分)
支持写字节数据出去。
2、DataInputStream(数据输入流)
作用:用于读取数据输出流写出去的数据。
读区数据输出流处理后的数据时,要按照它的顺序来读。
构造方法:
DataInputStream(InputStream is)
创建新数据输入流包装基础的字节输入流。
方法:
readByte()
读取字节数据返回。
readInt()
读取int类型的数据返回。
readDouble()
读取double类型的数据返回。
readUTF()
读取字符串数据(UTF-8)返回。
readInt()或read(byte[])
支持读字节数据进来。