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 等

相关推荐
Reese_Cool几秒前
【C语言二级考试】循环结构设计
android·java·c语言·开发语言
严文文-Chris25 分钟前
【设计模式-享元】
android·java·设计模式
Flying_Fish_roe42 分钟前
浏览器的内存回收机制&监控内存泄漏
java·前端·ecmascript·es6
c#上位机1 小时前
C#事件的用法
java·javascript·c#
【D'accumulation】1 小时前
典型的MVC设计模式:使用JSP和JavaBean相结合的方式来动态生成网页内容典型的MVC设计模式
java·设计模式·mvc
试行2 小时前
Android实现自定义下拉列表绑定数据
android·java
茜茜西西CeCe2 小时前
移动技术开发:简单计算器界面
java·gitee·安卓·android-studio·移动技术开发·原生安卓开发
救救孩子把2 小时前
Java基础之IO流
java·开发语言
小菜yh2 小时前
关于Redis
java·数据库·spring boot·redis·spring·缓存