【Java文件流】我尝试用一文把“字节流”说清楚

最近做单片机小东西的总结 (STC12C5A60S2) 我做的是用 STC12C5A60S2+Nokia5110+DS18B20+NRF42L01 测量温度,然后经过无线传输再显示的小东西。 阅读详情

初学者学习IO流的标准操作步骤:
第一,需要知道实现一个IO操作需要什么步骤,需要哪些API;
第二,不要去深究它的底层原理(我说的是新手);
第三,搞清楚各个流的类之间的继承、实现关系,另外就是它那迷一样的类名。

诞生背景:

  1. 计算机中都是二进制数据,一个字节是8个2进制位。字节可以表 示所有的数据,比如文本,音频,视频。图片,都是作为字节存在的。也就是说字节流处理的数据非常多。
  2. 在文本文件中存储的数据是以我们能读懂的方式表示的。而在二进制文件中存储的数据是用二进制形式表示的。我们是读不懂二进制文件的,因为二进制文件是为了让程序来读取而设计的。
  3. 例如,Java的源程序(.java源文件)存储在文本文件中,可以使用文本编辑器阅读,但是Java的类(字节码文件)存储在二进制文件中,可以被Java虚拟机阅读。二进制文件的优势在于它的处理效率比文本文件高。
  4. 总结:把人能看懂的文件内容转换为机器能看懂的文件内容。

输入字节流InputStream

功能: 从磁盘文件中读取,到内存。

输入字节流体系结构
在这里插入图片描述

  • java.lang.AutoCloseable:JDK1.7引入的自动关闭资源特性
  • java.lang.Closeable:使得可以关闭流
  • java.io.InputStream:字节输入流接口,定义了许多字节输入的操作
  • java.io.FileInputStream:文件字节流
  • java.io.BufferedInputStream:带缓冲的文件字节流

输入字节流(InputStream)核心方法:

  • public abstract int read() throws IOException
    • 读取一个字节,范围为0至255;
    • 返回读取的字节
    • 读到了末尾时为-1;
  • public int read(byte[] b) throws IOException
    • 读取字节数组容量个字节,暂存到字节数组;
    • 返回读取成功的字节数
    • 读到了末尾时为-1;
  • public int read(byte[] b, int off, int len) throws IOException
    • 从第off个字节处开始,读len个字节,暂存到字节数组
    • 返回读取成功的字节数
    • 读到了末尾时为-1;
  • public byte[] readAllBytes() 读取所有字节

特性:

  1. 一般来说,字节流不可以写中文,但是由于String类的有些方法中有一个可以按照平台解码的功能使得其具备写中文的能力;
  2. 包:java.io.*;
  3. 本质:读取文件中的数据是文件中的二进制,并不会将其转化为人看得懂的;
  4. 凡是缓冲流都不具备读写文件的能力,只不过是建立了一个缓冲区提高读写速度;

FileInputStream类

使用FileInputStream类的标准步骤:
Step1:找到目标文件,File类实现;
Step2:建立数据的输入通道,FileInputStream类实现;
Step3:读取内容,read() 方法;
Step4:关闭通道,close() 方法;

使用示例:

FileInputStream示例
import java.io.IOException;
import java.io.FileInputStream;
import java.io.File;

public class Main {
	public static void main(String[] args) throws IOException {
		readOneByte(); //读取一个字节
		readByteArray(); //读取一个字节数组
	}

	public static void readOneByte() throws IOException {
		String path = "C:\\users\\kyle\\desktop\\a.txt";
		File file = new File(path);
		FileInputStream fis = new FileInputStream(file);
		int len = 0; //接受read方法的返回值,读取成功的数目
		while((len = fis.read())!=-1) {
			System.out.print((char)len);
		}
		fis.close();
	}
	public static void readByteArray() throws IOException {
		String root = "C:\\users\\kyle\\desktop\\a.txt"; //原本桌面上没有NewDir文件夹
		File file = new File(root);
		FileInputStream fis = new FileInputStream(file);
		byte[] tmp = new byte[8];
		int len = 0; //保存读取成功的字节数
		while((len = fis.read(tmp))!= -1) {
			System.out.println("读取成功的字节数:"+len);
			System.out.println("读取到的内容是:"+new String(tmp,"UTF-8"));
		}
		fis.close();
	}
}

