面试系列 - java输入出入流和文件上传下载详细讲解

使用 Java 实现文件下载的全面指南 Java 提供了多种方式来实现 HTTP 文件下载,例如使用 HttpURLConnection 或第三方库(如 Apache HttpClient)。在 Java 中实现文件下载是一个常见的需求,尤其是在开发 Web 应用程序时。本文将详细介绍如何使用 Java 实现文件下载功能,涵盖从本地文件系统下载文件以及通过 HTTP 下载文件的两种场景。如果文件存储在本地文件系统中,可以通过 Java 的 InputStream 和 OutputStream 实现文件下载。 阅读详情

目录

一、输入流和输出流

二、基本的输入输出流

1、读取文件内容

2、写入文件内容

3、关闭流

4、缓冲流

5、字符流

6、数据流

三、java 上传和下载文件详解

1、文件上传

2、配置文件上传解析器

3、 编写文件上传的控制器

4、 配置上传文件的表单

1、文件下载

2、编写文件下载的控制器

3、 配置文件下载的链接


Java 的输入输出流(I/O)是处理输入和输出数据的重要方式,用于与文件、网络、控制台等交互。Java 提供了丰富的 I/O 类库,支持不同类型的数据操作。以下是关于 Java 输入输出流的详细讲解:

一、输入流和输出流

在 Java 中,I/O 流主要分为两种类型:输入流(Input Stream)和输出流(Output Stream)。

  • 输入流(Input Stream): 输入流用于从外部数据源(如文件、网络、键盘等)读取数据到 Java 程序中。InputStream 和 Reader 是常见的输入流类。

  • 输出流(Output Stream): 输出流用于将数据从 Java 程序写入到外部数据源中。OutputStream 和 Writer 是常见的输出流类。

二、基本的输入输出流

以下是一些常见的基本输入输出流类:

  • FileInputStream 和 FileOutputStream: 用于读写文件的二进制数据。
  • FileReader 和 FileWriter: 用于读写文件的字符数据。
  • BufferedInputStream 和 BufferedOutputStream: 提供了缓冲功能,提高了读写文件的性能。
  • BufferedReader 和 BufferedWriter: 提供了字符缓冲功能。
  • DataInputStream 和 DataOutputStream: 用于读写基本数据类型(如整数、浮点数)的二进制数据。
1、读取文件内容

以下是一个示例,演示如何使用 FileInputStream 来读取文件的内容:

import java.io.FileInputStream;
import java.io.IOException;

