IO流——字节流

常见字符集

标准ASCII码字符集

  • ASCII(American Standard Code for Information Interchange):美国信息交换标准代码,包括英文、符号等
  • 标准ASCII码使用1个字节存储一个字符,首位是0,总共可表示128个字符
    在这里插入图片描述

而对于国内而言,汉字和字符多达几万个,很明显ASCII码是不够用的,所以便推出了我们的汉字编码字符集——GBK


GBK(汉字内码扩展规范,国标)

  • 汉字编码字符集,包含了两万多个汉字等字符,GBK中一个中文字符编码成两个字节的形式存储
  • GBK规定,汉字的第一个字节的首位必须是1
  • GBK兼容了ASCII字符集,事实上,绝大多数字符集都兼容了ASCII


    Unicode字符集(万国码,也叫统一码)
  • Unicode是国际组织制定的,可以容纳世界上所有文字及符号的字符集,如UTF - 32、UTF - 16及UTF - 8,其中最常用的是UTF - 8
  • UTF - 8:Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节、2个字节、3个字节和4个字节。英文字符、数字等只占1个字节(兼容ASCII码),汉字字符占3个字节

字符集的编码、解码操作

  • Java对字符编码
String提供的方法说明
byte[] getBytes()使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName)使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
  • Java对字符解码
String提供的方法说明
String(byte[] bytes)通过使用平台的默认字符集解码指定的字节数组来构造新的String
String(byte[] bytes, String charsetName)通过指定的字符集解码指定的字节数组来构造新的String

演示

public class charsetTest {
    public static void main(String[] args) throws UnsupportedEncodingException {
        /* 编码*/
        String data = "abc一蓑烟雨任平生bcd";
        // 默认按平台字符集进行编码,这里使用的是UTF-8,中文3个字节
        byte[] bytes = data.getBytes();
        System.out.println(Arrays.toString(bytes));
        // 27
        System.out.println(bytes.length);

        // 按照指定字符集进行编码,GBK中文2个字节
        byte[] bytesGBK = data.getBytes("GBK");
        // 20
        System.out.println(bytesGBK.length);

        /* 解码 */
        String s1 = new String(bytes);
        // 平台配置的是UTF-8,所以,在对UTF-8编码的bytes解码时不需要指定字符集
        System.out.println(s1);

        // bytesGBK指定的编码是GBK,在使用默认编码UTF-8对其解码时会出现乱码
        String s2 = new String(bytesGBK);
        // abcһ��������ƽ��bcd
        System.out.println(s2);

        // 指定GBK对bytesGBK解码即可正常显示
        String s3 = new String(bytesGBK,"GBK");
        System.out.println(s3);
    }
}

IO流

IO流概述

  • I:指Input,称为输入流,负责把数据读到内存中区
  • O:指Output,称为输出流,负责写数据出去

IO流分类

  • 按流的方向分为输入流输出流
  • 按流中数据的最小单位分为字节流字符流,其中字节流适合操作所有类型的文件,如音频、视频、图片等,而字符流知识和操作纯文本文件,如:读写txt、doc、java文件等

总结流的四大类(抽象类)

  • 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流——> InputStream
  • 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流——> OutputStream
  • 字符输入流:以内存为基准,来自碰盘文件/网络中的数据以字符的形式读入到内存中去的流——> Reader
  • 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流——> Writer

FileInputStream(文件字节输入流)

  • 作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去
构造器说明
public FileInputStream​(File file)创建字节输入流管道与源文件接通
public FileInputStream​(String pathname)创建字节输入流管道与源文件接通
方法名说明
public int read()每次读取一个字节返回,如果发现没有数据可读会返回-1
public int read(byte[] buffer)每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1
public byte[] readAllBytes() throws IOException直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回

案例1

