展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

字符流

  • Reader是输⼊字符流的⽗类,它是⼀个抽象类, 部分库不推荐使⽤Reader/Writer
int read()
    ⼀个字符⼀个字符的读,只能⽤来操作⽂本(不能写图⽚ ⾳频 视频)
int read(char cbuf[])
    从输⼊字符流中读取⼀定数量的字符,并将其存储在缓冲区数组cbuf中, 返回实际读取的字符数,如果已经到达流末尾⽽没有可⽤的字节,则返回-1
void close() throws IOException
    关闭输⼊流并释放与该流关联的系统资源
  • FileReader ⽤来读取字符⽂件的实现类
// 传入文件路径
public FileReader(String fileName) throws FileNotFoundException {
 super(new FileInputStream(fileName));
}
// 传入文件
public FileReader(File file) throws FileNotFoundException {
 super(new FileInputStream(file));
}
  • 代码案例
public class ReaderTest {

    public static  void main (String [] args) throws Exception {
        test1();
        test2();
    }

    public static void test1()throws Exception {
        String dir = "C:\\Users\\79466\\Desktop\\test\\1.txt";
        File file = new File(dir);
        // 传入要读取的文件路径
        Reader input = new FileReader(file);
        int ch;
        // 读取文件
        while ( (ch = input.read())!=-1){
            System.out.print((char)ch);
        }
        input.close();
    }

    public static void test2()throws Exception {
        String dir = "C:\\Users\\79466\\Desktop\\test\\1.txt";
        File file = new File(dir);
        Reader input = new FileReader(file);
        char c[] = new char[1024];
        //一次性读取,读取到数组
        int len =  input.read(c);
        // 打印读取到的内容,读取c数组中的数据,从0开始读
        System.out.println("内容为:"+ new String(c,0,len));
        input.close();
    }

}
  • Writer是输出字符流的⽗类,它是⼀个抽象类
public void write(int c) throws IOException
    直接将int型数据作为参数的话,是不会写⼊数字的,⽽是现将数字按照ascll码表转换为相应的字符,然后写⼊
public void write(String str) throws IOException
    要想实现数字和中⽂的写⼊,必须要⽤String为参数的Write
public abstract void write(char cbuf[], int off, int len) throws IOException;
    将cbuf字符数组的⼀部分写⼊到流中,但能不能写len个字符取决于cbuf中是否有那么多
void flush() throws IOException
    write是写到缓冲区中,可以认为是内存中,当缓冲区满时系统会⾃动将缓冲区的内容写⼊⽂件,但是⼀般还有⼀部分有可能会留在内存这个缓冲区中, 所以需要调⽤flush空缓冲区数据。对⽐BufferWriter需要实时查表,效率低,其实缓冲区IO的各个都有,只不过很⼩被忽略,OutputStream都有flush⽅法,看⼦类是否有重写
void close() throws IOException
    关闭输⼊流并释放与该流关联的系统资源
  • FileWriter ⽤来写出字符⽂件的实现类
public FileWriter(String fileName) throws IOException
     如果⽂件不存在,这会⾃动创建。如果⽂件存在,则会覆盖
public FileWriter(File file) throws IOException
    如果⽂件不存在,这会⾃动创建。如果⽂件存在,则会覆盖
public FileWriter(String fileName, boolean append) throws IOException
    加⼊true参数,会实现对⽂件的续写,使⽤false则会实现对⽂件的覆盖
public FileWriter(File file, boolean append) throws IOException
    加⼊true参数,会实现对⽂件的续写,使⽤false则会实现对⽂件的覆盖
  • 代码案例
public class WriterTest {

    public static void main(String [] ags)throws Exception{
        test1();
        test2();
    }

    public static void test2() throws IOException {
        String dir = "C:\\Users\\79466\\Desktop\\test\\2.txt";
        // 传入参数,要写入文件的路径;传入参数true表示追加数据
        FileWriter writer = new FileWriter(dir,true);
        writer.write(23567);
        writer.write(28404);
        writer.write(35838);
        writer.write(22530);
        writer.write("23567");
        writer.flush();
        writer.close();
    }
    
    public static void test1() throws IOException {
        String dir = "C:\\Users\\79466\\Desktop\\test\\2.txt";
        Writer writer = new FileWriter(dir);
        writer.write(23567);
        writer.write(28404);
        writer.write(35838);
        writer.write(22530);
        writer.write("23567");
        writer.flush();
        writer.close();
    }
    
}
  • BufferedReader
