• java IO字符流教程


    什么是字符流?

    流体系流体系

    字符流=字节流+编码表

    字符其实只是一种特殊的二进制字节,是按照一定的编码方式处理之后,按照一定规则来存储信息的数据,字符在计算机中也是由二进制组成的,只不过这种二进制可以按照一种规则解码后,成为人类可以直接阅读的自然语言,而普通的二进制文件只有计算机能直接“阅读”。字节操作和字符操作的区别就在于数据的格式。在使用场景上,字符流无法直接获取文本信息的二进制文件,比如图片,mp3,视频文件等,只能使用字节流。而对于文本信息,则更适合使用字符流。

    Reader与Writer

    Reader接口详解

    Java Reader是用于读取字符流的抽象类。子类必须实现的唯一方法是read(char [],int,int)和close()。但是,大多数子类将覆盖某些方法以提供更高的效率和、附加功能。

    • Reader类详解

    1. 字段
    字段类型字段说明
    protected Object lock 对象用于读取流时候进行加锁操作
    1. 构造方法

    2. 方法

    方法说明
    abstract void close() 它关闭流并释放与之相关的任何系统资源。
    void mark(int readAheadLimit) 它标记流中的当前位置。
    boolean markSupported() 它告诉此流是否支持mark()操作。
    int read() 读取单个字符。
    int read(char[] cbuf) 读入数组。
    int read(CharBuffer target) 它尝试将字符读入指定的字符缓冲区。
    boolean ready() 它告诉这个流是否准备好被读取。
    void reset() 重置流。
    long skip(long n) 它跳过字符。
    • Writer类详解

    它是用于写入字符流的抽象类。子类必须实现的方法有write(char[]、int、int)、flush()和close()。大多数子类将重写这里定义的一些方法以提供更高的效率和、附加功能。

    方法说明
    abstract void close() 它关闭流并释放与之相关的任何系统资源。
    void mark(int readAheadLimit) 它标记流中的当前位置。
    boolean markSupported() 它告诉此流是否支持mark()操作。
    int read() 读取单个字符。
    int read(char[] cbuf) 读入数组。
    int read(CharBuffer target) 它尝试将字符读入指定的字符缓冲区。
    boolean ready() 它告诉这个流是否准备好被读取。
    void reset() 重置流。
    long skip(long n) 它跳过字符。
    • 字节流跟字符流区别

    字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列.

    • 1.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;

    • 2.字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

    • 类的设计思考

    java的类设计采用了大量的设计模式,流Api也不例外,对于字符流采用适配器类InputStreamReader去操作底层字节流,在InputStreamReader类中构建StreamDecoder去操作字节流。而对于缓冲区流(后面文章会讲)则采用装饰者模式去增强类的行为,感兴趣的同学去阅读下源码!

    实战演练(文件字符流)

    • 写入字符串到文件中
    import java.io.FileWriter;  
    public class FileWriterExample {  
        public static void main(String args[]){    
             try{    
               FileWriter fw=new FileWriter("D:\testout.txt");    
               fw.write("Welcome to javaTpoint.");    
               fw.close();    
              }catch(Exception e){System.out.println(e);}    
              System.out.println("Success...");    
         }    
    }  
    • 读取文件中的字符串
    import java.io.*;  
    public class ReaderExample {  
        public static void main(String[] args) {  
            try {  
                Reader reader = new FileReader("D:\testout.txt");  
                int data = reader.read();  
                while (data != -1) {  
                    System.out.print((char) data);  
                    data = reader.read();  
                }  
                reader.close();  
            } catch (Exception ex) {  
                System.out.println(ex.getMessage());  
            }  
        }  

    识别下方二维码!回复: 入群 ,扫码加入我们交流群!

    点赞是认可,在看是支持点赞是认可,在看是支持

    欢迎关注我的公众号!里面可以加入微信技术交流群!
  • 相关阅读:
    css去掉iPhone、iPad默认按钮样式
    STL~Deque简介
    Centos 7 ssh登录速度慢
    C++ delete 两次
    编译gdb 报错 No module named gdb.frames
    gdb 脚本
    转载: CentOS/Linux 解决 SSH 连接慢
    百度经验:Win10查看已存储WiFi密码的两种方法
    git 操作
    Avoiding memory leaks in POSIX thread programming, 多线程避免内存泄漏
  • 原文地址:https://www.cnblogs.com/1ssqq1lxr/p/14810153.html
Copyright © 2020-2023  润新知