• JavaSE-19 IO


    学习要点

    • File类操作文件和目录的属性
    • 字节流读写文件
    • 字符流读写文件
    • 字节流读写二进制文件

    文件操作

    1  文件的定义

    文件可认为是相关记录或放在一起的数据的集合。文件一般保存在硬盘、U盘、光盘、云盘的媒介中。

    2  Java如何操作文件

    JAVA API :java.io.File 类

    3  File对象构建

    File file = new File( String pathname );
    
    //String pathname格式:"e:\test .txt"或"e:/test .txt"
    

      

    4  File类常用方法

    方法名称

    说      明

    boolean exists( )

    判断文件或目录是否存在

    boolean isFile( )

    判断是否是文件

    boolean isDirectory( )

    判断是否是目录

    String getPath( )

    返回此对象表示的文件的相对路径名

    String getAbsolutePath( )

    返回此对象表示的文件的绝对路径名

    String getName( )

    返回此对象表示的文件或目录的名称

    boolean delete( )

    删除此对象指定的文件或目录

    boolean createNewFile( )

    创建名称的空文件,不创建文件夹

    long  length()

    返回文件的长度,单位为字节, 如果文件不存在,则返回 0L

    5  File操作文件示例

    public static void main(String[] args) {
    
            FileOperation fm = new FileOperation();
    
            File file = null;
    
            file = new File("e:\myDoc\test.txt");
    
            fm.create(file);
    
            fm.showFileInfo(file);
    
            fm.delete(file);
    
        }
    
     
    
        /** 创建文件的方法 */
    
        public void create(File file) {
    
            if (!file.exists()) {
    
                try {
    
                    file.createNewFile();
    
                    System.out.println("文件已创建!");
    
                } catch (IOException e) {
    
                    e.printStackTrace();
    
                }
    
            }
    
        }
    
     
    
        /** 删除文件 */
    
        public void delete(File file) {
    
            if (file.exists()) {
    
                file.delete();
    
                System.out.println("文件已删除!");
    
            }
    
        }
    
     
    
        /** 显示文件信息 */
    
        public void showFileInfo(File file) {
    
            if (file.exists()) { // 判断文件是否存在
    
                if (file.isFile()) { // 如果是文件
    
                    System.out.println("名称:" + file.getName());
    
                    System.out.println("相对路径: " + file.getPath());
    
                    System.out.println("绝对路径: " + file.getAbsolutePath());
    
                    System.out.println("文件大小:" + file.length() + " 字节");
    
                }
    
                if (file.isDirectory()) {
    
                    System.out.println("此文文件是目录");
    
                }
    
            } else
    
                System.out.println("文件不存在");
    
        }

    6  上机练习

    查看文件属性,创建和删除文件。

    1  定义

    Flie类提供了访问文件和目录属性的方法,如何读写文件的内容?通过流来读写。

    流的概念:流是指一连串流动的字符,是以先进先出方式发送信息的通道。

      

     

    输入/输出流和数据源的关系:

     

    2  Java流的分类

     

     

    • 输入输出流是相对于计算机内存而言
    • 字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流
    • IO体系示意图

     

    3  常用的文件读写类

    文本文件的读写

    字节流方式:FileInputStream、FileOutputStream

    字符流方式:BufferedReader、BufferedWriter

    二进制文件的读写

    DataInputStream、DataOutputStream

    字节流方式读写文本

    1  FileInputStream 读文本文件

    InputStream类常用方法

    方法

    说明

    int read( )

    从此输入流中读取一个数据字节。

    int read(byte[] b)

    从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。

    int read(byte[] b,int off,int len)

    从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。

    void close( )

    关闭此文件输入流并释放与此流有关的所有系统资源。

    int available()

    返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。

    子类FileInputStream常用的构造方法

    构造方法

    说明

    FileInputStream(File file)

    通过文件对象创建FileInputStream对象。

    FileInputStream(String name)   

    通过name文件路径创建FileInputStream对象。

    示例代码

    package com.etc.io;
    
     
    
    //1.引入相关类
    
    import java.io.FileInputStream;
    
    import java.io.FileNotFoundException;
    
    import java.io.IOException;
    
     
    
    public class FISTest {
    
       public static void main(String[] args) {
    
           FileInputStream fis = null;
    
           try {
    
               // 2.构造文件输入流对象
    
               fis = new FileInputStream("e:\mydoc.txt");
    
               // 3.读取文本文件数据
    
               byte[] words = new byte[1024];// 构建数组,一次读取1024个字节
    
               while (fis.read() > 0) {
    
                   fis.read(words);
    
               }
    
               // 4. 输出内容
    
               String str = new String(words, "utf-8");
    
               System.out.println(str);
    
           } catch (FileNotFoundException e) {
    
               e.printStackTrace();
    
           } catch (IOException e) {
    
               e.printStackTrace();
    
           } finally {
    
               // 5. 关闭输入流
    
               try {
    
                   if (fis != null) {
    
                       fis.close();
    
                   }
    
               } catch (IOException e) {
    
                   e.printStackTrace();
    
               }
    
           }
    
       }
    
    }
    

      

    2  FileOutputStream 写文本文件

    OutputStream类常用方法

    方法

    说明

    void write(int c)

    将指定字节写入此文件输出流。

    void write(byte[] buf)

    将 b.length 个字节从指定 byte 数组写入此文件输出流中。

    void write(byte[] b,int off,int len)

    将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。

    void close( )

    关闭此文件输出流并释放与此流有关的所有系统资源。

    子类FileOutputStream常用的构造方法

    构造方法

    说明

    FileOutputStream (File file)

    创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

    FileOutputStream(String name)  

    创建一个向具有指定名称的文件中写入数据的输出文件流。

    FileOutputStream(String name,

    boolean append)

    创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。

    注意:

    1、前两种构造方法在向文件写数据时将覆盖文件中原有的内容。

    2、创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件。

    3、FileInputStream和FileOutputStream创建的流属于节点流,直接操纵数据源。

    示例代码

    package com.etc.io;
    
    //1.引入IO相关类
    
    import java.io.FileNotFoundException;
    
    import java.io.FileOutputStream;
    
    import java.io.IOException;
    
    public class FOSTest {
    
       public static void main(String[] args) {
    
           FileOutputStream fos = null;
    
           try {
    
               // 2.构造FileOutputStream对象
    
               fos = new FileOutputStream("e://fos.txt");
    
               // 3.把数据写入文本文件
    
               String text = "好好学习Java,天天向上!";
    
               byte[] words = text.getBytes();
    
               fos.write(words, 0, words.length);
    
               System.out.println("数据写入文件成功");
    
           } catch (FileNotFoundException e) {
    
               e.printStackTrace();
    
           } catch (IOException e) {
    
               e.printStackTrace();
    
           } finally {
    
               // 4.关闭文件流
    
               try {
    
                   if (fos != null) {
    
                       fos.close();
    
                   }
    
               } catch (IOException e) {
    
                   e.printStackTrace();
    
               }
    
           }
    
       }
    
    }

    3 上机练习:复制文本文件

    需求描述

    文件“我的介绍.txt”位于D盘根目录下,要求将此文件的内容复制到E:myFilemyInfo.txt中。

    分析

    使用FileInputStream实现读取文本文件。

    使用FileOutputStream实现向文本文件中写数据

    实现思路

    1. 创建文件“D:我的介绍.txt”并自行输入内容

    2. 创建C:myFile的目录。

    3. 创建输入流FileInputStream对象,负责对D:我的结束.txt文件的读取。

    4. 创建输出流FileOutputStream对象,负责将文件内容写入到C:myFilemyInfo.txt中。

    5. 创建中转站数组words,存放每次读取的内容。

    6. 通过循环实现文件读写。

    7. 关闭输入流、输出流

    字符流方式读写文本文件

    1  BufferedReader读文本文件

    使用字符流读取文本文件相关类

    Reader

    FileReader(节点流)

    BufferedReader(处理流)

    Reader类常用方法

    int read( )

    int read(char[] c)

    int read(char[] c,int off,int len)

    void close( )

    子类BufferedReader常用的构造方法

    public  BufferedReader(Reader in)   //in通常使用FlieReader对象

    子类BufferedReader特有的方法

    public String readLine()   //读取一行信息

    乱码问题

    方案一:字节流到字符流的转换

    文本保存为utf-8格式

    FileInputStream fis=new FileInputStream("e:\mydoc.txt");
    
    //使用InputStreamReader并设置编码格式
    
    InputStreamReader fr=new InputStreamReader(fis,"UTF-8");
    
    BufferedReader br=new BufferedReader(fr);
    

      

    方案二:重构字符串

     示例代码

    package com.etc.io;
    
    //1.引入IO相关类
    
    import java.io.BufferedReader;
    
    import java.io.FileReader;
    
    import java.io.IOException;
    
    public class BrTest {
    
       public static void main(String[] args) {
    
           FileReader fr = null;
    
           BufferedReader br = null;
    
           try {
    
               // 2.创建一个FileReader对象
    
               fr = new FileReader("E:\mydoc.txt");
    
               // 3.创建一个BufferedReader 对象
    
               br = new BufferedReader(fr);
    
               // 4.读取一行数据
    
               String line = br.readLine();
    
               while (line != null) {
    
                   String str = new String(line.getBytes(), "UTF-8");
    
                   System.out.println(str);
    
                   line = br.readLine();
    
               }
    
           } catch (IOException e) {
    
               System.out.println("文件不存在!");
    
           } finally {
    
               try {
    
                   // 6. 关闭 流
    
                   if (br != null)
    
                       br.close();
    
                   if (fr != null)
    
                       fr.close();
    
               } catch (IOException e) {
    
                   e.printStackTrace();
    
               }
    
           }
    
       }
    
    }
    

      

    2  BufferedWriter写文本文件

    使用字符流写文本文件相关类

    Writer

    FileWriter(节点流)

    BufferedWriter(处理流)

    Writer类常用方法

    void write(String str)

    void write(String str,int off,int len)

    void close()

    void flush()

    子类BufferedWriter常用的构造方法

    BufferedReader(Writer out)  //in通常使用FlieWriter对象

    示例代码

    package com.etc.io;
    
    //1、引入IO相关类
    
    import java.io.BufferedWriter;
    
    import java.io.FileWriter;
    
    import java.io.IOException;
    
    public class BwTest {
    
       public static void main(String[] args) {
    
           FileWriter fw = null;
    
           BufferedWriter bw = null;
    
           try {
    
               // 2.创建一个FileWriter 对象
    
               fw = new FileWriter("e:\hi.txt");
    
               // 3.创建一个BufferedWriter 对象
    
               bw = new BufferedWriter(fw);
    
               // 4.写入数据
    
               bw.write("大家好!");
    
               bw.write("我正在学习Java IO。");
    
               bw.newLine();
    
               bw.write("请多多指教!");
    
               bw.newLine();
    
               bw.flush();// 刷新缓冲区
    
               System.out.println("写入文件信息成功!");
    
           } catch (IOException e) {
    
               System.out.println("文件不存在!");
    
           } finally {
    
               // 5.关闭流
    
               try {
    
                   if (bw != null) {
    
                       bw.close();
    
                   }
    
                   if (fw != null)
    
                       fw.close();
    
               } catch (IOException ex) {
    
                   ex.printStackTrace();
    
               }
    
           }
    
       }
    
    }
    

      

    3  上机练习:模板文件的替换

     需求描述

    1、格式模版保存在文本文件person.template中,内容如下:

    您好!

    我的名字是{name},我是{grade}学生。

    我的专业是{speciality}。

    2、其中{name}、{grade}、{speciality}是需要替换的内容,现在要求按照模板格式保存个人数据到文本文件,即把{name}、{grade}、{speciality}替换为具体的个人。

    分析

    1、使用Reader实现类读取文件

    2、使用String的replace(char oldChar, char newChar)的方法替换内容

    3、使用Writer实现类写文件

    字节流方式读写二进制文件

    1  DataInputStream类读取二进制文件(处理流)

    FileInputStream的子类

    与FileInputStream类结合使用读取二进制文件

    2  DataOutputStream类写二进制文件(处理流)

    FileOutputStream的子类

    与FileOutputStream类结合使用写二进制文件

    3  示例代码

    /**
    
         * 二进制文件拷贝
    
         * @param sFile 源文件
    
         * @param dFile 目标文件
    
         */
    
        public static void copyBinFile(File sFile, File dFile) {
    
            FileInputStream fis = null;// 定义字节流输入节点流
    
            DataInputStream dis = null;// 定义二进制输入处理流
    
     
    
            FileOutputStream fos = null;// 定义字节流输出节点流
    
            DataOutputStream dos = null;// 定义二进制输出处理流
    
     
    
            try {
    
                fis = new FileInputStream(sFile);
    
                dis = new DataInputStream(fis);// 构建二进制输入处理流
    
     
    
                fos = new FileOutputStream(dFile);
    
                dos = new DataOutputStream(fos);// 构建二进制输出处理流
    
     
    
                int temp;
    
                while ((temp = dis.read()) != -1) {// 读取数据
    
                    dos.write(temp);// 写数据
    
                }
    
     
    
                System.out.println("拷贝文件" + sFile.getName() + "成功!");
    
                System.out.println("文件路径:" + sFile.getAbsolutePath());
    
     
    
            } catch (FileNotFoundException e) {
    
                e.printStackTrace();
    
            } catch (IOException e) {
    
                e.printStackTrace();
    
            } finally {
    
                // 关闭资源
    
                try {
    
                    if (dos != null) {
    
                        dos.close();
    
                    }
    
                    if (fos != null) {
    
                        fos.close();
    
                    }
    
                    if (dis != null) {
    
                        dis.close();
    
                    }
    
                    if (fis != null) {
    
                        fis.close();
    
                    }
    
                } catch (IOException e) {
    
                    e.printStackTrace();
    
                }
    
            }
    
        }
    

      

    4  上机练习:从D盘拷贝一张图像文件到E盘



    本博客文章未经许可,禁止转载和商业用途!

    如有疑问,请联系: 2083967667@qq.com


  • 相关阅读:
    linux基础_用户和组的三个文件
    python_文件
    linux基础_用户组的管理
    mysql基础_数据类型
    mysql基础_操作数据库、表、记录
    linux基础_用户管理
    python_集合
    linux基础_关机重启注销
    docker创建私有仓库
    制作docker镜像
  • 原文地址:https://www.cnblogs.com/rask/p/8254125.html
Copyright © 2020-2023  润新知