字符流、缓存流、转换流、打印流、数据流

字符流:

Reader:

Java中用于字符输入的抽象类,是字符输入流的基类。

FileReader:

用来将文件中的字符数据读取到程序中来。

注:FileReader默认只能读取UTF-8编码格式的文件,如果用它读取GBK格式的文件可能存在乱码,因为FileReader遇到汉字默认按3个字节来读取,而GBK一个汉字占2个字节,所以会乱码

构造方法
FileReader(File file) :创建一个新的FileReader,给定File来读取,使用平台的 默认字符集。
FileReader(File file, Charset charset) : 创建一个新的FileReader,给定File要读取的和字符集。
FileReader(String fileName) : 使用平台的默认字符集创建一个新的FileReader,并指定要读取的文件的
名称 。
FileReader(String fileName, Charset charset) : FileReader给定要读取的文件名和字符集,创建一个
新文件。
常用方法:
FileReader读取文件的步骤如下:
1. 创建 FileReader 对象与要读取的源⽂件接通
2.调⽤ read() ⽅法读取⽂件中的字符
3. 调⽤ close() ⽅法关闭流
File file=new File("E:/t.txt");
       int readlen=0;
       char[] chars=new char[9];
       try{
           FileReader fileReader=new FileReader(file);
           while((readlen=fileReader.read(chars))!=-1){
               System.out.println(new String(chars,0,readlen));
           }
       }catch (IOException e){
            e.printStackTrace();
       }

Wirter:

Java 中用于将字符数据写入文件的字符输出流类。

FileWirter:

构造方法:
FileWriter(File file) : 使用给定的要写入的内容File和平台的默认字符集构造FileWriter对象
FileWriter(File file, boolean append) : 使用给定的要写入的内容File和平台的默认字符集构造
FileWriter对象,append表示是否追加数据。
FileWriter(File file, Charset charset) : 使用给定的File和 charset构造FileWriter。
FileWriter(File file, Charset charset, boolean append) : 使 用 给 定 的 File 和 charset 构 造
FileWriter,append表示是否追加数据。
FileWriter(String fileName) : 将给定的文件名使用平台的默认字符集构造FileWriter对象
FileWriter(String fileName, boolean append) : 将给定的文件名使用平台的默认charset 构 造
FileWriter,append是否附加追加数据 。
FileWriter(String fileName, Charset charset) : 构造FileWriter给定的文件名和字符集。
FileWriter(String fileName, Charset charset, boolean append) : 构造FileWriter使用给定的文件名、字符集和append是否追加数据。
常用方法
FileWriter往文件中写字符数据的步骤如下:
1.创建 FileWirter 对象与要读取的⽬标⽂件接通
2.调⽤ write(字符数据/字符数组/字符串) ⽅法读取⽂件中的字符
3.调⽤ close() ⽅法关闭流

注:FileWirter写完数据后必须刷新或者关闭,写出去的数据才能生效

这涉及到文件输出流的缓存机制和资源管理。文件输出流通常会使用内部缓存区来暂时存储要写入文件的数据,而不是每次写入都立即将数据写入文件。这是为了提高性能,因为频繁的磁盘写入操作通常比较慢。以 下是为什么需要刷新或关闭流的原因:
1.性能优化:通过使⽤缓存区,多个写操作可以⼀次性写⼊⽂件,减少了磁盘操作的次数,提⾼了写⼊性能。
2.数据完整性:将数据存储在缓存区中意味着在调⽤ write ⽅法后,数据实际上还没有写⼊⽂件。如果在数据完全写⼊之前发⽣了程序崩溃或其他异常情况,可能会导致数据丢失或⽂件损坏。
3.资源管理:打开的⽂件输出流会占⽤系统资源。如果不及时关闭流,可能会导致资源泄漏。关闭流会释放相关资源,确保它们可⽤于其他操作。
File file=new File("E:/t.txt");
        FileWriter fileWriter=null;
        try{
            fileWriter=new FileWriter(file);
            fileWriter.write('c');
            fileWriter.write("风雨之后,就是彩虹"); //默认是覆盖
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            fileWriter.close();//要flush或close才能写进去
        }

缓存流:

BufferReader、BufferWirter

为了提高流的读写效率,Java提供了缓存流,输入输出流被缓存流包装后,能极大的提高流的读写效率。能提高效率的原因:是因为在缓存流的底层自己封装了一个长度为8KB(8129byte)的字节数组,但是缓存流不能单独使用,它需要依赖于原始流。 读数据时:它先⽤原始字节输⼊流⼀次性读取8KB的数据存⼊缓存流内部的数组中(先⼀次多囤点货),再从8KB的字节数组中读取⼀个字节或者多个字节(消耗屯的货)。 写数据时: 它是先把数据写到缓存流内部的8BK的数组中(先装⼀⻋货),等数组存满了,再通过原始的字节输出流,⼀次性写到⽬标⽂件中去(把囤好的货,⼀次性运⾛)。

