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

目录

FileReader和FileWriter

FileReader的使用:

步骤:

注意:

操作的代码如下:

FileWriter的操作:

步骤:

注意1:

操作的代码如下:

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

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

FileInputStream和FileOutputStream

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

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

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

说明:


FileReader和FileWriter

FileReader的使用:

步骤:

①创建 File 类的对象,对应着 hello.txt的文件。
②创建输入型的字符流,用于读取数据。
③读取数据,并显示在控制台上。
④流资源的关闭(必须要资源关闭,否则会内存泄露), 要使用 try-catch-finally 的方式,将 close 放在 finally中,确保资源一定被关闭。

注意:

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

操作的代码如下:

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对象代表的文件是做覆盖操作,即原来的内容全被输出的内容替代。

操作的代码如下:

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();
        }
    }
}

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

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.关闭资源

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

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    等

你可能感兴趣的:(Java,从入门到入土,java)