当BufferedReader在读取⽂本⽂件时,会先尽量从⽂件中读⼊字符数据并放满缓冲区,⽽之后若使⽤read()⽅法,会先从缓冲区中进⾏读取。如果缓冲区数据不⾜,才会再从⽂件中读取

# 构造函数
// 创建⼀个使⽤指定⼤⼩输⼊缓冲区的缓冲字符输⼊流
BufferedReader(Reader in)
// 创建⼀个使⽤指定⼤⼩输⼊缓冲区的缓冲字符输⼊流,指定大小
BufferedReader(Reader in, int sz)
  • BufferedReader常用api
boolean ready()
    判断此流是否已准备好被读取,依赖其他流,所以⼀般需要做判断
int read()
    读取单个字符
int read(char[] cbuf, int off, int len) 
    读取⼀部分字符到数组⾥⾯,从数组下标off处放置length⻓度的字符
String readLine()
    读取⼀整⾏⽂本⾏,返回⼀整⾏字符串,如果读到⾏尾了就返回null,注意返回的⼀⾏字符中不包含换⾏符
void close() 
    关闭流释放资源
  • 代码案例
public class BufferReaderTest {

    public static void  main(String [] args) throws Exception {
        test1("C:\\Users\\79466\\Desktop\\test\\1.txt");
        test2("C:\\Users\\79466\\Desktop\\test\\1.txt");
    }

    public static void test1(String path) throws Exception {
        // 传入参数,要读取的文件路径
        BufferedReader reader = new BufferedReader(new FileReader(path));
        if(!reader.ready()){
            System.out.println("文件流暂时无法读取");
            return;
        }
        int size;
        char[] cbuf = new char[1024];
        // 将数据读取到数组中,读到cbuf数组,从0开始读
        while ( (size = reader.read(cbuf,0,cbuf.length)) != -1){
            System.out.println(new String(cbuf,0,size));
        }
        reader.close();
    }

    public static void test2(String path) throws Exception {
        // 传入参数,要读取的文件路径
        BufferedReader reader = new BufferedReader(new FileReader(path));
        if(!reader.ready()){
            System.out.println("文件流暂时无法读取");
            return;
        }
        String str = "";
        // 读取1行
        while ( (str = reader.readLine()) !=null){
            System.out.println(str);
        }
        reader.close();
    }

}
  • BufferedWriter
写⼊的数据并不会先输出到⽬的地,⽽是先存储⾄缓冲区中。如果缓冲区中的数据满了,才会⼀次对⽬的地进⾏写出

# 构造函数
BufferedWriter(Writer out) 
BufferedWriter(Writer out, int sz)

# 常用api
void write(int c)
    写⼊⼀个字符
void write(char[] cbuf, int off, int len)
    写⼊字符数组的⼀部分,通过off和len控制。
void write(String s, int off, int len) 
    写⼊字符数组的⼀部分,通过off和len控制。
void newLine() 
    写如⼀个换⾏符合
void close() 
    关闭输⼊流并释放与该流关联的系统资源
void flush()
    write是写到缓冲区中,可以认为是内存中,当缓冲区满时系统会⾃动将缓冲区的内容写⼊⽂件,但是⼀般还有⼀部分有可能会留在内存这个缓冲区中, 所以需要调⽤flush空缓冲区数据
  • 代码案例
public class BufferedWriterTest {

    public static void main(String [] args)throws Exception{
        test1("C:\\Users\\79466\\Desktop\\test\\8.txt");
    }

    public static void  test1(String path)throws Exception{
        // 传入参数要写入的文件路径
        BufferedWriter writer = new BufferedWriter(new FileWriter(path));
        //写入一个字符
        char ch = '小';
        writer.write(ch);
        //写入一个字符数组
        String other = "aaaaxdclass.net";
        writer.write(other.toCharArray(),0,other.length());
        // 写入换行符
        writer.newLine();
        writer.close();
    }
    
}
  • InputStreamReader(继承Reader)
# 将字节流转换为字符流, 字节流通向字符流的桥梁,如果不指定字符集编码,则解码过程将使⽤平台默认的字符编码,如:UTF-8
# ⽂本⽂件存储是A编码,然后如果以B编码进⾏读取则会乱码

