Java 字符流和字符缓冲流

2023-11-10

1.字符的编码解码

windows 默认使用码表为 GBK,一个字符两个字节。

IDEA 和以后工作默认使用 Unicode 的 UTF-8 编解码格式,一个中文三个字节。

package com.qdu;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class CharStreamDemo2 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        // byte[] getBytes() 使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
        // byte[] getBytes(String charsetName) 使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中

        String s = "黑马程序员";

        // 利用idea默认的UTF-8将中文编码为一系列的字节
        byte[] bytes1 = s.getBytes();
        System.out.println(Arrays.toString(bytes1));

        // 利用gbk将中文编码为一系列的字节
        byte[] bytes2 = s.getBytes("GBK");
        System.out.println(Arrays.toString(bytes2));

        // String(byte[] bytes) 通过使用平台的默认字符集解码指定的字节数组来构造新的String
        // String(byte[] bytes, String charsetName) 通过指定的字符集解码指定的字节数组来构造新的String
        
        // 利用默认的UTF-8进行解码
        String s1 = new String(bytes1);
        System.out.println(s1);

        // 利用GBK进行解码
        String s2 = new String(bytes2, "gbk");
        System.out.println(s2);
    }
}

因为字节流一次读一个字节,而不管GBK还是UTF-8一个中文都是多个字节,用字书流每次只能读其中的一部分,所以就会出现乱码问题。

2.字符流

字符流 = 字节流 + 编码表

不管是在哪张码表中,中文的第一个字节一定是负数。

在这里插入图片描述

想要进行拷贝,一律使用字节流或者字节缓冲流。

想要把文本文件中的数据读到内存中,请使用字符输入流。

想要把内存中的数据写到文本文件中,请使用字符输出流。

2.1 字符输出流:写数据

在这里插入图片描述

package com.qdu;

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

public class CharStreamDemo3 {
    public static void main(String[] args) throws IOException {
        // 1.创建字符输出流的对象
        // FileWriter fw = new FileWriter(new File("charstream\\a.txt"));
        FileWriter fw = new FileWriter("a.txt");

        // 2.写数据
        // void write(int c) 写一个字符
        // fw.write(97);
        // fw.write(98);
        // fw.write(99);

        // void write(char[] cbuf) 写一个字符数组
        // char[] chars = {97, 98, 99, 100, 101};
        // fw.write(chars);

        // void write(char[] cbuf, int off, int len) 写字符数组的一部分
        // char[] chars = {97, 98, 99, 100, 101};
        // fw.write(chars, 0, 3);

        // void write(String str) 写一个字符串
        // String line = "加油abc";
        // fw.write(line);

        // void write(String str, int off, int len) 写一个字符串的一部分
        String line = "加油abc";
        fw.write(line, 0, 2);

        // 3.释放资源
        fw.close();
    }
}

在这里插入图片描述

在这里插入图片描述

package com.qdu;

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

public class CharStreamDemo5 {
    public static void main(String[] args) throws IOException {
        // flush() 刷新流,刷新完毕之后,还可以继续写数据
        // close() 关闭流,释放资源,关闭之前会刷新流,一旦关闭,就不能写数据

        FileWriter fw = new FileWriter("a.txt");

        fw.write("虎年大吉");
        fw.flush();
        fw.write("666");
        fw.flush();

        fw.close();

        // fw.write("aaa"); // 报错:Stream closed
    }
}

2.2 字符输入流:读数据

示例1:一次读取一个字符

package com.qdu;

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

public class CharStreamDemo6 {
    public static void main(String[] args) throws IOException {
        // 创建字符输入流的对象
        // FileReader fr = new FileReader(new File("a.txt"));
        FileReader fr = new FileReader("a.txt");

        // 读取数据
        int ch;
        while ((ch = fr.read()) != -1) {
            System.out.println((char) ch);
        }

        // 释放资源
        fr.close();
    }
}

示例2:一次读取多个字符

package com.qdu;

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

public class CharStreamDemo7 {
    public static void main(String[] args) throws IOException {
        // 创建对象
        FileReader fr = new FileReader("a.txt");

        // 创建一个数组
        char[] chars = new char[1024];
        int len;

        // 一次读取多个字符,把读到的字符都存入到chars数组中
        // 返回值:表示本次读到了多少个字符
        while ((len = fr.read(chars)) != -1) {
            System.out.println(new String(chars, 0, len));
        }

        fr.close();
    }
}

2.3 案例

练习:将用户键盘录入的用户名和密码保存到本地实现永久化存储。要求用户名独占一行,密码独占一行。

package com.qdu;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class CharStreamDemo8 {
    public static void main(String[] args) throws IOException {
        // 1.实现键盘录入,把用户名和密码录入进来
        Scanner sc = new Scanner(System.in);
        System.out.println("请录入用户名");
        String username = sc.next();
        System.out.println("请录入密码");
        String password = sc.next();

        // 2.分别把用户名和密码写到本地文件
        FileWriter fw = new FileWriter("a.txt");
        fw.write(username);
        fw.write("\r\n");
        fw.write(password);
        fw.flush();

        // 3.释放资源
        fw.close();
    }
}

