Java IO流和File类详解

本文深入讲解Java IO流的概念,包括字节流、字符流、缓冲流、转换流、序列化流以及打印流的使用方法。同时,介绍了File类的操作、对象序列化与反序列化流程,以及Properties属性集合类的应用。

一.Java IO流:

当需要把内存中的数据存储到持久化设备(硬盘、光盘、U盘等)上这个动作称为输出(写)Output操作。

当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。

因此我们把这种输入和输出动作称为IO操作。

1.File类:

           ————*File类

------1.定义及构造方法:
import java.io.File;

/*
 * java.io.File
 * 表示操作系统上 文件  目录 路径名的类
 * 文件:File 存储数据
 * 目录:Directory 文件夹 存储文件 区分文件
 * 路径:Path 路径 定位文件文件夹
 * File类特点:平台无关性
 * 
 * File类的静态常量
 * static String pathSeparator 与系统有关的路径分隔符
 * static String separator 与系统有关的默认名称分隔符
 * 
 * 
 * uri 统一资源标识符
 *        包括url
 *      thrunder:
 *      ed2k:
 *      mailto:123@qq.com
 * 
 * url 统一资源定位符
 *        http:\\www.baidu.com
 * 
 /*
 ------File的构造方法
 * 
 * 绝对路径
 *         从盘符开始的路径都是绝对路径  绝对路径具备唯一性 
 *         d:\\work\\abc
 * 相对路径
 *         d:\\work\\abc
 *         d:\\work
 *         d:\\work\\day04
 * 
 *         父路径具备唯一性  子路径没限制
 */
public class Demo02_File {

