IO流相关知识点(字符流)

字节流和字符流的区别:

1.两者的组成不同:(这也直接影响我们后面读取数据时的方式不同)读数据方法https://blog.csdn.net/m0_64231944/article/details/124020398?spm=1001.2014.3001.5501
                字节流的组成:字节流是由字节组成的。
                字符流的组成:字符流是由字符组成的。
2.计算机对两者的处理方式不同:
                字节流:主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本。
                字符流:按虚拟机的encode来处理,也就是要进行字符集的转化。

注:Java里字符由两个字节组成. 1字符=2字节


实际上 我们可以理解为字符流=字节流+编码表,为什么可以这样理解呢,因为字节流读数据是默认采用了ASCII编码,而ASCll编码是主要针对一个字节代表一个字符的数据,而我们中文汉字是一个字符=两个字节,如果采用了ASCll编码读取汉字就会出现乱码,在字节流中我们没有办法改变采用其他编码种类,而字符流可以,它采用好似UTF编码,是支持中文的,我们还可以在字符流对象中设置采用别的编码种类,字符流就是在字节流的基础上增加了可以选择其他编码种类的功能。

字节流代码展示:

        字符流主要构造方法:

/*
字符流主要构造方法:
public OutputStreamWriter(OutputStream out);//默认采用UTF-8编码
public OutputStreamWriter(OutputStream out , String charsetName);//需要自己设置编码种类String charsetName

public InputStreamReader(InputStream in);//默认采用UTF-8编码
public InputStreamReader(InputStream in , String charsetName);//需要自己设置编码种类String charsetName
 */

 字符流代码演示,及其主要方法:

package io;

import javax.imageio.IIOException;
import java.io.*;

/*
IO流,字符流知识点总结:
 */
public class IoDemo01 {
    public static void main(String[] args) throws IOException {
/*
字符流主要构造方法:
public OutputStreamWriter(OutputStream out);//默认采用UTF-8编码
public OutputStreamWriter(OutputStream out , String charsetName);//需要自己设置编码种类String charsetName

public InputStreamReader(InputStream in);//默认采用UTF-8编码
public InputStreamReader(InputStream in , String charsetName);//需要自己设置编码种类String charsetName
 */

//创建字符输出流对象
//      OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\mycode\\word.txt"));
//      BufferedWriter osw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\mycode\\word.txt"));
        BufferedWriter osw = new BufferedWriter(new FileWriter("D:\\mycode\\word.txt"));

//字符流写数据的五种方法
/*
    void write(int c);写一个字符
    void write(char[] chs);写一个字符数组
    void write(char[] chs,int off,int len);写入字符数组的一部分
    void write(String str);写一个字符串
    void write(String str,int off,int len);写一个字符串的一部分
 */
        osw.write(6);
        osw.write("以梦为马,不负韶华");

        osw.flush();//刷新流
        osw.close();

//创建字符输入流对象
//      InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\mycode\\word1.txt"));
//      BufferedReader isr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\mycode\\word1.txt")));
        BufferedReader isr = new BufferedReader(new FileReader("D:\\mycode\\word1.txt"));

//字符流读数据(一次读一个字符数组)
        char[] chs = new char[2048];

        int len = -1;
        while ((len = isr.read(chs)) != -1) {
            System.out.println(new String(chs, 0, len));
        }
//字符流读数据(一次读一个字符)
        int by;
        while ((by = isr.read()) != -1) {
//          System.out.println((char)by);//因为用的是println,所以输出一个字符进行换行操作一次
            System.out.print((char) by);//用的是print,输出的结果在一行
        }
        isr.close();


    }
}

fiush()方法知识详情
         flush() 方法是清空,即清空缓冲区数据,就是说,你用读写流的时候,其实数据是先被读到了内存中,  然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了, 因为还有一部分有可能留在内存这个缓冲区中.这时候如果你调用了, close方法关闭了读写流,那么这部分数据就会丢失,
        所以应该再关闭读写流之前先flush(),首先得清空缓冲区的数据.
        刷新就是将内存(缓冲区)中的数据(是一个字节数组)强制写到磁盘/浏览器/控制台/文件

 如图:

            从键盘输入的数据不会直接到磁盘,而是先被存到了缓冲区里,如果直接使用close()方法,会直接从红色箭头处截断,那么缓冲区里面的数据就会丢失,而flush()方法,会先将缓冲区里面的数据刷新到磁盘。所以关闭流之前需要先调用flush()方法。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值