Java基础之(三十五)输入输出<二>

上一节的内容是读取很小的文件,这一节为大家介绍大文件的读写方法以及字符流的使用方法。

大文件的输入输出

InputStream将输入数据抽象成如图所示的水管,所以程序既可以通过read()方法每次读取一个”水滴“,也可以通过read(byte[] b)或read(char[] c)每次读取多个“水滴”。当使用数组作为read()的参数时,我们可以理解为使用一个“竹筒”到如图所示的水管中去取水,程序每次调用输入流的read(byte[] b)或read(char[] c)方法,就相当于“用竹筒”从水管中取出一筒“水滴”,程序得到竹筒里的“水滴”后,转换成相应的数据即可程序多次重复“取水”这个过程,直到read(byte[] b)或read(char[] c)方法返回-1,则表明取水取到了最后,即到了输入流的终点。

这里写图片描述

我们首先在e:/src目录下创建了一个7K大小的from.txt文件,下面使用FileInputStream类和FileOutputStream类实现数据的输入输出:

public class Test {
    public static void main(String[] args){
        //声明输入流引用
        FileInputStream fis = null;
        //声明输出流引用
        FileOutputStream fos = null;

        try{
            //生成代表输入流的对象
            fis = new FileInputStream("E:/src/from.txt");
            //生成代表输出流的对象
            fos = new FileOutputStream("E:/src/to.txt");
            //生成一个1K大小的字节数组
            byte[] buffer = new byte[1024];
            while(true){
            //调用输入流对象的read()方法,每次最多读取1K数据
            int temp = fis.read(buffer, 0, buffer.length);
            if(temp == -1){
                break;
                }
            //调用输出流对象的write()方法,输出数据
            fos.write(buffer, 0, temp);
            }

            for(int i = 0;i < buffer.length;i++){
                System.out.println(buffer[i]);
            }       

        }catch(Exception e){
            System.out.println(e);
        }
    }   
}

使用Java的IO流执行输入输出时,不要忘了关闭输入输出流。我们使用close()方法来关闭该文件的输入输出流,程序里打开的IO文件资源不属于内存里的资源,垃圾回收无法回收该资源,所以应该显式关闭文件IO资源。并且,我们应该把关闭文件资源放在finally块里,这样可以保证输入输出流一定会被关闭,同时使程序更安全。

public class Test {
    public static void main(String[] args) throws IOException{
        //声明输入流引用
        FileInputStream fis = null;
        //声明输出流引用
        FileOutputStream fos = null;

        try{
            //生成代表输入流的对象
            fis = new FileInputStream("E:/src/from.txt");
            //生成代表输出流的对象
            fos = new FileOutputStream("E:/src/to.txt");
            //生成一个1K大小的字节数组
            byte[] buffer = new byte[1024];
            while(true){
            //调用输入流对象的read()方法,每次最多读取1K数据
            int temp = fis.read(buffer, 0, buffer.length);
            if(temp == -1){
                break;
                }
            //调用输出流对象的write()方法,输出数据
            fos.write(buffer, 0, temp);
            }

            for(int i = 0;i < buffer.length;i++){
                System.out.println(buffer[i]);
            }       

        }catch(Exception e){
            System.out.println(e);
        }

        finally{
            fis.close();
            fos.close();
        }
    }   
}