    public static void main(String[] args) {
        /*
         *  File(String path)
         * 根据字符串路径 创建一个File对象
         * 路径可以是文件 也可以是文件夹
         * 创建对象时,不会验证该路径是否存在
         * 
         */


 ----- File类创建方法
 * 
 * windows不区分大小写
 * 不可以用后缀名 判断一个文件 是文件还是文件夹
 * 即使类型不同 名字也不能完全一样
 * 


 ------- File的删除方法 
 *         boolean delete()  可以删除文件或文件夹 
 *                              删除成功true 删除失败为false
 *                              要删除的文件路径在构造方法中给出
 *                           java的删除一般都不走回收站 
 *                               永久性删除
 *                               操作有风险 运行需谨慎
 *                           如果删除的是文件 即使文件中有数据 也会被删除
 *                          但是如果删除的是文件夹 如果文件夹内有东西 删除不掉
 *                          
 */

------File类的判断方法
    /*
         * boolean exists() 
         * 判断路径是否存在
         * 如果存在返回 true 如果不存在返回false
         */

    判断当前路径是否是文件夹
         * boolean isFile()
         * 判断当前路径是否是文件
         * 如果是文件返回true 
         * 但是如果 文件不存在返回
false
         * 如果文件是文件夹返回false
         */


------- File的获取方法
         *     File getAbsoluteFile() 推荐
         *  String getAbsolutePath() 
         *  获取文件对象的绝对路径
         */

        /*
         *  String getPath() 
         *  获取文件路径的方法
         *  获取在构造方法中给出的路径的字符串
         */
/*
         *  String getParent() 
         *  File getParentFile() 
         *  获取父目录
         */

        /*
         *  String getName()  
         *  获取文件名 
         */
/*
         * long length() 
         * 获取文件的字节数
         * 不能返回文件夹的
         */
-----2 File类list开头的方法
String[] list() 返回当前文件夹下 所有的文件名的数组  包含隐藏文件
 *  File[] listFiles() 返回当前文件夹下 所有文件的对象
 *  
 *  static File[] listRoots() 返回计算上所有的盘符
-------3.文件过滤器
 文件过滤器
 * 获取一个文件夹下所有.java文件
 * File[] listFiles(FileFilter filter) 
 */

2.字节流图解:

字节输出流 OutputStream
    特点: 写任意的文件
    方法: 写出数据的方法: write
        write(int b) 写出1个字节  127 -128 之间
        write(byte[] b) 写出字节数组
        write(byte[] b,int off,int len) 写出字节数组一部分 开始索引,写出的个数
        close() 关闭流,释放资源
    子类: FileOuputStream
        构造方法:
             FileOutputStream(File file) 传递File对象,数据目的
             FileOutputStream(String filename) 传递字符串的文件名作为数据目的
 
    IO字节流写数据步骤
         1. 创建流对象的对象,构造方法中绑定数据目的
         2. 调用方法write写
         3. 关闭资源

字节输入流 InputStream
    特点:读取字节数据,读取任意的文件
    方法: 读取数据的方法:read
        int read() 读取1个字节        
        int read(byte[] b) 读取字节数组
    子类: FileInputStream
         构造方法: 
            FileInputStream(File file)传递File对象,此流读取的数据源
            FileInputStream(String filename)传递字符串文件名,此流读取的数据源

    输入流读取数据步骤
         1. 创建字节输入流对象,构造方法中,绑定数据源
         2. 调用方法read读取
        3. 输出读取的结果
        4. 释放资源
      
    注意:read(): 调用一次,自动向后读1个字节,文件末尾-1

字节输出流的缓冲流:
    java.io.BufferedOutputStream
    继承OutputStream 就是一个字节输出流
    方法: 来自于父类OutputStream
    write  字节, 字节数组
    构造方法:
    BufferedOutputStream (OutputStream out)
    传递我任意的字节输出流,传递来的是谁,就缓冲谁,提高效率
    只能传递 FileOutputStream
 

字节输入流的缓冲流 
    java.io.BufferedInputStream
    继承InputStream, 也是字节输入流
    读取的方法: read 单个字节,字节数组
     构造方法:
    BufferedInputStream (InputStream in)
    传递任意的字节输入流,传递的是谁,就对谁高效 FileInputStream

     
    ___________字符转换流_______________

       ——*OutputStreamWriter类


 java.io.OutputStreamWriter extends Writer 
 字符通往字节的桥梁
 * 特点 可以指定编码表  继承了Writer所以可以使用父类的write方法
                 write一个字符
                 write一个字符数组                 write一个字符数组的一部分
                  write一个字符串
 * 构造方法 绑定数据目的
        OutputStreamWriter(OutputStream out) 
         OutputStreamWriter(OutputStream out, String charsetName) 
        参数
           OutputStream out 所有字节输出流的超类,可以传入其任意子类对象
                            FileOutputStream
            String charsetName 指定字符串类型的编码表,编码表不区分大小写
                               UTF-8 GBK


    ——*    InputStreamReader类
ava.io.InputStreamReader extends Reader  字节通往字符的桥梁
 * 特点 可以指定编码 继承自Reader可以调用Reader的read方法
 *             read一个字符
 *             read一个字符数组
 * 
 * 构造方法
 *             InputStreamReader(InputStream in)
 *             InputStreamReader(InputStream in, String charsetName)
 *             参数
 *                 InputStream in 所有字节输入流的超类,可以传入其任意子类对象
 *                                FileInputStream
 *              String charsetName 指定字符串类型的编码表,编码表不区分大小写
 *                                UTF-8 GBK


        ——*对象的序列化流
ObjectOutputStream:
构造方法:

 *         ObjectOutputStream(OutputStream out)
 *         参数    
 *             OutputStream out 所有字节输出流超类,可以传入其任意子类对象
 *                              FileOutputStream
 * 方法
 *         void writeObject(Object obj) 写对象
  
         ——*对象的反序列化流
 java.io.ObjectInputStream :

 * 构造方法
 *         ObjectInputStream(InputStream in)
 *         参数
 *             InputStream in 所有字节输入流的超类,可以传入其任意子类对象
 *                            FileInputStream
 * 方法
 *         Object readObject() 读对象
 * 

        ——打印流——
    ——*字节打印流 PrintStream
    ——*字符打印流 PrintWriter(常用)

打印流的特点:1.只负责输出目的端
         2.打印流不会抛出IO异常 可能抛其他异常
         3.打印流为其他流添加了功能
 构造方法绑定数据目的

      * PrintStream构造方法可以接收:
        String路径   File对象  所有字节输出流

      * PrintWriter构造方法可以接收:
        String路径  
        File对象 
        所有字符输出流 所有字节输出流

    *方法:
      void print(xxx xx) 不换行打印  原样输出
        void println(xxx xx) 换行打印
 
    *打印流可以开启自动刷新:
         前提
    1.构造方法必须接收的是流对象:
    PrintWriter(OutputStream out, boolean autoFlush) 
    PrintWriter(Writer out, boolean autoFlush) 
         如果 
          autoFlush为true 则开启了自动刷新
       2.只有 printf println format三个方法可以自动刷新
 


    ———Properties属性集合类(双列集合)———
   *—特点:
    
     1、Hashtable的子类,map集合中的方法都可以用。
     2、该集合没有泛型。键值都是字符串。
     3.唯一一个可以和IO流直接结合使用

   *—方法:
    setProperty(String key, String value) 添加元素
   String getProperty(String key)   根据键找值        
 Set<String> stringPropertyNames() 获取所有key的Set集合
 
   *—Properties和IO流结合使用
   方法:
   void load(InputStream inStream) 将文件中的键值对加载进集合
   void load(Reader reader) 
       参数:
       任意输入流对象  字节输入流 字符输入流
  
    void store(OutputStream out, String comments)  将集合中的键值对 写入文件中
     void store(Writer writer, String comments) 
      参数:
      任意输出流对象  字节输出流 字符输出流
 

    ——— commons.io.(非系统包)
导包:import org.apache.commons.io.FileUtils;
   *—FileUtils类的方法:
   1. static String readFileToString(File file) 读取文件转换为字符串
   2.static void writeStringToFile(File file, String data) 将字符串写入文件
 
3.static void  copyFile(File srcFile, File destFile)  复制文件

   4.static void copyDirectoryToDirectory(File srcDir, File destDir) 复制多级文件夹
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值