IO(5)----字符流

版权声明:未经同意,严禁转载 https://blog.csdn.net/pengchengliu/article/details/82900038

一、字符输出流Writeer                                                                                                                                    点击此处返回总目录

二、FileWriter

三、字符输入流Reader

四、FileReader

五、案例:使用字符流实现文本文件复制

一、字符输出流Writer

java.io.Writer是所有字符输出流的超类。也是用于写文件。但是这种流的局限性很大,只能用于写文本文件,不能写别的。写图片,音乐什么的都不可以。

什么叫文本文件?用记事本打开,能够看得懂的就是文本文件。比如,txt,sql文件等等。

方法:

1. write(int c)                                  //写入一个字符。【例1】【例2】

2. write(char[] c)                             //写入字符数组。【例3】

3. write(char[] c ,int off, int len)      //写入字符数组的一部分,从off开始写len个。【例4】

4. write(String s)                            //写入字符串。【例5】

5. flush()                                       //刷新该流的缓冲。Writer写数据时,必须要运行flush()。如果不刷新,数据是不会走到目的地的。

                                                     //建议写一次刷一次,如果不刷的话,数据都存在于内存中,浪费资源,所以还是写一个刷一个好

6. close()                                       //关闭此流,但要先刷新它。也就是执行close()时,默认会先执行flush(),然后再关闭资源。

flush()与close()的区别:

flush()刷新完以后流还能用,close()的话不但刷新了,而且流也废掉不能用了。

flush()只有字符输出流Write使用,别的(字节输出流、字节输入流、字符输入流等)都不使用。

Writer是抽象类,子类有FileWriter等。

二、FileWriter  

1)构造方法

作用:绑定数据目的。

1. FileWriter(File file)

2. FileWriter(File file, boolean append)

3. FileWriter(String filename)

4. FileWriter(String filename, boolean append)

2)父类功能演示

例1:

package cn.itcast.demo10;

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

public class Test {
    public static void main(String[] args) throws IOException{
        FileWriter fw = new FileWriter("e:\\f.txt");
        fw.write(97);         //第一句
        fw.flush();            //第二句
        fw.close();           //第三句
    }
}

运行结果:打开e:\\f.txt,可以看到"a"。

如果只有第一句,没有第二三句,f.txt中将不会有任何信息,因为没有刷新。当然这么写是错误的,因为没有close()。

如果有第一二句,没有第三句,f.txt中会看到"a"。但是这么写是错误的,因为没有close()。

如果有第一句,第三句,f.txt中会看到"a"。这么写是正确的,因为close()会先执行flush()。但是这么写不好,应该write一句,写一个flush,不要等到最后close()的时候flush。

例2:

package cn.itcast.demo10;

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

public class Test {
    public static void main(String[] args) throws IOException{
        FileWriter fw = new FileWriter("e:\\f.txt");
        fw.write(97);
        fw.flush();                                                  //写一次刷新一次。不要等到最后close()的时候刷新。
        
        fw.write(99);
        fw.flush();
        
        fw.close();       
    }
}

运行结果:

查看e:\\f.txt,可以看到结果为"ac"。

例3:

package cn.itcast.demo10;

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

public class Test {
    public static void main(String[] args) throws IOException{
        FileWriter fw = new FileWriter("e:\\f.txt");
        fw.write("abcd".toCharArray());
        fw.flush();          
        
        fw.close();       
    }
}

运行结果:

abcd

例4:

package cn.itcast.demo10;

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

public class Test {
    public static void main(String[] args) throws IOException{
        FileWriter fw = new FileWriter("e:\\f.txt");
        char[] c = {'a','b','c','d'};
        
        fw.write(c,1,2);
        fw.flush();          
        
        fw.close();       
    }
}

运行结果:

bc

例5:

package cn.itcast.demo10;

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

public class Test {
    public static void main(String[] args) throws IOException{
        FileWriter fw = new FileWriter("e:\\f.txt");
        fw.write("haha");
        fw.flush();          
        
        fw.close();       
    }
}

运行结果:

haha

三、字符输入流Reader

是所有字符输入流的超类。作用:读取文本文件。只能读取文本文件。读一首歌什么的不行。

方法:

int read()                                                               //与字节输入流完全相同。【例1】

int read(char[] cbuf)                                              //与字节输入流完全相同。【例2】

Writer是抽象类,子类有FileReader等。

四、FileReader类

1)构造方法

作用:绑定数据源

1. FileReader(File file)                  //参数是File类型对象

2. FileReader(String name)          //参数是String类型对象

2)继承过来的方法演示

例1:

package cn.itcast.demo11;

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

public class Test {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("e:\\aaa.txt");
        int i = 0;

        while((i = fr.read()) != -1){
            System.out.print((char)i);
        }
    }
}

例2:

package cn.itcast.demo11;

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

public class Test {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("e:\\aaa.txt");
        int len = 0;
        char[] ch = new char[1024];

        while((len = fr.read(ch)) != -1){
            System.out.print(new String(ch,0,len));
        }
    }
}

五、案例:使用字符流实现文本文件复制

package cn.itcast.demo12;

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

public class Test {
    public static void main(String[] args) {
        FileReader fr = null;
        FileWriter fw = null;
        
        try{
            fr = new FileReader("e:\\a.txt");                   //a.txt的默认编码方式是GBK。
            fw = new FileWriter("e:\\b.txt");
            
            int len = 0;
            char[] ch = new char[1024];
            while((len = fr.read(ch))!=-1){
                fw.write(ch, 0, len);
                fw.flush();
            }
            
        }catch(IOException e){
            e.printStackTrace();
            throw new RuntimeException("复制失败");
        }finally{
            try{
                fw.close();
            }catch(IOException e){
                throw new RuntimeException("资源关闭失败"); 
            }finally{
                try{
                    fw.close();
                }catch(IOException e){
                    throw new RuntimeException("资源关闭失败");
                }
            }
        }
    }
}
 

aaa.txt中默认的编码方式是GBK,运行后b.txt中的内容为:

123456789
987654321
000000000
中国
静静
 

没有问题,是正确的。

但是将aaa.txt另存一份,选择编码为utf-8:

同样执行上面的程序,结果为:

锘?23456789
987654321
000000000
涓浗
闈欓潤
 

出现了乱码!!

要想解决这种问题,需要用到下一节的转换流。

猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/82900038