Java,File类与IO流,FileReader和FileWriter、FileInputStream和FileOutput的使用

FileReader和FileWriter

FileReader的使用:

步骤:

①创建File类的对象,对应着hello.txt的文件。

②创建输入型的字符流,用于读取数据。

③读取数据,并显示在控制台上。

④流资源的关闭(必须要资源关闭,否则会内存泄露),要使用try-catch-finally的方式,将close放在finally中,确保资源一定被关闭。

注意:

  • 读取时有一些地方要进行异常处理,若使用throws的方式,出现异常时会导致后面的close操作无法执行,可能导致内存的泄露。要将指定代码放入try-catch-finally结构中(close的操作放进finally中)。
  • 若fileRead为null,则并没有读取的操作,不用进行流资源的关闭,所以要在close处加判断。

操作的代码如下:

csharp 复制代码
public void test12()
{
    FileReader fileReader = null;
    try
    {
        //①创建File类的对象,对应着hello.txt的文件
        File ff = new File("hello.txt");
        //②创建输入型的字符流,用于读取数据
        fileReader = new FileReader(ff);
        //③读取数据,并显示在控制台上。
        char[] cbuffer = new char[5];
        int len;
        while ((len = fileReader.read(cbuffer)) != -1)
        {
            for (int i = 0; i < len; i++)
            {
                System.out.print(cbuffer[i]);
            }
        }
    } catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        //④流资源的关闭(必须要资源关闭,否则会内存泄露)
        //要使用try-catch-finally的方式,将close放在finally中,确保资源一定被关闭。
        try
        {
            if(fileReader != null)
            {
                fileReader.close();
            }
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

FileWriter的操作:

步骤:

①创建File的对象,指明要写出的文件的名称

②创建输出流

③写出具体的输出过程

④关闭资源

注意1:

  • 与FileReader类似,输出时有一些地方要进行异常处理,若使用throws的方式,出现异常时会导致后面的close操作无法执行,可能导致内存的泄露。要将指定代码放入try-catch-finally结构中(close的操作放进finally中)。
  • 在new FileWriter( )构造器中,在参数加了指定的File对象后,若参数再加上true,则对File对象代表的文件是做追加操作,即在原来的文件上增加输出内容。若不加上boolean的参数,则默认为添加了false。添加false,则File对象代表的文件是做覆盖操作,即原来的内容全被输出的内容替代。

操作的代码如下:

csharp 复制代码
public void test2()
{
    FileWriter fw = null;
    try
    {
        //①创建File的对象,指明要写出的文件的名称
        File ff = new File("sigma.txt");
        //②创建输出流
        fw = new FileWriter(ff);//若参数中加上true,则文件为可追加,在原有的文件中加上内容
                                //若参数中没有true或false,默认为false,即不可追加,对文件进行覆盖
        //③写出具体的输出过程
        //输出的方法:write(String str)/write(char[] cdata)
        fw.write("I'm a sigma mam\n");
        fw.write("Will never fall into women's trick\n" );
        fw.write("Never be a low dog");
        System.out.println("输出成功");
    } catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        //④关闭资源
        try
        {


            if (fw != null)
            {
                fw.close();
            }
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

如果要用输入输出流复制某一个文件的内容,就是将以上两个操作结合起来,具体步骤如下:

scss 复制代码
public void Test33()
{
    FileReader fr = null;
    FileWriter fw = null;
    try
    {
        //1.创建File的对象
        File src = new File("hello.txt");
        File dest = new File("hello_copy.txt");
        //2.创建输入流和输出流
        fr = new FileReader(src);
        fw = new FileWriter(dest);
        //3.数据的读入和写入的过程
        char[] cbuffer = new char[5];
        int len;//记录每次读入到cbuffer中的字符的个数
        while((len = fr.read(cbuffer)) != -1)
        {
            //write(char[] cbuffer,int fromIndex,int len)读取cbuffer中的fromIndex的下标到len下标的元素的内容
            fw.write(cbuffer,0,len);
        }
        System.out.println("复制成功");
    } catch (IOException e)
    {
        e.printStackTrace();
    } finally
    {
            //4.关闭资源
        try
        {
            if (fr != null)
            {
                fr.close();
            }
        } catch (IOException e)
        {
            e.printStackTrace();
        }
        try
        {
            if(fw != null)
            {
                fw.close();
            }
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

注意点2(对于FileReader和FileWriter):

①因为涉及到流资源的关闭操作,所以出现异常,需要使用try-catch-finally的方式来处理异常。

②对于输入流来讲,要求File类的对象对应的物理磁盘上的文件必须存在。否则,会报FileNotFoundException异常。

对于输出流来讲,File类的对象对应的物理磁盘上的文件可以不存在。

·如果此文件不存在,则在输出的过程中,会自动创建此文件,并写出数据到此文件中。

·如果此文件存在,根据FileWriter的构造器来决定追加还是覆盖(见上面的注意点1)。

FileInputStream和FileOutputStream

但是,字符流不适合用来处理非文本文件,便要用到字节流。

字节流的使用步骤也与字符流类似:

1.创建相关File类的对象

2.创建相关的字节流

3.数据的读写操作

读入:read(byte[ ] cbffer)

写出:write(byte[ ] cbuffer,0,len)

4.关闭资源

如要复制一份图片文件,操作如下:

ini 复制代码
FileInputStream fis = null;
FileOutputStream fos = null;
try
{
    //1.创建相关File类的对象
    File srcFile = new File("输入流的图片文件.jpg");
    File destFile = new File("输出流的成功文件.jpg");
    //2.创建相关的字节流
    fis = new FileInputStream(srcFile);
    fos = new FileOutputStream(destFile);
    //3.数据的读写操作
    byte[] buffer = new byte[1024];//1kb
    int len;//记录每次读入到buffer中的字节的个数
    while((len = fis.read(buffer)) != -1)
    {
        fos.write(buffer,0,len);
    }
} catch (IOException e)
{
    e.printStackTrace();
} finally
{
    //4.关闭资源
    try
    {
        if(fis != null)
        {
            fis.close();
        }
    } catch (IOException e)
    {
        e.printStackTrace();
    }
    try
    {
        if(fos != null)
        {
            fos.close();
        }
    } catch (IOException e)
    {
        e.printStackTrace();
    }
}

注意点3(在注意点2的基础上):

字节流用来操作文本文件时,如果是复制操作,不会出问题。如果是读取操作,可能会出现问题(因为文本文件的读取操作中涉及到比如汉字的信息时,由于汉字在Unicode编码中占三个字节,不是相应汉字的三个字节一起读取时,会出现乱码,此时应该使用字符流来操作)。

说明:

文本文件:.txt、.java、.c、.cpp 等

非文本文件:.doc、.xlc、.jpg、.pdf、.mp3 等

相关推荐
大模型玩家七七1 小时前
基于语义切分 vs 基于结构切分的实际差异
java·开发语言·数据库·安全·batch
寻星探路6 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧8 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法9 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7259 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎9 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄9 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿9 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds10 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化