java IO流的总结(上)

什么是IO流?

IO指的就是input和output,输入和输出,从硬盘读取内容到内存中,这就是输入(也就是读),从内存中写出内容到硬盘这就是输出(也就是写)。简单点来说输入(也就是读)是将文件内容读取到控制台上,输出(也就是写)是指把程序中要写的内容输出到硬盘的文件上。输入和输出都是相对于内存而言的。

什么是流?

在输入和输出(读和写)的时候会打开一个通道(或者叫管道)将内容流入或流出,流就是输入和输出(读和写)的一种媒介(或者说管道),文件的内容需要通过流这种媒介(或者说管道)才能输入(读)到控制台上或者输出(写)到硬盘上。

一、流的四大家族

1. InputStream 字节输入流
2. OutputStream 字节输出流
3. Reader 字符输入流
4. Writer 字符输出流

  • 这四个流都是抽象类,不能直接new,只能new其子类。

二、文件常用流

  1. FileInputStream 文件字节输入流(以字节方式从硬盘上读取文件将其输出到控制台上)
  2. FileOutputStream 文件字节输出流(以字节方式将内存中的内容写入到硬盘的文件上)
  3. FileReader 文件字符输入流(以字符方式从硬盘上读取文件内容输出到控制台上)
  4. FileWriter 文件字符输出流(以字符方式将内存中内容写入到硬盘的文件上)
    其中1和2是万能流适用于所有文件(因为是以字节的方式输入和输出),3和4只适用于普通文本文件(因为是以字符方式输入和输出)

文件常用流FileInputStream的使用

使用FileInputStream对象读取硬盘中文件内容的步骤

1.创建FileInputStream对象,new其对象的时候传入要读取文件的路径(可以是绝对路径,也可以是相对路径)
2.创建一个byte数组,byte数组的长度就是每次读取文件的字节数。
3.使用FileInputStream对象(引用)调用read() 方法传入参数为byte数组,表示每次读取的文件字节数。(read() 方法的介绍在代码下面)
4.使用循环判断读取为空的时候结束读取,将每次读取到的内容通过String的构造方法转化为字符串输出。
5.在读取完成之后需要使用close() 方法来关闭流。

请看代码。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 文件输入流的测试
 */
public class TestFileInputStream {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            //new FileInputStream对象的时候参数为读取文件的路径
            fis=new FileInputStream("G:\\测试.txt");
            //new 一个byte数组,每次读取的字节数就是byte数组的长度
            byte[] bytes=new byte[5];
            int readCount=0;
            //引用.read()方法的返回值为-1的话表明文件内容已经读完
            while((readCount=fis.read(bytes))!=-1){
                //将读取的byte数组通过new String的办法转化为字符串,在控制台输出。
                System.out.println(new String(bytes,0,readCount));
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
        /*
        finally语句块一定是try...catch语句之后执行的语句块(详情参见我的博客 “异常机制的处理”)
        在输入完成之后判断对象(引用)是否为空,不为空的话需要使用close()方法关闭流。
        */
            if(fis!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

程序的执行结果:
在这里插入图片描述

  • FileInputStream的read方法是以byte数组的方式来读取硬盘中的文件的内容的,返回值为读取到的文件字节的个数,当读取不到的时候返回值为-1
  • read方法读取到的内容会保存在byte数组中,再通过new String的方式将byte数组中的内容转化为字符串输出在控制台。将byte数组转化为String的构造方法,第一个参数是要转化的byte数组,第二个参数是开始转化的数组下标,第三个参数是读取到的长度。
  • 注意: FileInputStream对象的创建是打开了一个流的通道,使用完之后要关闭流的通道 使用 对象(引用).close()的方法关闭流。 在使用FIleInputStream对象输入的时候有异常情况,try…catch或者throws即可(参见我的博客异常机制的处理)。

文件常用流FileOutputStream的使用

使用FileOutputStream对象将内存中的内容写入到硬盘中文件的步骤

1.创建FileOutputStream对象,new其对象的时候传入要读取文件的路径(可以是绝对路径,也可以是相对路径,若文件不存在,会自动创建一个文件)也可以选择在路径后面传入布尔值 “true” 表示实在原文件内容后面进行追加写入,若不传入这个布尔值 "true"的话是默认清除原文件内容后再进行内存内容的写入。这一点要重视。
2.创建一个byte数组并且初始化。
3.使用FileOutputStream对象(引用)调用write() 方法,传入参数,参数一是数组对象(引用),参数二是起始写入的位置,参数三是要写入的长度。
4.写入完成之后要使用flush() 方法刷新流,在最后还需要使用close() 方法关闭流。

请看代码。

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 文件输出流的测试
 */
public class TestFileOutputStream {
    public static void main(String[] args) {
        FileOutputStream fos=null;
        try {
        	//true表示在原文件内容后面追加写入
            fos=new FileOutputStream("G:\\测试.txt",true);
            //初始化byte数组
            byte[] bytes={'A','B','C','D','E','F'};
            //写入byte数组,参数一是数组对象(引用),参数二是起始写入的位置,参数三是要写入的长度
            fos.write(bytes,0,bytes.length);
            //刷新流
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //关闭流
            if(fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  • FileOutputStream的write()方法是以byte数组的方式来将内存中的内容写入到硬盘文件中的,无返回值。
  • 注意 使用FileOutputStream对象(引用)写入完成之后要使用flush()方法 来刷新流,还要使用close()方法来 关闭流,其中会有一些异常情况的处理,关于异常的处理请看我的博客异常机制的处理

文件常用流FileReader的使用

使用FileReader对象读取硬盘中文件内容的步骤 与FileInputStream读取硬盘中文件内容的步骤一致,只不过是将byte数组换成了char数组,可以直接将数组内容输出,不需要再转化为字符串输出了。

请看代码。

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TestFileReader {
    public static void main(String[] args) {
        FileReader fr=null;
        try {
            fr=new FileReader("G:\\测试.txt");
            //每次读取字符的个数为char数组的长度
            char[] chars=new char[5];
            int readCount=0;
            //和FileInputStream一样判断是否读取为空
            while((readCount=fr.read(chars))!=-1){
                //每次读取5个字符,利用增强for循环将char数组元素输出
                for (char c:chars) {
                    //只输出不换行
                    System.out.print(c);
                }
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //关闭流
            if(fr!=null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

程序执行结果:
在这里插入图片描述

文件常用流FileWriter的使用

使用FileWriter对象将内存中的内容写入硬盘中的文件的步骤 与FileOutputStream读取硬盘中文件内容的步骤一致,只不过是将byte数组换成了char数组或者还可以直接写入一个字符串。

请看代码。

import java.io.FileWriter;
import java.io.IOException;

public class TestFileWriter {
    public static void main(String[] args) {
        FileWriter fw=null;
        try {
        	//true表示在原文件内容后面追加写入
            fw=new FileWriter("G:\\测试.txt",true);
            char[] chars={'A','B','C'};
            //可以直接写入一个char数组
            fw.write(chars);
            //也可以直接写入一个String字符串
            fw.write("我是中国人");
            
            //刷新流
            fw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //关闭流
            if(fw!=null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

有用就好,喜欢就点赞,持续关注,精彩不断!


码字不易,不要白嫖,觉得有用的,可以给我点个赞。感谢!
因技术能力有限,如文中有不合理的地方,希望各位大佬指出,在下方评论区留言,谢谢,希望大家一起进步,一起成长。
如需转载请注明来源,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值