浅学IO流

本文详细介绍了Java中的File类,包括其定义、构造方法、常用功能如路径操作、判断文件/目录、创建/删除、遍历目录以及与IO流的关系,涵盖了字节流和字符流的实例。
摘要由CSDN通过智能技术生成

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[])
            支持读字节数据进来。
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值