BufferInputSteam类

是FileInputSteam类的升级版,因为使用缓冲可提高读取效率;

标准操作流程:
Step1:找到目标文件;File实现;
Step2:建立通道;FileInputStream类实现;
Step3:把FileInputStream类对象传入BufferInputStream的构造方法中;
Step4:读取文件数据;
Step5:关闭;

原理图

缓冲区类的原理图

如何使用:

//BufferInputStream示例
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.BufferedInputStream;

public class Main {
	public static void main(String[] args) throws IOException {
		String path = "C:\\users\\kyle\\desktop\\a.txt";
		File file = new File(path);
		FileInputStream fis = new FileInputStream("C:\\users\\kyle\\desktop\\a.txt");
		BufferedInputStream bis = new BufferedInputStream(fis); //包装FileInputStream
		
		byte[] b = new byte[10];
		int len = 0;
		while((len = bis.read(b))!=-1) {
			System.out.println(new String(b,0,len)); //读取b数组中的数据,从0位置开始,读取len个
		}
		bis.close();
	}
}

输出字节流OutputStream

功能: 把内存中数据内容,写出到磁盘文件中。

输出字节流的体系结构
在这里插入图片描述

  • java.lang.AutoCloseable:JDK1.7引入的自动关闭资源特性
  • java.lang.Closeable:使得可以关闭流
  • java.io.Flushable:
  • java.io.OutputStream:字节输出流接口,定义了许多字节输出的操作
  • java.io.FileInputStream:文件字节流
  • java.io.BufferedInputStream:带缓冲的文件字节流