3.字符缓冲流

3.1 字符缓冲输入流:读数据

BufferedReader:可以将数据高效地读取到内存

构造方法:BufferedReader(Reader in)

package com.qdu;

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

public class CharStreamDemo9 {
    public static void main(String[] args) throws IOException {
        // 字符缓冲输入流
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));

        // 读取数据
        char[] chars = new char[1024];
        int len;
        while ((len = br.read(chars)) != -1) {
            System.out.println(new String(chars, 0, len));
        }

        br.close();
    }
}

特有功能 public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为 null。

package com.qdu;

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

public class CharStreamDemo12 {
    public static void main(String[] args) throws IOException {
        // 创建对象
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));

        // 读取数据
        String line1 = br.readLine();
        String line2 = br.readLine();
        String line3 = br.readLine();

        // readLine如果读不到数据返回null
        String line4 = br.readLine();
        String line5 = br.readLine();

        System.out.println(line1);
        System.out.println(line2);
        System.out.println(line3);
        System.out.println(line4);
        System.out.println(line5);

        // 释放资源
        br.close();
    }
}
package com.qdu;

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

public class CharStreamDemo13 {
    public static void main(String[] args) throws IOException {
        // 创建对象
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));

        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        // 释放资源
        br.close();
    }
}

3.2 字符缓冲输出流:写数据

BufferedWriter:可以将数据高效地写出

构造方法:BufferedWriter(Writer out)

package com.qdu;

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

public class CharStreamDemo10 {
    public static void main(String[] args) throws IOException {
        // 字符缓冲输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));

        // 写出数据
        bw.write(97);
        bw.write("\r\n");

        char[] chars = {97, 98, 99, 100, 101};
        bw.write(chars);
        bw.write("\r\n");

        bw.write(chars, 0, 3);
        bw.write("\r\n");

        bw.write("虎年大吉");
        bw.write("\r\n");

        String line = "abcdefg";
        bw.write(line, 0, 5);

        bw.flush();

        bw.close();
    }
}

特有功能 void newLine():写一行行分隔符,行分隔符字符串由系统属性定义。

package com.qdu;

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

public class CharStreamDemo11 {
    public static void main(String[] args) throws IOException {
        // 创建对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));

        // 写出数据
        bw.write("虎年大吉666");
        bw.newLine();

        bw.write("abcdef");
        bw.newLine();

        bw.write("-------------");

        // 刷新流
        bw.flush();

        // 释放资源
        bw.close();
    }
}

3.3 案例

练习:读取文件中的数据,排序后再次写到本地文件。

package com.qdu;

import java.io.*;
import java.util.Arrays;

public class CharStreamDemo14 {
    public static void main(String[] args) throws IOException {
        // 1.要把文件中的数据读取进来
        BufferedReader br = new BufferedReader(new FileReader("sort.txt"));

        // 输出流一定不能写在前面,因为会清空文件中的内容
        // BufferedWriter bw = new BufferedWriter(new FileWriter("sort.txt"));

        String line = br.readLine();
        System.out.println("读取到的数据为" + line);
        br.close();

        // 2.按照空格进行切割
        String[] split = line.split(" ");

        // 3.把字符串类型的数组变成int类型
        int [] arr = new int[split.length];

        // 遍历split数组,进行类型转换
        for (int i = 0; i < split.length; i++) {
            String smallStr = split[i];
            int number = Integer.parseInt(smallStr); // 类型转换
            arr[i] = number; // 把转换后的结果存入到arr中
        }

        // 4.排序
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));

        // 5.把排序之后的结果写回到本地
        BufferedWriter bw = new BufferedWriter(new FileWriter("sort.txt"));
        for (int i = 0; i < arr.length; i++) {
            bw.write(arr[i] + " ");
            bw.flush();
        }

        // 释放资源
        bw.close();
    }
}

4.小结

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 字符流和字符缓冲流 的相关文章