public class FileInputStreamTest {
    public static void main(String[] args) throws Exception {
        // 创建文件字节输入流管道,与源文件接通
//        InputStream is = new FileInputStream(new File("oop3\\src\\com\\ligemanyin\\_IO\\EnTest.txt"));
        InputStream is2 = new FileInputStream("oop3\\src\\com\\ligemanyin\\_IO\\EnTest.txt");

        int b;
        // read()一次只能读取一个字节,导致其无法读取中文字符,因为中文字符是3个字节
        while ((b = is2.read()) != -1) {
            System.out.print((char) b);
        }
        // 关闭流,释放资源
        is2.close();
    }
}

案例2

public class FileInputStreamTest2 {
    public static void main(String[] args) throws Exception{
        // 创建一个字节输入流对象代表字节输入流管道与源文件接通
        File file = new File("oop3\\src\\com\\ligemanyin\\_IO\\ChTest.txt");
        InputStream is = new FileInputStream(file);

        // 开始读取文件中的字节数据:每次读取多个字节
//        byte[] buffer = new byte[(int) file.length()];
//        int len = is.read(buffer);
//        String rs = new String(buffer);
//        System.out.println(rs);
//        System.out.println(len);

        // 或
        byte[] buffer2 = is.readAllBytes();
        System.out.println(new String(buffer2));
        // 关闭流,释放资源
        is.close();
    }
}

其中EnTest.txt中只写入了一句英文短句,而ChTest.txt中则写入张若虚的《春江花月夜》


FileOutputStream(文件字节输出流)

  • 作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去
构造器说明
public FileOutputStream(File file)创建字节输出流管道与源文件对象接通
public FileOutputStream(String filePath)创建字节输出管道与源文件路径接通
public FileOutputStream(File file, boolean append)创建字节输出流管道与源文件对象接通,可追加数据
public FileOutputStream(String filePath, boolean append)创建字节输出流管道与源文件路径接通,可追加数据
方法名说明
public void write(int a)写一个字节出去
public void write(byte[] buffer)写一个字节数组出去
public void write(byte[] buffer, int pos, int len)写一个字节数组的一部分出去
public void close() throws IOException关闭流

演示1

public class FileOutputStreamTest1{
    public static void main(String[] args) throws Exception {
        // 创建一个字节输出流管道与目标文件接通
        OutputStream op = new FileOutputStream("oop3\\src\\com\\ligemanyin\\_IO\\_FileOutPutStream\\outTest1.txt");

        // 写字节数据出去
        // 97一个字节-->a
        // abc
        op.write(97);
        op.write('b');
        op.write(99);
        // abc万里悲秋常作客,百年多病独登台
        byte[] bytes = "万里悲秋常作客,百年多病独登台".getBytes();
        op.write(bytes);
        // UTF-8中七个字21个字节
        // // abc万里悲秋常作客,百年多病独登台万里悲秋常作客
        op.write(bytes, 0, 21);

        // 以上构造器是将txt文本清空后进行写出
        // 以下构造器可不用清空文本,在文本后添加数据
        // 首先进行换行,方便区分,ASCII码中,10表示LF(Line Feed),即换行
        // 亦或是"\r\n"进行换行,通过getBytes()方法转换
        op.write(10);
        // OR op.write("\r\n".getBytes())
        OutputStream op2 = new FileOutputStream("oop3\\src\\com\\ligemanyin\\_IO\\_FileOutPutStream\\outTest1.txt", true);
        byte[] bytes2 = "艰难苦恨繁霜鬓,潦倒新停浊酒杯".getBytes();

        /*abc万里悲秋常作客,百年多病独登台万里悲秋常作客
        艰难苦恨繁霜鬓,潦倒新停浊酒杯*/
        op2.write(bytes2);
        op2.close();
        op.close();
    }
}

演示2

public class FileInputStreamTest2 {
    public static void main(String[] args) throws Exception{
        // 创建一个字节输入流对象代表字节输入流管道与源文件接通
        File file = new File("oop3\\src\\com\\ligemanyin\\_IO\\ChTest.txt");
        InputStream is = new FileInputStream(file);

        // 开始读取文件中的字节数据:每次读取多个字节
//        byte[] buffer = new byte[(int) file.length()];
//        int len = is.read(buffer);
//        String rs = new String(buffer);
//        System.out.println(rs);
//        System.out.println(len);

        // 或
        byte[] buffer2 = is.readAllBytes();
        System.out.println(new String(buffer2));
        // 关闭流,释放资源
        is.close();
    }
}