另外,在使用fis.close()和fos.close()的时候,别忘了在main()方法的后面加上throw IOException;当然如果不在main()方法的后面加上这么一句,也可以在finally块中捕获异常:

        finally{

                    try {
                        fis.close();
                        fos.close();                    
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

字符流

字符流是针对字符数据的特点进行过优化的,因而提供一些面向字符的有用特性,字符流的源或目标通常是文本文件。 Reader和Writer是java.io包中所有字符流的父类。由于它们都是抽象类,所以应使用它们的子类来创建实体对象,利用对象来处理相关的读写操作。

Reader类

面向字符的输入流类都是Reader的子类,其类层次结构如图所示

这里写图片描述

下表列出了 Reader 的主要子类及说明。

这里写图片描述

Reader 所提供的方法如表所示,可以利用这些方法来获得流内的位数据。

这里写图片描述

使用 FileReader 类读取文件

FileReader 类是 Reader 子类 InputStreamReader 类的子类,因此 FileReader 类既可以使用Reader 类的方法也可以使用 InputStreamReader 类的方法来创建对象。

在使用 FileReader 类读取文件时,必须先调用 FileReader()构造方法创建 FileReader 类的对象,再调用 read()方法。FileReader 构造方法的格式为:
public FileReader(String name); //根据文件名创建一个可读取的输入流对象

下面看一个例子,利用 FileReader 类读取纯文本文件的内容:

我们首先在e:/src目录下新建一个from.txt和to.txt文件。其次在from.txt文件中写入数据“abcd”;我们的目的是从from.txt中读取这些数据。

public class Exercise1 {
    public static void main(String[] args){
                //声明输入流引用
                FileReader fr = null;
                //声明输出流引用
                FileOutputStream fos = null;

                try{
                    //生成代表输入流的对象
                    fr = new FileReader("E:/src/from.txt");
                    //生成一个1K大小的字符数组
                    char[] buffer = new char[1000];
                    int temp = fr.read(buffer, 0, buffer.length);

                    for(int i = 0;i < buffer.length;i++){
                        System.out.print(buffer[i]);
                    }       

                }catch(Exception e){
                    System.out.println(e);
                }

    }   
}
输出结果:
abcd

从结果上可以看出我们已经成功的读取到from.txt文件中数据。而且可以看出Reader和InputStream的功能和用法几乎是一模一样的。

需要注意的是,Java 把一个汉字或英文字母作为一个字符对待,回车或换行作为两个字符对待。

Writer类

面向字符的输出流都是类 Writer 的子类,其类层次结构如图所示。

这里写图片描述

下表列出了 Writer 的主要子类及说明。

这里写图片描述

Writer 所提供的方法如表所示。

这里写图片描述

使用 FileWriter 类写入文件
FileWriter 类是 Writer 子类 OutputStreamWriter 类的子类,因此 FileWriter 类既可以使用 Writer类的方法也可以使用 OutputStreamWriter 类的方法来创建对象。

在使用 FileWriter 类写入文件时,必须先调用 FileWriter()构造方法创建 FileWriter 类的对象,再调用 writer()方法。FileWriter 构造方法的格式为:

public FileWriter(String name); //根据文件名创建一个可写入的输出流对象
public FileWriter(String name,Boolean a); //a 为真,数据将追加在文件后面

下面看一个例子,利用 FileWriter 类将字符写入到文件中:

我们在e:src目录下再新建一个to.txt文件,我们将上面程序中读到的数据放入to.txt文件中:

public class Exercise1 {
    public static void main(String[] args){
        //声明输入流引用
                FileReader fr = null;
                //声明输出流引用
                FileWriter fw = null;

                try{
                    //生成代表输入流的对象
                    fr = new FileReader("E:/src/from.txt");
                    //生成代表输出流的对象
                    fw = new FileWriter("E:/src/to.txt");
                    //生成一个1K大小的字节数组
                    char[] buffer = new char[1000];

                    //调用输入流对象的read()方法,每次最多读取1K数据
                    int temp = fr.read(buffer, 0, buffer.length);           
                    //调用输出流对象的write()方法,输出数据
                    fw.write(buffer, 0, temp);

                    for(int i = 0;i < buffer.length;i++){
                        System.out.print(buffer[i]);
                    }       

                }catch(Exception e){
                    System.out.println(e);
                }


                finally{

                    try {
                        fr.close();
                        fw.close();                 
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
    }   
}

编译运行,打开to.txt文件即可发现已经成功写入“abcd”字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值