随机推荐

  • RFC文档:官网、中文RFC文档 及 HTTP/2相关文档

    记录一下RFC的官方文档 2023 06 12修正中文RFC文档无法访问问题 一 RFC官方网站 http www rfc editor org Index of rfc RFC文档列表 Index of rfc 二 中文RFC文档 中文R
  • OS面试题(转载)

    转载自 http placement freshersworld com power preparation technical interview preparation os interview questions 23351 1 Wh
  • Tracy 小笔记 Vue - Vue 对象

    Vue 对象 const vue new Vue options el 类型 String HtmlElement 作用 挂载对象 决定之后Vue 对象会管理哪个 Dom template 当同时有 el 和 tempalte 的时候这里写
  • java泛型

    一 泛型概念的提出 为什么需要泛型 首先 我们看下下面这段简短的代码 1 public class GenericTest 2 3 public static void main String args 4 List list new Ar
  • 计算机文档加密如何解锁,bitlocker怎么解锁_bitlocker解锁方法

    许多用户为了保护电脑文件安全不被偷看 都会喜欢使用bitlocker加密功能来进行加密 Bitlocker是一种独特的为磁盘添加密码的工具 但是很多用户使用bitlocke加密完之后 不知道要怎么解锁 为此小编这就给大家带来bitlocke
  • Vue 使用 mqttws31.js 实现消息实时推送功能(WebSocket)

    1 在 vue 文件中引入 mqttws31 js 文件 mqttws31 js 文件代码在本页底部 import utils mqttws31 2 在 vue 文件中添加代码 export default data return clie
  • MapReduce官方案例wordcount

    wordcountReduce java package MaperReduce import java io IOException import org apache hadoop io LongWritable import org
  • Python后端Flask学习项目实践---搭建一个问答网站

    1 项目效果展示 这里主要以后端为主 前端的代码不做展示 如果需要代码可以评论或者私信 用户注册 登录相关 用邮箱进行注册 并通过向邮箱发送验证码来进行判断 一个邮箱只能注册一个账号 首页相关 用户登录后可以进行发布问题和回答 同时也提供搜
  • 外罚函数法计算机,罚函数法与障碍函数法

    罚函数法与障碍函数法 罚函数法与障碍函数法是求解约束极小化问题的较好的算法 其基本原理是在原目标函数中加上一个罚 障碍 函数 而得到一个增广目标函数 罚 障碍 函数的功能是对非可行或企图穿越边界而逃离可行域的点赋予一个极大的函数值 可以作一
  • 使用 Date 和 SimpleDateFormat 类表示时间以及Calendar 类的应用

    在程序开发中 经常需要处理日期和时间的相关数据 此时我们可以使用 java util 包中的 Date 类 这个类最主要的作用就是获取当前时间 我们来看下 Date 类的使用 使用 Date 类的默认无参构造方法创建出的对象就代表当前时间
  • sql:SQL优化知识点记录(七)

    1 索引优化5 2 索引优化6 3 索引优化7 查询 百分号加右边 否则索引会失效 没建立索引之前都是全表扫描 没建立索引 建立索引 建立索引 id是主键 他也可以从主键上取 覆盖索引要到了name 索引没有失效 覆盖索引要到了age 索引
  • 使用OpenCV,Python和dlib进行眨眼检测及计数

    前三篇博客学习了 windows10 Python3 7安装dlib库进行面部标志识别 python dlib实现面部标志识别 使用python dlib OpenCV提取眼睛 鼻子 嘴唇及下颌 这篇博客将进行进阶版的学习 眨眼检测 眨眼检
  • 如何利用codesense的GJB8114模板对c++源码进行进行规则检测

    2013年7 10 中国 民解放军总装备部发布了中华 民共和国国家军 标准GJB 8114 全称为 8114 2013 C C 语 编程安全 集 提出软件编程标准 以提 国家军 软件的安全性 并作为静态规则检查的依据 量数据表明 软件存在的
  • Python可视化图系列(1)-----jupyter notebook

    Python可视化 复杂的散点图 文章目录 Python可视化 复杂的散点图 前言 一 我们的目标是什么 二 实现目标的知识准备 1 引入库 2 导入数据 3 准备标签的列表和颜色 三 画目标图片 复杂的散点图 四 解读图像 总结 前言 提
  • 五大常用算法之四:分治法

    分治法和动态规划有点像 都是分解成子问题 中科大的张署老师课件很清楚 摘录如下 1 什么是分治法 当求解的问题较复杂或规模较大时 不能立刻得到原问题的解 但这些问题本身具有这样的特点 它可以分解为若干个与原问题性质相类似的子问题 而这些子问
  • 加载超炫动画

    1 MainActivity 1 package com zyhui zyh splash 2 3 import android os Bundle 4 import android os Handler 5 import android
  • 谈谈中间件开发,给想从事中间件开发的同学

    前言 本文主要是写给那些想从事中间件开发的同学看的 如果你没有这个打算 那么本文的学习路线非但不实用 还可能会影响你正常的工作 什么是中间件开发 随着国内软件行业的发展 国内互联网公司规模越来越大 业务越来越复杂 随之使用大量的中间件来提高
  • 【unity3d之UI界面学习】NGUI插件的导入步骤

    首先将下载好的NGUI资源包 我下载的是3 11 4版本 导入到引擎中进行使用 在unity3d界面点击鼠标右键 弹出的菜单送选中import package 然后选择custom package 自定义资源包 弹出资源路径窗口 找到NGU
  • 得物H5页面url中sign逆向分析

    一 抓包分析 https app dewu com api v1 h5 activity fire activity platform product feeds recommend detail sign b3e37ea512b177be
  • Java 字符流和字符缓冲流

    文章目录 1 字符的编码解码 2 字符流 2 1 字符输出流 写数据 2 2 字符输入流 读数据 2 3 案例 3 字符缓冲流 3 1 字符缓冲输入流 读数据 3 2 字符缓冲输出流 写数据 3 3 案例 4 小结 1 字符的编码解码 wi