1. 字节输⼊缓存流的类是BufferedInputStream,它是InputStream的⼦类。
2. 字节输出缓存流的类是BufferedOutputStream,它是OutputStream的⼦类。
3. 字符缓存输⼊流的类是BufferedReader,它的⽗类是Reader类。
BufferReader一个特有的方法,一次可以读取文件中一行:String readline()
4. 字符缓存输出流的类是BufferedWriter,它的⽗类是Writer类。
void newLine():换行
String filepath="E:/t.txt";
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filepath));
        String line;
//        line=bufferedReader.readLine();//当返回空时,代表读取完毕
        while((line=bufferedReader.readLine())!=null){
            System.out.println(line);
        }
        bufferedReader.close();//因为底层会自动关闭节点流,也就是FileReader
 String filepath="E:/b.txt";
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filepath));
        bufferedWriter.write("hello");
        bufferedWriter.newLine();//插入换行
        bufferedWriter.write("world");
        bufferedWriter.close();

 文件的拷贝:

String filepath="E:/b.txt";
        String copyfilepath="E:/bb.txt";
        BufferedReader br=null;
        BufferedWriter bw=null;
        String line;
        try{
            br=new BufferedReader(new FileReader(filepath));
            bw=new BufferedWriter(new FileWriter(copyfilepath));
            while((line= br.readLine())!=null){
                bw.write(line);
                bw.newLine();
            }
            System.out.println("拷贝完毕");
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            if(br!=null){
                br.close();
            }
            if(bw!=null){
                bw.close();
            }
        }

转换流:

前面提到FileReader读取文件,但因为它默认只能读取UTF-8编码格式的文件,使用它读取GBK格式的文件会出现乱码。

Java给我们提供了另外两种流:InputStreamReader、OutputStreamWriter,这两个流叫做转换流,它们可以将字节流转为字符流,并且可以指定编码方案。

InputStreamReader:

InputStream表示字节输入流,Reader表示字符输入流;合在一起表示可以把InputStream转换为Reader,最终InputStreamReader其实也是Reader的子类,也算是字符输入流。

InputStreamReader不能单独使用,它内部需要封装一个InputStream的子类对象,再指定一个编码表,如果不指定默认按照UTF-8形式进行转换。

构造方法
InputStreamReader(InputStream in) : 创建一个使用默认编码集的InputStreamReader
InputStreamReader(InputStream in, String charsetName) : 创建一个使用指定字符集的InputStreamReader。
InputStreamReader(InputStream in, Charset cs) : 创建一个使用给定字符集的InputStreamReader。
常用方法:
String getEncoding() : 返回该流所使用的字符编码的名称。

OutputStreamWriter:

前面是OutputStream表示字节输出流,后面是Writer表示字符输出流,合在一起表示可以把OutputStream转换为Writer,OutputStreamWriter是Writer的子类,所以也算字符输出流。

OutputStreamReader也是不能单独使用的,它内部需要封装一个OutputStream的子类对象,再指定一个编码表,如果不指定编码表,默认会按照UTF-8形式进行转换。
构造方法
OutputStreamWriter(OutputStream out) : 创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName) : 创 建 一 个 使 用 指 定 字 符 集的OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs) : 创建使用给定字符集的 OutputStreamWriter。
常用方法
String getEncoding() : 返回该流所使用的字符编码的名称。

打印流:

 更方便高效的写数据。有两个:字节打印流PrintStream、字符打印流PrintWriter

重定向输出语句:

try (PrintStream printStream = new PrintStream(new File("io\\print.txt"));) {
    printStream.printf("余票还有%d", 12);
    System.setOut(printStream);
    System.out.print("今天天气不错"); // 直接打印到文件当中
    System.out.println();
    System.out.printf("余票还有%d", 12);
    System.out.println();
    System.out.print("123");
} catch (IOException e) {
    System.out.println(e.getMessage());
}

数据流:

DataOutputStream:

DataOutputStream类,它也是一种包装流,创建DataOutputStream对象时,底层需要依赖于一个原始的OutputStream流对象。然后调用它的wirteXxx方法,写的是特定类型的数据。

public DataOutputStream(OutputStream out) : 创建数据输出流包装基本的字节输出流
常用方法:
public final void writeByte(int v) throws IOException : 将byte类型的数据写入基础的字节输出流
public final void writeInt(int v) throws IOException : 将int类型的数据写入基础的字节输出流
public final void writeDouble(Double v) throws IOExceptio :将double类型的数据写入基础的字节输出流
public final void writeUTF(String str) throws IOException :将字符串数据以UTF-8编码成字节写入基础的字节输出流
public void write(byte[] bytes) :支持写字节数据出去

DataInputStream:

DataIntputStream类,它也是一种包装流,创建DataInputStream对象时,底层需要依赖于一个原始的InputStream流对象。然后调用它的readXxx()方法就可以读取特定类型的数据。

public DataInputStream(Inputstream is) : 创建新数据输出流包装基础的字节输出流
public final void writeByte(int v) throws IOException : 将byte类型的数据写入基础的字节输出流
public final void writeInt(int v) throws IOException :将int类型的数据写入基础的字节输出流
public final void writeDouble(Double v) throws IOException :将double类型的数据写入基础的字节输出流
public final void writeUTF(String str) throws IOException :将字符串数据以UTF-8编码成字节写入基础的字节输出流
public void write(byte[] bytes) : 支持写字节数据出去
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值