zoukankan      html  css  js  c++  java
  • 字符流

    字符流

    当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

    3.1 字符输入流【Reader】

    java.io.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

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

    3.2 FileReader类

    java.io.FileReader extends InputStreamReader extends Reader

    FileRead:文件字符输入流

    作用:把硬盘文件中的数据以字符的方式读取到内存中

    java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

    小贴士:

    1. 字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。

    idea中UTF-8

    1. 字节缓冲区:一个字节数组,用来临时存储字节数据。

    构造方法

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

    参数:读取文件的数据源

    • String fileName:文件路径
    • File file:一个文件

    FlieReader构造方法的作用:

    1. 会创建一个FileReader对象
    2. 会把FileReader对象指向要读取的文件

    当你创建一个流对象时,必须传入一个文件路径。类似于FileInputStream 。

    字符输入流的使用步骤:
    1.创建FileReader对象,构造方法中绑定要读取的数据源
    2.使用FileReader对象中的方法read读取文件
    3.释放资源

    String类的构造方法:
    String(char[] value) 把字符数组转换为字符串
    String(char[] value,int offset,int count) 把字符数组的一部分转换为字符串

    示例代码:

    public static void main(String[] args){
        // 1.创建FileReader对象,构造方法中绑定要读取的数据源
        FileReader fr = new FileReader("D:\Test\1.txt");
        // 2.使用FileReader对象中的方法read读取文件
        // fr.read();读取单个字符并返回
        int len = 0;
        while((len = fr.read())!=-1){
           System.out.print((char) len); 
        }
    
        
        // 或者String(char[] value,int offset,int count) 把字符数组的一部分转换为字符串
        char[] c = new char[1024];
        int l = 0;
        while((l = fr.read())!=-1){
            System.out.print(new String(c,0,l));
        }
        fr.close();
    }
    

    3.4 FileWriter类

    FileWriter:文件字符输出流

    作用:把内存中的字符数据写入到文件中

    java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

    构造方法

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

    构造方法的作用:

    1. 会创建一个FileWriter对象
    2. 会根据构造方法中传递的文件/文件路径,创建文件
    3. 会把FileWriter对象指向创建好的文件

    字符输出流的使用步骤(重点):

    1. 创建FileWriter对象,构造方法中绑定要写入数据的目的地
    2. 使用FileWriter对象中的方法write,把数据写入到内存缓冲区(字符转换为字节的过程)
    3. 使用FileWriter对象中的方法flush,把内存中缓冲区中的数据,刷新到文件中
    4. 释放资源(会先把内存缓冲区中的数据刷新到文件中)

    当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream。

    public static void main(String[] args) throws IOException {
            //  1. 创建FileWriter对象,构造方法中绑定要写入数据的目的地
            FileWriter fw  = new FileWriter("D:\Test\b.txt");
            //  2. 使用FileWriter对象中的方法write,把数据写入到内存缓冲区(字符转换为字节的过程)
            fw.write(99);
            //  3. 使用FileWriter对象中的方法flush,把内存中缓冲区中的数据,刷新到文件中
            fw.flush();
            //  4. 释放资源(会先把内存缓冲区中的数据刷新到文件中)
            fw.close();
        }
    

    小贴士:

    1. 虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。
    2. 未调用close方法,数据只是保存到了缓冲区,并未写出到文件中。

    关闭和刷新

    因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush 方法了。

    • flush :刷新缓冲区,流对象可以继续使用。
    • close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

    代码使用演示:

    public class FWWrite {
        public static void main(String[] args) throws IOException {
            // 使用文件名称创建流对象
            FileWriter fw = new FileWriter("fw.txt");
            // 写出数据,通过flush
            fw.write('刷'); // 写出第1个字符
            fw.flush();
            fw.write('新'); // 继续写出第2个字符,写出成功
            fw.flush();
          
          	// 写出数据,通过close
            fw.write('关'); // 写出第1个字符
            fw.close();
            fw.write('闭'); // 继续写出第2个字符,【报错】java.io.IOException: Stream closed
            fw.close();
        }
    }
    

    小贴士:即便是flush方法写出了数据,操作的最后还是要调用close方法,释放系统资源。

    写出其他数据

    字符输出流写数据的其他方法:

    • void write(char[] cbuf) 写入字符数组

    • abstract void write(char[] cbuf,int off,int len) 写入字符数组的某一部分,off数组的开始索引,len写字符的个数

    • void wirte(String str) 写入字符串

    • void write(String str,int off,int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符串的个数

    public static void main(String[] args) throws IOException {
            FileWriter fw = new FileWriter("D:\Test\c.txt");
            char[] cs = {'a','b','c','d'};
            // void write(char[] cbuf) 写入字符数组
            fw.write(cs);
            // - abstract void write(char[] cbuf,int off,int len) 写入字符数组的某一部分,off数组的开始索引,len写字符的个数
            fw.write(cs,1,2);
    
            // - void write(String str) 写入字符串
            fw.write("耍酷");
            // - void write(String str,int off,int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符串的个数
            fw.write("飞檐走壁",2,2);
    
            fw.close();
    
        }
    // 运行后  硬盘中的文件内容
    abcdbc耍酷走壁
    

    小贴士:字符流,只能操作文本文件,不能操作图片,视频等非文本文件。

    当我们单纯读或者写文本文件时 使用字符流 其他情况使用字节流

    字符输出流的续写和换行写

    续写和换行

    续写,追加写:使用两个参数的构造方法

    • FileWriter(String filenName,boolean append)

    • FileWriter(File file,boolean appead)

    • 参数:

      • String filenName,File file:写入数据的目的地
      • boolean append:续写开关
        • true:不会创建新的文件覆盖原文件,可以续写
        • false:创建新的文件覆盖源文件
    public static void main(String[] args) throws IOException {
            FileWriter fw = new FileWriter("D:\Test\d.txt",true);
            for (int i = 1; i < 10; i++) {
                fw.write("helloWorld"+i+"
    ");
            }
            fw.close();
        }
    

  • 相关阅读:
    changing a pointer rather than erasing memory cells
    验证码识别 edge enhancement 轮廓增强 region finding 区域查找
    Manipulating Data Structures
    passing parameters by value is inefficient when the parameters represent large blocks of data
    Aliasing 走样
    Artificial Intelligence Research Methodologies 人工智能研究方法
    Thread safety
    include pointers as a primitive data type
    flat file
    functional cohesion
  • 原文地址:https://www.cnblogs.com/anke-z/p/12676778.html
Copyright © 2011-2022 走看看