字符流FileReader和FileWriter

1 字节流读取字符的问题

上述读取文件中有中文,导致乱码了。

2 字符输入流【Reader】

java.io.Reader字符流的抽象基类,用实现类FileReader类操作。

public void close() :关闭此流并释放与此流相关联的任何系统资源。    
public int read(): 从输入流读取一个字符。 
public int read(char[] buf): 从输入流中读取一些字符,并将它们存储到字符数组 buf中 。如果读取完成返回-1

默认字符编码:默认UTF-8,底层实际还是字节流。
FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。   
FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的路径。 

package FileRead;

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

public class Demo02 {
    public static void main(String[] args) throws IOException {

        FileReader reader = new FileReader("day07/file.txt");
        int read1 = reader.read();
        int read2 = reader.read();
        int read3 = reader.read();
        int read4 = reader.read();
        int read5 = reader.read();
        int read6 = reader.read();

        System.out.println("read1 = " + (char)read1);//a
        System.out.println("read2 = " + (char)read2);//b
        System.out.println("read3 = " + (char)read3);//c
        System.out.println("read4 = " + (char)read4);//狗
        System.out.println("read5 = " + (char)read5);//子
        System.out.println("read6 = " + (char)read6);//

        reader.close();


    }
}

解决上述问题。

public int read(): 从输入流读取一个字符

package FileRead;

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

public class Demo02 {
    public static void main(String[] args) throws IOException {

        FileReader reader = new FileReader("day07/file.txt");
//        int read1 = reader.read();
//        int read2 = reader.read();
//        int read3 = reader.read();
//        int read4 = reader.read();
//        int read5 = reader.read();
//        int read6 = reader.read();
//
//        System.out.println("read1 = " + (char)read1);//a
//        System.out.println("read2 = " + (char)read2);//b
//        System.out.println("read3 = " + (char)read3);//c
//        System.out.println("read4 = " + (char)read4);//狗
//        System.out.println("read5 = " + (char)read5);//子
//        System.out.println("read6 = " + (char)read6);//

        int len;
        while ((len=reader.read())!=-1){
            System.out.println(len+"=" + (char)len);

        }


        reader.close();


    }
}

public int read(char[] buf): 从输入流中读取一些字符,并将它们存储到字符数组 buf中 。

如果读取完成返回-1

package FileRead;

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

public class Demo02 {
    public static void main(String[] args) throws IOException {

        FileReader reader = new FileReader("day07/file.txt");
//        int read1 = reader.read();
//        int read2 = reader.read();
//        int read3 = reader.read();
//        int read4 = reader.read();
//        int read5 = reader.read();
//        int read6 = reader.read();
//
//        System.out.println("read1 = " + (char)read1);//a
//        System.out.println("read2 = " + (char)read2);//b
//        System.out.println("read3 = " + (char)read3);//c
//        System.out.println("read4 = " + (char)read4);//狗
//        System.out.println("read5 = " + (char)read5);//子
//        System.out.println("read6 = " + (char)read6);//

        int len;
        //增加char数组
        char[] buf = new char[1];
        while ((len=reader.read(buf))!=-1){
        //String(char[] value, int offset, int count) 将字符数组value中,从offset位置开始的count个字符变成字符串
            String s = new String(buf, 0, len);
            System.out.print(s);

        }


        reader.close();


    }
}

3 字符输出流【Writer】

java.io.Writer是一个字符输出的抽象类,是所有字符输出流的基类。

FileWriter类来操作

构造方法:

FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。   
FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。

注:当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream,如果关联的文件不存在,就会自动创建。如果存在这个文件中的数据就会被清空。

package FileWriter;

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

public class Demo01 {
    public static void main(String[] args) throws IOException {
        FileWriter fileWriter = new FileWriter("day07/fileOut.txt");
        fileWriter.write("狗子你好!");

        fileWriter.close();


    }
}

public void write(int c) :写出一个字符。
public void write(char[] cbuf):将 b.length字符从指定的字符数组写出此输出流。  
public abstract void write(char[] b, int off, int len) :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。  
public void write(String str) :写出一个字符串。
public void write(String str,int off, int len) :写出一个字符串中指定位置off开始的len个字符

package FileWriter;

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

public class Demo02 {
    public static void main(String[] args) throws IOException {
        FileWriter fileWriter = new FileWriter("day07/fileOut.txt");
        String s = System.lineSeparator();//换行
        //写出单个字符
        //public void write(int c):写一个字符
        fileWriter.write(97);
        fileWriter.write(s);

        char[] chars ={'a','狗','子','你','h'};
        //写出字符数组
        //public void write(char[] chars):写出字符数组中所有内容
        fileWriter.write(chars);
        //public void write(char[] chars,int off,int len):写出字符数组中从off位置开始的len个字符
        fileWriter.write(s);
        fileWriter.write(chars,1,2);
        fileWriter.write(s);
        //字符串
        //public void write(String str):写出字符串
        fileWriter.write("哈喽");
        fileWriter.write(s);
        //public void write(String str,int off,int len):写出字符串中从off位置开始的len个字符
        String str="狗子粉丝破万!";
       fileWriter.write(str, 2,4);
//        fileWriter.write("狗子你好!");
        fileWriter.close();
    }
}

续写换行

public FileWriter(String path,booean append)
public FileWriter(File file,booean append)

package FileWriter;

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

public class Demo03 {
    public static void main(String[] args) throws IOException {
        FileWriter fileWriter = new FileWriter("day07/fileOut.txt",true);
        String s = System.lineSeparator();//换行
        fileWriter.write(s);
        fileWriter.write("换行成功");
        fileWriter.write("续写...");

        fileWriter.close();

    }
}

public abstract void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public abstract void flush() :刷新此输出流并强制任何缓冲的输出字符被写出。  

这个两个函数,一个是关流,一个是再不关流的时候刷缓冲(char数组)释放数组中的资源写入指定文件中。

通过下述代码可以测试出缓冲的数组的最大值为8k

package FileWriter;

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

public class Demo04 {
    public static void main(String[] args) throws IOException {
        FileWriter fileWriter = new FileWriter("day07/fileOutMax.txt");

        for (int i = 0; i < 1024 * 9; i++) {
            fileWriter.write("a");
        }


    }
}

从测试中得知char的缓冲区间为8192即为8k,大于这个区间后会自动写出。

上述两个类和之前文章字节输入输出流用法类似,不再做过多分析,如对你有帮助请您点赞收藏,谢谢!!!!

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值