方法

  1. void close():关闭此输出流并释放与此流有关的所有系统资源。
  2. void flush():刷新此输出流并强制写出所有缓冲的输出字节。
  3. void write(byte[] b):将 b.length 个字节从指定的 byte 数组写入此输出流。
  4. void write(byte[] b, int off, int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
  5. abstract void write(int b):将指定的字节写入此输出流。

FileOutputStream类

核心构造方法:

  • FileOutputStream(File file);
  • FileOutputStream(String name);

标准操作流程
Step1:找到目标文件,File类实现;
Step2:建立数据输出通道,FileOutputStream类实现;
Step3:把数据写出,write() 方法;
Step4:关闭通道,close() 方法;

使用FileOutputStream 的时候:

  1. 如果目标文件不存在,那么会自动创建目标文件对象。

  2. 如果目标文件已经存在,那么会先清空目标文件中的数据,然后再写入数据。

  3. 如果目标文件已经存在,需要在原来数据基础上追加数据的时候应该使用new FileOutputStream(file,true)构造函数,第二参数为true。

  4. write方法写数据的时候,虽然接收的是一个int类型的数据,但是真正写出的只是一个字节的数据,只是把低八位的二进制数据写出,其他二十四位数据全部丢弃。如下例:

FileOutputStream对象.write(49);	写到文件中的数据,经过打开是“1”;
假如write(511); 00000000-000000000-00000001-11111111   511;
则只有低八位的数据才会被写到磁盘文件中;

使用示例:

//方法一:write(int b)方法,一次写入文件一个字节;
//方法二:write(byte[] b),就是使用缓冲,提高效率.

import java.io.IOException;
import java.io.File;
import java.io.FileOutputStream;

public class Main {
	public static void main(String[] args) throws IOException {
		//方法一:write(int b)方法,一次写入文件一个字节;
		writeOneByte();
		//方法二:write(byte[] b),就是使用缓冲,提高效率.
		writeByteArray();
	}
	
	public static void writeOneByte() throws IOException {
		File path = new File("C:\\users\\kyle\\desktop\\a.txt");
		FileOutputStream fos = new FileOutputStream(path);
		fos.write('j'); //报错语句:fos.write("j");
		fos.write('a');
		fos.write('v');
		fos.write('a');
		fos.close();
	}
	public static void writeByteArray() throws IOException {
		File path = new File("C:\\users\\kyle\\desktop\\a.txt");
		FileOutputStream fos = new FileOutputStream(path);
		String str = "java";
		byte[] byt = str.getBytes(); //把一个字符串转化为byte存入数组中
		fos.write(byt);
		fos.close();
	}
}

BufferOutputStream类

使用格式:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.BufferedOutputStream;

public class Main {
	public static void main(String[] args) throws IOException {
		writerBuffer();
	}
	public static void writerBuffer() throws IOException {
		String path = "C:\\users\\kyle\\desktop\\a.txt";
		File file = new File(path);
		FileOutputStream fos = new FileOutputStream(file);
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		bos.write("hello".getBytes());
		bos.close();
	}
}

在字节流中使用完善的异常机制

异常使用背景:
只在方法后抛出异常是很不合理的,因为异常并为得到处理,即异常发生后文件没有被关闭!

解决方案是:
一定需要使用try{} catch(){}finally{}语句。try中放入可能出现异常的语句,catch是捕获异常对象,fianlly是一定要执行的代码

//异常在IO流中的使用示例
import java.io.IOException;
import java.io.FileInputStream;

public class Main {
	public static void main(String[] args) throws IOException {
		String path = "C:\\users\\kyle\\desktop\\a.txt";
		readFile(path);
	}

	private static void readFile(String path) {
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(path);
			byte[] byt = new byte[1024];
			int len = fis.read(byt);
			System.out.println(new String(byt, 0, len));
		} catch (IOException e) {
			// 抛出运行时异常
			throw new RuntimeException(e);
		} finally {
			// 把close方法放入finally中保证一定会执行
			// 先判断是否空指针
			if (fis != null) {
				try {
					fis.close();
				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}
		}
	}
}
Java文件流与二进制数据处理 本文详细探讨了Java中字节流的使用方法,包括输入输出流的基本操作,过滤流的高级特性,以及如何读写二进制值。通过示例代码和结构化解释,揭示了文件流在Java中的重要性,以及如何高效地利用这些工具进行数据处理。 阅读详情

相关推荐

Coze:手把手教你搭建 小红书二创 智能体

前一篇 “” ,讲了如何针对需求进行拆解,并拆解 ”小红书二创“ 智能体,分为四个内容模块。通过上述步骤,开始一步一步构建 “小红书二创” 智能体。用来测试的小红书地址:http://xhslink.com/a/quxWEDAj3J48。

保持敏感!保持学习! 1436

IO流面试题

1.什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别 答案 Bit最小的二进制单位 ,是计算机的操作部分 取值0或者1 Byte是计算机操作数据的最小单位由8位bit组成 取值(-128-127) Char是用户的可读写的最小单位,在java里面由16位bit组成 取值(0-65535) Bit 是最小单位 计算机 只能认识 0或者1  8...

t0404的博客 3万+

从零构建智慧农业监测终端:STM32数据采集与LoRa组网实战

本文详细介绍了如何从零构建智慧农业监测终端,涵盖STM32数据采集与LoRa组网实战。通过DHT22温湿度传感器和YL-69土壤湿度传感器实现精准环境监测,结合LoRa无线传输技术解决偏远农田信号问题。文章还分享了硬件选型、电路设计、低功耗优化及Flutter跨平台应用开发等关键技巧,助力农业智能化升级。

weixin_29172963的博客 357

Java 字节流详

本文全面介绍了Java字节流的使用方法,包括基础概念、核心操作和常见实现类。字节流以字节为单位处理数据,核心父类是InputStream和OutputStream,分别提供读取和写出方法。文件字节流(FileInputStream/FileOutputStream)可直接操作文件,缓冲字节流(BufferedInputStream/BufferedOutputStream)通过缓冲区提高IO效率,数据字节流(DataInputStream/DataOutputStream)则支持基本数据类型的读写。文章详细

2201_75941872的博客 784

手写数字数据集MNIST

文章目录一、 简介二、下载MNIST数据集训练集和测试集的长度输出图像数据和标记数据的形状显示手写数字图片输出数据集中的第1个样本显示图片 一、 简介 MNIST是一个非常有名的手写体数字识别数据集(手写数字灰度图像数据集),在很多资料中,这个数据集都会被用作深度学习的入门样例。 MNIST数据集是由0到9的数字图像构成的。训练图像有6万张,测试图像有1万张。MNIST数据集是NIST数据集的一个子集,它包含了60000张图片作为训练数据,10000张图片作为测试数据。由250个不同的人手写而成。 每一张图

qq_37289115的博客 1万+

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

SMFA(自调制特征聚合模块): SMFA模块用于协同建模局部和非局部信息,它分为两个分支:一个是EASA(Efficient Approximation of Self-Attention,简化的自注意力分支),用于捕获非局部信息;另一个是LDE(Local Detail Estimation,局部细节估计分支),用于捕获局部细节。EASA通过对输入特征进行下采样,然后利用全局特征的方差进行调制,再与原始特征进行聚合,提取非局部结构信息。LDE分支则通过卷积操作提取输入特征中的高频局部信息。

qq_64693987的博客 2208

【JAVA CORE_API】Day16 IO流、文件流、换种字节流、对象流

简单地说,就例如用水管举例,自来水公司通过水管到各户家里,这个管道就是低级流,但是这时候我想用热水洗澡,我们不能利用烧水再和凉水勾兑,太麻烦了,于是我们使用热水器,自来水管连进热水器,热水器就是一个高级流;再就是我们如果想喝过滤水,我们也可以选择装一个过滤器,这也是一个高级流;那如果我们想用纯净水去洗澡呢?我们就可以先接一个过滤器这个高级流,再接一个热水器高级流,将水进行二次、三次、…处理,在关流的时候关的也是高级流,就像洗完澡要关的是热水器,而不是水阀。

HLJ_Student的博客 1186

基于ROS2 Humble和VGR数据集完整部署GADEN气体分散仿真环境及模型替换实践

文章摘要 本文详细介绍了基于ROS2 Humble和VGR数据集部署GADEN气体分散仿真环境的方法。GADEN是一款专为移动机器人嗅觉研究设计的3D仿真框架,能够精确模拟气体扩散过程并集成多种环境传感器。文章从系统配置开始,逐步指导读者完成ROS2 Humble环境的搭建、GADEN框架的编译部署,以及VGR数据集的使用。VGR数据集包含120个基于真实房屋模型的CFD仿真案例,为研究提供高度真实的测试环境。教程涵盖了常见问题的解决方案,并深入探讨了气体扩散模型参数的修改方法,为机器人嗅觉算法的开发和验证

huanghm88的专栏 274

Java字节流battle字符流

字符流和字节流

m0_64231944的博客 640

热红外图像小目标检测算法综述

热红外小目标检测算法综述,着重介绍基于深度学习的小目标检测算法

Littro Innovations 4244

RK3568平台开发系列讲解(外设篇)CAN的使用

📢 本篇章带大家快速了解CAN的使用。

内核笔记 2352

IO操作——IO字节流相关类、字节流读写、缓冲区的使用和区别、文件资源泄露

流(Stream)概念流相关类字节流读写流对象的核心操作文件资源泄露 概念 File类中虽然能进行一些常规的文件操作,但是少了两个非常核心的操作,读文件、写文件。 流 是Java中针对文件操作,又进行了进一步的抽象 流是一组类/一组API,不同的类会存在差异 流相关类 文本文件和二进制文件区分方式很简单: 拿一 个记事本打开这个文件, 里面的内容能看懂,就是文本文件. 里面的内容看不懂,就是二进制文件. 1、字节(byte)流 读写数据以字节为单位,处理二进制文件/数据使用字节流 InputStre

char_m的博客 786

PyRoki:机器人运动学优化库入门教程

PyRoki:模块化机器人运动学优化工具包 本文介绍了PyRoki,一个模块化、可扩展且跨平台的机器人运动学优化工具包。PyRoki通过统一变量和成本函数接口,简化了逆运动学、轨迹优化和运动重定向等任务的实现,支持CPU、GPU和TPU加速。实验表明,PyRoki在批量逆运动学任务中比现有GPU加速库cuRobo快1.4-1.7倍,且收敛误差更低。其模块化设计支持快速集成新成本函数,并通过交互式可视化工具优化参数配置。PyRoki开源发布,为机器人运动优化提供了灵活高效的解决方案。

机器人控制与仿真应用 1291

文件流对象(字节流、字符流)(InputStream、OutputStream、Reader、Writer)

close()释放文件描述符,文件描述符是一个顺序表(数组),一个进程每次打开一个文件,旧就需要在表里分配一个元素,如果一直打开文件不关闭,会把数组占满,再尝试打开文件时会出错。但如果写入缓冲区后没来得及写入硬盘进程结束了,那么数据会丢失,为了避免这种情况,手动使用flush方法(刷新缓冲区),手动刷新缓冲区,确保数据写入硬盘。每次读写最小单位是“字符”(utf8中1中文字符3字节 GBK中1中文字符2字节)(字符流相当于对字节流的封装 自动把文件中相邻的几个字节转换成一个字符)2.字符流(对应文本文件)

ii804070359的博客 565

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java调用第三方接口返回字节流,完成文件的下载

前言 业务场景:当我点击一个按钮时,调用第三方接口,后台返回一个字节流,然后浏览器弹出文件另存为的弹窗,直接保存。 但是在实际操作当中,浏览器拿到返回的字节流是不能解析的,下载的文件也是一个乱码文件,所以我决定在前端对返回的文件进行解析完成下载。但是是这样做有个问题,后面会解释 前端解析字节流下载文件 经过我多方查询资料,发现大部分都是使用xhr,因为后台传回来的是字节流,所以不能用ajax方法(dataType没有能接受字节流的参数),要用原生的XMLHttpRequest。 前端代码如下所示 var x

mcband的博客 6560

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java——IO流(节点流或文件流)

IO流(节点流或文件流) 首先我们先了解一下主要的两个流的体系,然后再去看看四大基本流的使用方法。 流的体系结构 InputStream & Reader InputStream 和 Reader 是所有输入流的基类。 InputStream(典型实现:FileInputStream) int read() int read(byte[] b) int read(byte[] b, int off, int len) Reader(典型实现:FileReader) int read()

xiangqian0721的博客 393

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

php与java通信(http字节流传输)

这几天主要是忙着完成与java接口的字节流传输。     刚开始有java文件调用接口的例子,导致自己走了很多弯路。既然是字节流传输,那么php的字符串就应该是需要转换成字节,各种字符串转换啊,忙啊忙啊的,后来竟然都转换成二进制了。到底怎么去传输啊,怎么传输啊,字节流传输,http协议是怎么定义的啊,各种找资料。各种尝试无果以后,开始寻求帮助,寻求牛人帮助,最终终于调通。 思维不行啊,说多了都

kxguan的专栏 2276

[Java学习笔记]IO流——字节流和字符流

字节流 抽象超类: InputStream是所有字节输入流的父类,其定义了基础的读取方法,常用的方法如下: — int read() 读取一个字节,以int形式返回(取一个byte也即“低8位”), 若返回值为-1,则表示EOF(End Of File) — int read(byte[] d) 尝试读取给指定数组的length个字节并存入该数组, 返回值为实际读取到的字节量 Output...

DoneBug的博客 240

Java I/O 文件流简介和简单使用

编程语言的I/O库中常使用‘流’这个抽象概念,他代表任何又能路产生数据的数据源对象或有能力接收数据的接收端对象;在java中从数据的传输方式看 “流”分为 字节流和字符流两类 如下所示 InputStream 方法简介 名称 返回值 说明 read() int 输入流中读取下一个字节数据,返回读取的字节数据,返回-1表示读取完成 read(byte b[]) int 输入流中读取0-b.length()个字节的数据,并将数据存储在b中,返回读取的字节数或-1表示读取完成 avail

Yuit 464

JavaSE——IO流-字节流

IO流概述及其分类 概述 IO流:用于处理设备之间的数据传输。 Java对数据的操作都是通过流的方式。 Java用于操作流的对象都在IO包中。 分类 按照数据流向分类 输入流:读入数据 输出流:写出数据 这里的输入和输出指的是内存的输入和输出。 按照数据类型分类 字节流:可以读写任何类型的文件,比如音频,视频,文本文件,可执行文件等。 字符流:只能读写文本文件 通常情况下,如果文件可以用Windows自带的记事本打开,就可以选用字符流,如果对文件类型不了解的话,就用字节流。 IO流基类概述:

m0_50928133的博客 228

JavaSE——Day20——IO流之字节流

IO流概述及其分类、 概述 IO流:用于处理设备之间的数据传输。 Java对数据的操作都是通过流的方式。 Java用于操作流的对象都在IO包中。 分类 按照数据流向分类 输入流:读入数据 输出流:写出数据 按照数据类型分类 字节流:可以读写任何类型的文件,比如音频,视频,文本文件,可执行文件等。 字符流:只能读写文本文件 ...

晃在云淡风轻 309

Java IO详解

作者:一面千人来源:cnblogs.com/EvswardJava I/O流是一组有顺序的,有起点和终点的字节集合。是对设备文件间数据传输的总称和抽象。在IO中涉及的设备文件包括文件、控制台、网络链接等,这其中又根据流的方向可以将两端的设备文件分为数据源对象和接收端对象数据源对象:有能力产出数据接收端对象:有能力接收数据而IO流实际上屏蔽了在实际设备中的处理数据的细节,这...

6722

java io目录_java io系列01之 "目录"

java io 系列目录如下:前言关于java的io部分,以前学习过。当时学习的节奏是,首先了解io的相关介绍,再查看io的使用示例,最后才是打开API参考文档并参考文档通过写demo来学习。结果,当时是了解了API的使用方法;可是一段时间之后,只能零零碎碎的记得一些片段,再要自己讲出个所以然来,已经非常之艰难。之所以造成这种困境,我想主要是:一,学习的时候,理解的不够彻底,没有真正理解它的思想和...

weixin_39725365的博客 105

JAVA IO流详解

File File是java.io包下的类,代表与平台无关的文件和目录 File能创建,删除,重命名文件和目录,也能检测,访问文件和目录本身 File不能访问文件中的内容,如果要访问内容,则需要使用输入,输出流 过滤文件 File类的listFiles()方法可以接受一个参数,用于在列举文件时对其进行过滤; File类会依次将文件传给过滤器,当过滤器返回true时,File类才会列举该文件; public static void main(String[] args) { F

weixin_51455343的博客 250

java中的字符流、字节流、缓冲流

package LyfPractice; import org.junit.Test; import java.io.*; import java.text.SimpleDateFormat; import java.util.Scanner; /** * Created by fangjiejie on 2016/12/6. */ //硬盘对内存 public class File {

StubbornAccepted的博客 914

java 文件流负1变成255_Java IO流(第三讲):字节流中的FileInputStream与FileoutputStream...

一.概念FileInputStream和FileOutputStream 是一对继承与InputStream和OutputStream的类,用于本地文件读写,按二进制格式读写并且顺序读写,读和写的文件流要区分开,即分别创建不同文件流对象。二.记住in和out死记硬背型:不管你从磁盘读,从网络读,或者从键盘读,读到内存,就是InputStream。不管你写入磁盘,写入网络,或者写到屏幕,都是Oupu...

weixin_35057850的博客 383
上一篇: 【Java文件流】管理文件和文件夹:File类
下一篇: 【Java文件流】为什么要诞生“字符流”,字节流不是更胜任二进制数据的处理吗?
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值