字符流(Reader、Writer)

字符流(可以读取中英文结合的文件,而不乱码

字节流是以字节为单位来读写文件,而字符流是以字符为单位来读取文件 1个字符 = 2个字节

1.Reader是一个抽象类,是个超类,是所有字符输入流的父类


FileReader extends InputStreamReader extends Reader 是读取文件字符流
FileReader :文件字符输入流
作用:将硬盘上的文件以字符的形式读取到内存中
构造方法:
1. public FileReader(String fileName)
2. public FileReader(File file)
FileReader构造方法的作用
1.构造FileReader对象
2.将FileReader对象指向要读取的文件

字符的读取:

package iotest.charIOtest;

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

public class TestFileReader01 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("src\\iotest\\charIOtest\\a.txt");
        //一次读取一个字符
       /* int len = 0;
        while ((len = fr.read()) != -1){//read方法是InputStreamReader中的read方法,FileReader继承InputStreamReader
            System.out.println((char) len);
        }*/
        //一次读取多个字符

        char[] c = new char[2];
        int len = 0;
        while ((len = fr.read(c) ) != -1){//read方法是Reader中的read方法,FileReader继承Reader
            /*string中构造方法,可将字符数组转化为字符串
            *public String(char value[])
            *  public String(char value[], int offset, int count) */
            System.out.print(new String(c,0,len));

        }
        fr.close();
    }
}

2.Writer是一个抽象类,超类,是所有字符输出流的父类

里面有方法:
public void write(int c)
public void write(char cbuf[])
abstract public void write(char cbuf[], int off, int len)
public void write(String str)
public void write(String str, int off, int len)
abstract public void flush()
abstract public void close()


FileWriter extends OutputStreamWriter extends Writer
构造方法
public FileWriter(String fileName)
public FileWriter(File file)

字符输出流的使用步骤:
1.创建FileWriter 对象,构造方法中绑定要写入数据的地址
2.使用write方法(父类中OutputStreamWriter ),将数据写入到内存缓冲区(字符转化为字节的过程)
3.使用父类中OutputStreamWriter的flush方法,将内存缓冲区中的数据刷新到文件中(如果没有这一步,可能数据不会写在文件中,而是一直在内存缓冲区里,打开文件时无数据)
4.释放资源(会先把内存缓冲区的数据刷新到文件中,因此flush可以不写

flush方法与close方法的区别
--flush:刷新内存缓冲区,流对象可以继续使用
--close:先刷新内存缓冲区,然后通知系统释放资源。流对象不可再被使用了。

写方法有:
public void write(int c) --写单个字符
public void write(char cbuf[]) --写字符数组
public void write(char cbuf[], int off, int len)--写指定长度的字符数组
public void write(String str) --写字符串
public void write(String str, int off, int len)--写指定长度的字符串

package iotest.charIOtest;

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

public class TestFileWriter01 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("src\\iotest\\charIOtest\\b.txt");
        fw.write(97);
        char[] cs = {'a','b','c','d','e'};
        fw.write(cs);
        fw.write(cs,1,3);
        fw.flush();
        fw.write("京津冀");
        fw.write("京津冀",1,2);
        fw.close();
    }
}

续写和换行
续写,追加写:使用两个参数的构造方法
public FileWriter(String fileName, boolean append)
public FileWriter(File file, boolean append)
append为追加续写开关,为true,不创建新文件覆盖源文件,可续写;为false,创建新文件覆盖源文件,不可续写。

换行:换行符
Windows:\r\n
Linux:/n
mac:/r

流中异常处理:
jdk7的新特性:
在try的后面可以增加一个(),在括号中可以定义流对象
那么这个流对象的作用域在try中生效
try中的代码执行完毕,会自动把流对象释放,不用写finally
格式:
try(定义流对象;定义流对象;....){
可能会出现异常的代码块
}catch(异常类变量 变量名)[
异常处理逻辑
}

package iotest.charIOtest;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//try catch 来处理流异常
public class TestTryCatch {
    public static void main(String[] args) {
        try(FileReader fr = new FileReader("src\\iotest\\charIOtest\\a.txt");
            FileWriter fw = new FileWriter("src\\iotest\\charIOtest\\b.txt",true);){
            int len = 0;
            while ((len = fr.read()) != -1){
                fw.write(len);
            }
        }catch (IOException e){
            System.out.println(e);
        }
    }
}

jdk9的新特性:
在try的前面可以定义流对象,在try后()可直接引入流对象的名称
try中的代码执行完毕,会自动把流对象释放,不用写finally
A a = new A();
B b = new B();
try(a;b){
可能会出现异常的代码块
}catch(异常类变量 变量名)[
异常处理逻辑
}

猜你喜欢

转载自www.cnblogs.com/zgmzbhqa/p/13399827.html