案例

public class CopyPictureTest {
    public static void main(String[] args) throws Exception{
        // 复制图片
        // 源文件
        InputStream is = new FileInputStream("F:\\Data\\picture\\图片1.jpg");
        // 目标文件
        OutputStream os = new FileOutputStream("F:\\Data\\picture\\picture.jpg");
        byte[] bytes = is.readAllBytes();
        os.write(bytes);

        // 先关后流,先流后关
        os.close();
        is.close();
        System.out.println("复制完成");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/458730.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

橡胶工厂5G智能制造数字孪生可视化平台,推进橡胶工业数字化转型

橡胶5G智能制造工厂数字孪生可视化平台,推进橡胶工业数字化转型。随着信息技术的迅猛发展和智能制造的不断推进,数字化转型已成为制造业转型升级的重要方向。橡胶工业作为传统制造业的重要领域,正面临着产业升级和转型的迫切需求。橡胶5G智能…

计算机网络笔记(湖科大教书匠版本)

第一章、 ①三种交换方式 电路交换、分组交换、报文交换(被分组交换所取代) 1.电路交换:会一直占用通道,不适合计算机之间的数据通信 2.分组交换:通常我们把表示该数据的整块数据称为一个报文。 先把较长的报文划…

MySQL—redo log、undo log以及MVCC

MySQL—redo log、undo log以及MVCC 首先回忆一下MySQL事务的四大特性:ACID,即原子性、一致性、隔离性和持久性。其中原子性、一致性、持久性实际上是由InnoDB中的两份日志保证的,一份是redo log日志,一份是undo log日志&#xff…

Linux——基础指令

一、Linux目录结构 1、树形结构 Linux只有一个根目录 / ,所有文件都在它下面 2、Linux路径的描述方式 在Linux系统中,路径之间的层级关系,使用: / 来表示 eg: /usr/local/hello.txt 注意: 开头/表示根…

解决:黑马webpack视频中出现的问题总结

问题 1 ERROR in main Module not found: Error: Can‘t resolve ‘./src‘ 解决 Webpack 中 ERROR in main Module not found: Error: Can‘t resolve ‘./src‘ 问题 黑马AJAX-Node.js-Webpack教学视频(BV1MN411y7pw 其中P98)中webpack部分&#xff0c…

phpcms上传导致getshell详解及案例

一、环境 这里我根据大佬的文章将环境复原 phpcms上传导致getshell详解及案例 | 离别歌 回忆phpcms头像上传漏洞以及后续影响 | 离别歌 二、代码&#xff1a; php&#xff1a; <?php header("Content-Type:text/html; charsetutf-8"); require_once(pclzip…

Unload-labs

function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传的文件类型var allow_ext ".jpg|.png|.gif";//提取上传文件的类…

Pytorch学习 day10(L1Loss、MSELoss、交叉熵Loss、反向传播)

Loss loss的作用如下&#xff1a; 计算实际输出和真实值之间的差距为我们更新模型提供一定的依据&#xff08;反向传播&#xff09; L1Loss 绝对值损失函数&#xff1a;在每一个batch_size内&#xff0c;求每个输入x和标签y的差的绝对值&#xff0c;最后返回他们平均值 M…

python创建虚拟环境-Anaconda安装配置和使用

Anaconda提供了一个名为conda的包管理工具&#xff0c;可以方便地创建、管理和分享Python环境。用户可以根据自己的需要创建不同的环境&#xff0c;每个环境都可以拥有自己的Python版本、库和依赖项&#xff0c;这样就可以避免因为不同项目之间的依赖关系而导致的冲突问题。 一…

Vscode中关于Java的一些问题

前言 在使用Vscode的时候&#xff0c;总是会有这么一种感觉&#xff1a;有时得这样&#xff0c;有时得那样&#xff0c;这让我甚是困惑&#xff0c;于是写下来这篇解答文章 为什么java文件有时候会有class文件&#xff0c;有时候没有 在编写Java代码时&#xff0c;我会有一种…

【Java基础】IO流(二)字符集知识

目录 字符集知识 1、GBK字符集 2、Unicode字符集&#xff08;万国码&#xff09; 3、乱码 4、Java中编码和解码的方法 字符集知识 字符&#xff08;Character&#xff09;&#xff1a;在计算机和电信技术中&#xff0c;一个字符是一个单位的字形、类字形单位或符号的基本信…

智能合约开发基础知识:最小信任机制、智能合约、EVM

苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 专栏的前面几篇详细了介绍了区块链的核心基础知识 有兴趣学习的小伙伴可以看看http://t.csdnimg.cn/fCD5E关于区块…

光伏便携式EL检测仪是什么?—科技助农

光伏便携式EL监测仪是一种专门用于检测光伏电池组件性能的高效、实用的设备。它利用电致发光&#xff08;Electroluminescence&#xff0c;EL&#xff09;原理&#xff0c;通过检测光伏板在受到光照后产生的电流所激发出的光线&#xff0c;来评估光伏板的性能。这种设备通常具有…

Linux搭建我的世界(MC)整合包服务器,All the Mods 9(ATM9)整合包开服教程

Linux使用MCSM面板搭建我的世界(Minecraft)整合包服务器&#xff0c;MC开服教程&#xff0c;All the Mods 9(ATM9)整合包搭建服务器的教程。 本教程使用Docker来运行mc服&#xff0c;可以方便切换不同Java版本&#xff0c;方便安装多个mc服版本。 视频教程&#xff1a;https:…

算法的渐进时间复杂度

T(n) = O(F(n)) T(n):Time 渐进时间复杂度 O:正比例关系 F(n):代码执行次数 只要代码执行的次数越来越多 所耗费的时间也就越来越高 常见的5种: O(n^2) O(n logn) O(n) O(logn) O(1):不管重复多少次1次也是这个时间,10次也是这个时间。 时间复杂度排序:由小到…

C语言指针与数组(不适合初学者版):一篇文章带你深入了解指针与数组!

&#x1f388;个人主页&#xff1a;JAMES别扣了 &#x1f495;在校大学生一枚。对IT有着极其浓厚的兴趣 ✨系列专栏目前为C语言初阶、后续会更新c语言的学习方法以及c题目分享. &#x1f60d;希望我的文章对大家有着不一样的帮助&#xff0c;欢迎大家关注我&#xff0c;我也会回…

我记不住的那些命令-xxdod

背景&#xff1a; 这里记录一下具体的xxd和od命令参数和使用方法&#xff0c;我想我肯定是记不住这些参数的。 零、文件 我们这里有一个示例文件README.txt&#xff0c;内容如下图所示&#xff1a; 一、xxd(查看、编辑二进制文件) 1. 十六进制显示(默认) 我们发现上面的显…

使用代理ip后访问网站仍然被拒该怎么办

目录 前言 一、代理IP被网站封锁 二、代理IP的质量不佳 三、代理设置不正确 总结 前言 在使用代理IP之后仍然被网站拒绝访问可能是由于多种原因引起的。这些原因包括代理IP被网站封锁、代理IP的质量不佳、代理设置不正确等。下面将详细介绍如何解决这些问题。 一、代理I…

代码学习记录16

随想录日记part16 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.11 主要内容&#xff1a;今天的主要内容是二叉树的第五部分&#xff0c;主要涉及最大二叉树&#xff1b;合并二叉树&#xff1b;二叉搜索树的搜索&#xff1b;验证二叉搜索树。 654.最大二叉…

使用docker-compose部署Redis集群

一、部署三主三从的Redis集群 分别为6个节点建立挂载目录&#xff0c;每个目录下建立数据、配置、日志文件夹。 docker-compose内容如下&#xff1a; version: 3 services:redis1:image: redis:6.2.3restart: alwaysports:- "6379:6379"- "16379:16379"v…