# 构造函数
//使⽤系统默认编码集
public InputStreamReader(InputStream in)
//指定指定编码集创建对象
public InputStreamReader(InputStream in, String charsetName)

# api
int read()
    读取单个字符
int read(char[] cbuf, int off, int len) 
    读取⼀部分字符到数组⾥⾯,从数组下标off处放置length⻓度的字符
int read(char []cbuf)
    将读取到的字符存到数组中,返回读取的字符数
void close() 
    关闭流释放资源
  • 代码案例
public class InputStreamReaderTest {
    
    public static void main(String [] args)throws  Exception{
        test1("C:\\Users\\79466\\Desktop\\test\\8.txt");
    }

    public static void test1(String path) throws Exception{
        //读取字节流
        InputStream in = new FileInputStream(path);
        // 将字节流转换为字符六
        InputStreamReader isr = new InputStreamReader(in);
        // 传入字符流
        BufferedReader reader = new BufferedReader(isr);
        String line;
        // 读取1行
        while ((line = reader.readLine())!= null){
            System.out.println(line);
        }
        isr.close();
        reader.close();
    }

}
  • OutputStreamWriter(继承writer)
# 将字符流转换为字节流(看源码解释), 字符流通向字节流的桥梁,如果不指定字符集编码,则编码过程将使⽤平台默认的字符编码,如:GBK

# 构造函数
//使⽤系统默认编码集
public OutputStreamWriter(OutputStream out)
//指定指定编码集创建对象
public OutputStreamWriter(OutputStream out, String charsetName)

# api
void write(int c)
    写⼊⼀个字符
void write(char[] cbuf, int off, int len)
    写⼊字符数组的⼀部分,通过off和len控制
void write(String s, int off, int len) 
    写⼊字符数组的⼀部分,通过off和len控制
void newLine() 
    写如⼀个换⾏符合
void close() 
    关闭输⼊流并释放与该流关联的系统资源
void flush()
    write是写到缓冲区中,可以认为是内存中,当缓冲区满时系统会⾃动将缓冲区的内容写⼊⽂件,但是⼀般还有⼀部分有可能会留在内存这个缓冲区中, 所以需要调⽤flush空缓冲区数据
  • 代码案例
public class OutputStreamWriterTest {

    public static void main(String [] args)throws  Exception{
        test1("C:\\Users\\79466\\Desktop\\test\\9.txt");
    }

    public static  void test1(String path)throws Exception{
        OutputStream out = new FileOutputStream(path);
        // 将字符流转换为字节流,并指定编码
        OutputStreamWriter osr = new OutputStreamWriter(out,"GBK");
        BufferedWriter bufw = new BufferedWriter(osr);
        String str = "欢迎来到课堂xdclass.net";
        bufw.write(str);
        bufw.newLine();
        bufw.write("学习java课程");
        bufw.flush();
        bufw.close();
    }

}
  • io流内部异常处理
public class TryCatchTest {

    // 方式1
    public static void main(String [] args){
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            FileInputStream fis = new FileInputStream("C:\\Users\\79466\\Desktop\\test\\1.txt");
            bis = new BufferedInputStream(fis);
            FileOutputStream fos = new FileOutputStream("C:\\Users\\79466\\Desktop\\test\\1111.txt");
            bos = new BufferedOutputStream(fos);
            int size;
            byte [] buf =new byte[1024];
            while ((size = bis.read(buf))!= -1){
                bos.write(buf,0,size);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(bis != null){
                try {
                    bis.close();
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    if(bos!=null){
                        try{
                            bos.close();
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                }
            }
        }

    }

    // 方式二
    public static void test1(){
        try( FileInputStream fis = new FileInputStream("C:\\Users\\79466\\Desktop\\test\\1.txt");
             BufferedInputStream bis = new BufferedInputStream(fis);
             FileOutputStream fos = new FileOutputStream("C:\\Users\\79466\\Desktop\\test\\1111.txt");
             BufferedOutputStream bos = new BufferedOutputStream(fos);
        ){
            int size;
            byte [] buf =new byte[1024];
            while ((size = bis.read(buf))!= -1){
                bos.write(buf,0,size);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }

}
posted @ 2022-05-05 15:49  DogLeftover  阅读(22)  评论(0编辑  收藏  举报