public class ReadFileExample {
    public static void main(String[] args) {
        try (FileInputStream inputStream = new FileInputStream("example.txt")) {
            int data;
            while ((data = inputStream.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个示例打开名为 "example.txt" 的文件,使用 FileInputStream 逐字节读取文件内容,并将其输出到控制台。

2、写入文件内容

以下是一个示例,演示如何使用 FileOutputStream 来写入文件内容:

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

public class WriteFileExample {
    public static void main(String[] args) {
        try (FileOutputStream outputStream = new FileOutputStream("output.txt")) {
            String content = "Hello, World!";
            byte[] bytes = content.getBytes();
            outputStream.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个示例创建一个名为 "output.txt" 的文件,使用 FileOutputStream 将字符串 "Hello, World!" 写入文件。

3、关闭流

在使用输入输出流时,要确保及时关闭流以释放资源。可以使用 Java 7 引入的 try-with-resources 语句来自动关闭流,如上述示例所示。

try (FileInputStream inputStream = new FileInputStream("example.txt")) {
    // 读取文件内容
} catch (IOException e) {
    e.printStackTrace();
}
4、缓冲流

缓冲流(如 BufferedInputStream 和 BufferedOutputStream)可以提高 I/O 操作的性能,因为它们会在内存中维护一个缓冲区,减少了单独读写的次数。这通常用于大文件或网络通信中。

try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("example.txt"))) {
    // 使用缓冲流读取文件内容
} catch (IOException e) {
    e.printStackTrace();
}
5、字符流

对于文本数据,你可以使用字符流(如 FileReader 和 FileWriter)来进行读写,字符流会自动处理字符编码。

try (FileReader reader = new FileReader("example.txt")) {
    // 使用字符流读取文本文件内容
} catch (IOException e) {
    e.printStackTrace();
}
6、数据流

DataInputStream 和 DataOutputStream 允许你以二进制形式读写基本数据类型,如整数、浮点数、布尔值等。

try (DataOutputStream outputStream = new DataOutputStream(new FileOutputStream("data.dat"))) {
    outputStream.writeInt(42); // 写入整数
    outputStream.writeDouble(3.14); // 写入浮点数
} catch (IOException e) {
    e.printStackTrace();
}

三、java 上传和下载文件详解

Java 中文件上传和下载通常涉及与Web应用程序的交互,涉及到处理HTTP请求和响应。以下是文件上传和下载的详细解释,包括基本概念和示例:

1、文件上传

Spring: Spring 提供了 MultipartFile 接口和 MultipartResolver 来处理文件上传。你可以使用 @RequestParam 注解来处理文件上传。

确保Spring MVC 项目已经正确配置,并且具备处理文件上传的依赖,比如 Apache Commons FileUpload。

2、配置文件上传解析器

在 Spring 配置文件(通常是 spring-servlet.xml)中配置文件上传解析器 CommonsMultipartResolver。确保它能够识别 multipart/form-data 类型的请求。

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="52428800" /> <!-- 上传文件最大大小,这里设置为 50MB -->
</bean>
3、 编写文件上传的控制器
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

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

@Controller
public class FileUploadController {

    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {
        if (!file.isEmpty()) {
            try {
                String uploadDir = "uploads/";
                File uploadPath = new File(uploadDir);

                if (!uploadPath.exists()) {
                    uploadPath.mkdirs();
                }

                String fileName = file.getOriginalFilename();
                File dest = new File(uploadPath.getAbsolutePath() + File.separator + fileName);
                file.transferTo(dest);

                redirectAttributes.addFlashAttribute("message", "上传成功:" + fileName);
            } catch (IOException e) {
                redirectAttributes.addFlashAttribute("message", "上传失败:" + e.getMessage());
            }
        } else {
            redirectAttributes.addFlashAttribute("message", "上传失败:文件为空");
        }

        return "redirect:/";
    }
}

上述控制器 handleFileUpload 方法接受一个 MultipartFile 类型的文件参数,将上传的文件保存到指定目录中。

4、 配置上传文件的表单

创建一个表单用于上传文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file">
        <input type="submit" value="上传文件">
    </form>

    <!-- 显示上传结果 -->
    <p th:text="${message}"></p>
</body>
</html>
1、文件下载

对于文件下载,可以使用 ResponseEntity 来构建响应,将文件内容发送给客户端浏览器。

2、编写文件下载的控制器
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

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

@Controller
public class FileDownloadController {

    @GetMapping("/download/{fileName:.+}")
    public ResponseEntity<FileSystemResource> downloadFile(@PathVariable("fileName") String fileName) {
        String filePath = "uploads/";
        File file = new File(filePath + fileName);

        if (file.exists()) {
            HttpHeaders headers = new HttpHeaders();
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);
            headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);

            try {
                FileSystemResource resource = new FileSystemResource(file);
                return ResponseEntity.ok()
                        .headers(headers)
                        .contentLength(resource.contentLength())
                        .contentType(MediaType.APPLICATION_OCTET_STREAM)
                        .body(resource);
            } catch (IOException e) {
                return ResponseEntity.badRequest().body(null);
            }
        } else {
            return ResponseEntity.notFound().body(null);
        }
    }
}

上述控制器 downloadFile 方法根据文件名构建响应,设置响应头以及文件内容,然后将文件发送给客户端。

3、 配置文件下载的链接

在视图页面中,创建一个链接,允许用户下载文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
    <a href="/download/example.txt">下载文件</a>
</body>
</html>

这个链接指向了 /download/{fileName} 路径,允许用户点击链接下载指定文件。

以上是使用 Spring MVC 实现文件上传和下载的简单示例。

Java中的文件输入输出操作如何实现 BufferedWriter类是Java中非常有用的一个类,它可以用于写入字符流到文件中,并且可以自动缓存输出数据。Java支持多种方式进行文件输入输出操作,包括使用Scanner类、BufferedReader类、InputStream类、PrintWriter类、BufferedWriter类和OutputStream类。在Java中,文件输入输出操作是很常见的,因为它们可以用于读取和写入文件数据。因此,在Java中进行文件输入操作时,可以根据需要选择适合的文件输入方式,以便更好地读取文件中的数据 阅读详情

相关推荐

Java实现文件上传与下载【面试+工作】

Java支付宝接口开发【面试+工作】 最近公司在做支付模块,在接入过程中遇到了很多坑,费了不少事,现在分享一下接入方法,也记录一下,以后可能还用的到。用的是支付宝的即时到帐支付功能和微信的扫码支付功能,相比起来,个人感觉支付宝的文档和接入方式都比微信的容易理解和操作,也不用自己写页面,接入起来比较方便,毕竟是支付起家的,比微信支付少很多坑,下面就分别介绍着两种支付的接入方法。 支付宝支

Java帮帮 5649

java实现文件下载功能

文件下载功能已经成为现代Web应用程序不可或缺的一部分

Java小菜鸟 1万+

java实现文件上传下载,面试总结

前言: 说到算法,相信每一个程序员和接触过程序员的朋友都不会陌生,直到现在算法一直占着面试必问的地位,而算法面试也仍是当前最适合公司筛选程序员的方法之一,在阿里,字节跳动、华为等公司带动下,无论是求职者还是面试官,都逐渐认识到算法面试其实是相对高效、准确且公平的筛选机制**,可能你会觉得算法面试有几个实际工作中用到的,不过是“面试造火箭,工作拧螺丝”**罢了,那我想说你并没有认识到算法面试的真正目的。 说简单点,算法面试就是为了筛选出足够聪明要么足够勤奋的人,在一个算法题中,不仅考察你的沟通能力,你的逻辑思

m0_56835488的博客 479

Java如何实现下载文件的几种方式

Java 文件下载

Boy_Martin的博客 4万+

SpringBoot图文教程4—SpringBoot 实现文件上传下载

有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 大哥大姐新年好,点赞转发不要少 SpringBoot 图文系列教程技术大纲 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+案例 思维导图」「...

Java杂记 1366

Java文件上传与下载,多线程高并发

2)使用类介绍。

2201_75604580的博客 1372

Java IO流常见面试问题

IO流 先要明白一个基础问题: 1.什么是比特(Bit)?什么是字节(Byte)?什么是字符(Char)?以及他们的区别? Bit 位,是计算机最小的二进制单位 ,取0或1,主要用于计算机操作。 Byte 字节,是数据的最小单位,由8位bit组成,取值(-128-127),主要用于计算机操作数据。 Char 字符,是用户可读写的最小单位,由16位bit(2个byte)组成,取值(0-6553...

此处省略三千字 1万+

后台以文件流形式提供Java前端下载

同时,我们还提供了一个示例的前端代码,演示了如何使用Java的URLConnection来下载文件并保存到本地。在Web应用程序开发中,经常需要实现文件下载功能,其中后端通常负责提供文件数据,而前端则通过用户界面触发下载操作。在循环中,我们使用一个缓冲区来读取输入流的数据,并将其写入输出流,直到输入流的末尾。参数,该参数指定要下载的文件名。然后,我们指定文件的保存路径,并将其替换为实际的文件保存路径。在前端中,可以通过发送HTTP请求到该接口,并提供要下载的文件名作为参数,即可触发文件下载操作。

CodeWWWCode的博客 502

Java最新springboot文件上传下载实战 —— 登录功能、展示所有文件,java开发规范面试

金三银四到了,送上一个小福利!本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取@Autowired@Override包下创建金三银四到了,送上一个小福利![外链图片转存中…(img-DbRl17ew-1715413924029)][外链图片转存中…(img-E67RPApf-1715413924030)][外链图片转存中…(img-CwJ7635v-1715413924030)]

2301_79098686的博客 799

高薪程序员&面试题精讲系列23之说一下如何实现文件上传、下载以及断点续传?

一. 面试题及剖析 1. 今日面试题 在上一篇文章中,壹哥 给大家总结了I/O流相关的内容,复习了各种I/O流相关API。其实我们去面试的时候,面试官提问的前后两个题目之间往往会具有一定的关联性。比如今天 壹哥 要给各位讲解的面试题,就与上一篇的内容具有一定的关系,题目如下: 说一下如何实现文件上传和下载? 断点续传有没有了解过? 2. 题目剖析 虽然今天的题目问的是如何实现文件的上传和下载,但实现文件上传下载的核心操作,离不开I/O流的支持,另外我们再结合Web与框架相关知识,就可以很容易

一一哥 1711

高薪程序员&面试题精讲系列22之说说Java的IO流,常用哪些IO流?

一. 面试题及剖析 1. 今日面试题 今天 壹哥 带各位复习一块可能会令初学者比较头疼的内容,起码当时让我很有些头疼的内容,那就是I/O流。为啥I/O流会让很多初学者头疼呢?其实主要是因为I/O流的分类实在是太多了,一会是输入流,一会是输出流,还有字节流、字符流、文件输入流,文件输出流,缓冲流.....乱七八糟一大堆,光是这些英文单词把人背的脑袋都大了。 正因为如此,面试官就喜欢在这里考察我们的Java基础,常见的I/O流题目如下: 说一下Java中的I/O流有哪些? 你常用哪些I/O流? 输入流、

一一哥 3899

springboot文件上传下载实战 ——文件上传、下载、在线打开、删除

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典Java核心知识整理Java核心知识Spring全家桶(实战系列)其他电子书资料Step3:刷题既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。以下是我私藏的面试题库:本文已被。

2401_84006757的博客 1163

保姆级教程:用MATLAB搞定运动模糊图片修复(附完整代码与避坑指南)

本文提供了一份详细的MATLAB运动模糊图片修复教程,涵盖盲复原、图像复原等核心技术。通过傅里叶变换和Radon变换分析模糊参数,对比逆滤波、维纳滤波和Lucy-Richardson算法效果,并附完整代码与避坑指南,帮助用户实现专业级图像处理。

weixin_26765363的博客 230

以流的方式对文件上传下载,并保存指定位置

本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!

2401_84010362的博客 861

手把手教你用Multisim搭建FM直接调频电路(附完整波形分析)

本文通过Multisim仿真软件,手把手教你搭建FM直接调频电路。详细介绍了从核心概念理解、压控振荡器(VCO)参数设置、电路搭建与波形观测,到带通滤波器设计与信号优化的完整流程。通过对比滤波前后的时域波形与频谱分析,帮助读者直观理解频率调制原理,并提供了常见问题的排查思路与参数调试方法,将抽象的通信理论转化为可操作的实践技能。

weixin_29230773的博客 214

Python_构建同花顺问财智能选股API服务

本文详细介绍了如何使用Python构建同花顺问财智能选股API服务,涵盖从环境准备、核心API开发到高级功能扩展的全过程。通过Flask框架和pywencai库,开发者可以快速搭建稳定可靠的选股接口,实现自动化股票筛选与交易系统集成,提升量化投资效率。

weixin_30596343的博客 333

Java实习模拟面试之文件的上传和下载:深入解析Multipart请求与流处理

在现代Spring Boot应用中,文件上传下载的实现更加简洁和高效,主要得益于Spring MVC的强大数据绑定和注解支持。文件上传@RequestParam("description") String description, // 普通参数@RequestParam("uploadFile") MultipartFile file) { // MultipartFile 接收文件return ResponseEntity.badRequest().body("文件不能为空");

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 1168

Altium Designer(AD24/25)导出DXF或DWG结构文件的方法

DXF(Drawing Exchange Format)和DWG(Drawing)是两种常见的CAD(计算机辅助设计)文件格式,常用于结构和硬件之间的沟通。本文介绍Altium Designer(AD24/25)导出DXF或DWG结构文件的方法。

fydar的博客 2333

java开发面试题带答案下载,JavaIO流学习总结

由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,

2401_84010744的博客 966

3. NVIDIA GPU Xid 常见错误码全解析、故障定位与标准化处理方案

摘要: Xid是NVIDIA显卡驱动记录的硬件/软件异常日志,通过dmesg等工具可获取,包含PCI总线、GPU编号、故障码等信息,是诊断显卡问题的核心依据。Xid故障分为四类:应用程序类(如代码错误,Xid13/31)、显存ECC硬件类(如显存损坏,Xid48/63)、链路/供电温控类(如PCIe故障,Xid74/79)和GSP固件类(如静电干扰,Xid119/154)。排查流程包括日志采集、软件修复(如重启进程、升级驱动)、硬件检查(如PCIe链路状态)及断电复位(针对GSP故障)。预防措施包括监控EC

jundao1997的专栏 702

32、机械臂数字孪生模型创建指南

本文介绍了如何在MATLAB Simscape中为一款3自由度(DOF)微型机械臂创建数字孪生模型。内容涵盖硬件参数测量、Simulink模型搭建流程,包括初始条件设置、基座与上部主体构建、上臂结构设计等关键步骤。通过使用Solid、Revolute Joint和Rigid Transform等模块,实现机械臂多体系统建模,并支持后续运动仿真与物理系统的对比诊断。读者可依据指南逐步完成模型构建,相关资源可通过MATLAB File Exchange或指定网站获取。

qsc9012345的博客 215

【IO流、文件操作】-常见面试题

io流1. java中有几种类型的流?jdk为每种类型的流提供了一些抽象类以供继承,请说出他们分别是那些类?2. 字节流有字符流的区别?3. 简单介绍一下io流?4.输入流和输出流?5. IO流的分类?6. 什么叫缓冲区? 有什么作用? 1. java中有几种类型的流?jdk为每种类型的流提供了一些抽象类以供继承,请说出他们分别是那些类? 2. 字节流有字符流的区别? 字节流操作的最基本的单元是...

爬虫小能手,安卓逆向,欢迎砸单 2678

基于Python的FAO农业数据高效爬取与分析实战:从Scrapy到异步爬虫的进阶之路

本文将详细介绍如何使用Python最新技术爬取联合国粮农组织(FAO)的农业数据,涵盖从基础爬虫到高级异步爬虫的完整实现过程。文章包含5000余字的技术解析,提供完整的代码示例,并探讨数据处理与存储的最佳实践。

2201_76125261的博客 241

Java实习模拟面试之对象存储:MinIO实战与文件上传下载深度解析

大文件上传是一个经典难题,直接上传确实会面临内存溢出、网络超时、上传中断难续传等问题。1. 分片上传(Chunked Upload / Multipart Upload)原理:将大文件切分成多个小块(如5MB/块),逐个上传,最后在服务端合并。MinIO支持:MinIO原生支持S3的Multipart Upload API。流程前端将文件分片。调用后端接口初始化上传,获取uploadId。并行上传各个分片,每个分片携带uploadId和分片序号。所有分片上传完成后,调用“合并分片”接口。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 1157

【Claude】Claude Code 子代理(Subagents)完全指南:多 AI 编排与并行任务管理

子代理是在独立上下文窗口特性主代理子代理上下文窗口与你对话的主上下文完全独立的上下文工具权限拥有所有工具可自定义限制生命周期整个会话完成任务后结束通信方式直接对话结果返回给主代理模型继承主会话设置可指定不同模型你可以创建专属子代理,指定模型、工具权限和系统提示。在对话中,Claude 会根据任务自动选择合适的子代理。

博客 5538

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

七、springBoot 简单优雅是实现文件上传和下载

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

2301_82242844的博客 938

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 面试系列 - String字符串使用详解
下一篇: 面试系列 - Java代理模式详解
境里婆娑
境里婆娑 新星创作者: Java技术领域 新星创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 1万+粉丝 300原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值