J2ME 之 RMS

J2ME RMS编程基础教程及实战应用 本文还有配套的精品资源,点击获取 简介:J2ME的RMS编程是一项关键技能,涉及在资源有限的移动设备上通过Record Management System进行数据存储。RMS功能类似于小型数据库,支持数据的本地存储与管理。本教程涵盖了RMS的基本概念、操作方法以及事务处理,并提供了实际的应用场景演示。学习RMS编程能够帮助开发者创建适应多种环境、更加健壮的移动应用。 ... 阅读详情
持久数据和记录管理系统( Record Management System,简称 RMS)

  我在前面的文章中曾经提到过, MIDP提供在移动设备上存储持久数据的支持,并且 MID简表还特意规定兼容的移动设备必须提供至少 8KB的非动态内存用于数据存储的用途,时式上,大多数的 MIDP Java设备提供的空间比这要求多得多。这就允许一个midlet充份利用应用程序的持久数据。对于有 Java 2标准版开发经验的开发者,应该注意这种数据存储能力与标准的 Java有区别。J2ME记录管理系统 ( RMS )允许数据流被储存并且在一个记录基础上访问数据。由应用程序开发者把每个记录解析到字段水平。RMS程序包内部的接口支持一个应用程序定义的基础上的比较与检索功能。

  一、javax.microedition.rms程序包

  通过 javax.microedition.rms包访问 J2ME记录管理系统,这个包包括一个类, RecordStore,和好几个有用的接口 (在下列表格中描述 ):

接口描述
RecordComparator一个接口,定义一个比较机制,比较两个记录(以一个实现定义的方式)看它们是否匹配或它们的相对排序次序是什么样的。
RecordEnumeration一个接口,一个双向的纪录模拟器
RecordFilter一个接口,定义了一个过滤器用于检查一个记录,看其是否匹配 (基于一种应用程序定义的标准 )。
RecordListener一个监听者接口,从一个记录存储器中接受记录更改/添加/删除事件。

  这些接口对于实现自定义搜索和检索功能很有用,这些接口中使用的最多的就是 RecordEnumeration。这个接口从 RecordStore.enumerateRecords()方法调用中返回并且被用于遍历一组从记录存储器中返回的记录。它包含 nextRecord()、 previousRecord()、 numRecords()和 hasNextElement()等方法。

  二、使用RecordStore类访问记录存储

  RecordStore类是开发者开发基层 RMS的接口,记录储存是在一个平台--midlet环境依赖的方式--上创建的。信息的实际的位置和存储细节应用程序开发者其实并不知道,记录存储可以使用一种简单的命名规则来访问:名称最多可以到32个Unicode字符长度,区分大小写和必须在一个 midlet套件内唯一。在一个 midlet套件内的所有 midlet都有读/写一个记录存储的权限,只要它们知道正确的名称。一旦这个 midlet套件被从该设备上删除,所有与这个套件关联的记录存储也将被删除。

  比如说,为了打开一个名为 TestRecordSet的记录存储,你可以调用 RecordStore.openRecordStore()方法。这个方法使用两个参数:一个字符串,表示记录存储的名称;一个布尔值,如果为真的话,就会在纪录存储不存在时创建一个。我们使下列方法调用创建新的 TestRecordSet记录存储:

RecordStore rs = null;
rs = RecordStore.openRecordStore("TestRecordSet", true);

  记录存储被创建好后,我们可以通过调用 RecordStore.addRecord()方法来向这个记录存储添加数据。addRecord()接受三个参数:

参数描述
byte[] data一个储存在记录中的字节数据数组,通过 java.io.ByteArrayOutputStream和 java.io.DataOutputStream类把数据添加到这个字节数组。
int offset进入这个记录第一个关联字节数据缓冲区的索引。
int numBytes用于记录的数据缓冲区的字节数

  一旦成功完成 addRecord()调用 ,这个方法就返回一个整数指定这个记录在记录存储中的标识号。 RecordStore还规定另外一个数据编辑方法,包括 setRecord()和 deleteRecord(),但是我在例子中不会使用它们。
  三、构建一个用于J2ME设备的通讯录

  这个例子构造一个基本的通讯录应用程序,使用它用户就可以从一个移动设备上查看联络资料。现在我只介绍从本地设备中存储的数据中读出相关的联络资料,在本文稍后的部分,你将看到如何使用J2ME网络功能从一个 Web服务器取回数据文件!用户将能查看一个地址列表和从这个列表选择一个地址。为了实现这个目标,我们要创建两个类,从用户界面逻辑中把数据存取逻辑分开的: AddressDB类封装所有的 RMS代码; AddressBookMIDLet类封装 GUI代码。AddressDB类的代码如下:

import javax.microedition.rms.*;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
public class AddressDB {
private static RecordStore rs = null;
public AddressDB() {
try {
rs = RecordStore.openRecordStore("addressbook", true);
}
catch (RecordStoreException e) {
System.out.println(e);
e.printStackTrace();
}
}
public void addAddress(String Name, String Address) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
DataOutputStream output = new DataOutputStream(os);
try {
output.writeUTF(Name + "," + Address);
}
catch (IOException e) {
System.out.println(e);
e.printStackTrace();
}
byte[] b = os.toByteArray();
try {
rs.addRecord(b, 0, b.length);
}
catch (RecordStoreException e) {
System.out.println(e);
e.printStackTrace();
}
}
public static String getName(int index) {
int counter = 1;
int commalocation = 0;
String name = null;
try {
RecordEnumeration enumRec =
rs.enumerateRecords(null, null, false);
while ((counter <= index) && (enumRec.hasNextElement())) {
String strTemp = new String(enumRec.nextRecord());
commalocation = strTemp.indexOf(',');
name = strTemp.substring(2, commalocation);
counter++;
}
}
catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
return name;
}
public static String getAddress(int index) {
int counter = 1;
int commalocation = 0;
String address = null;
try {
RecordEnumeration enumRec =
rs.enumerateRecords(null, null, false);
while ((counter <= index) && (enumRec.hasNextElement())) {
String strTemp = new String(enumRec.nextRecord());
commalocation = strTemp.indexOf(',');
address = strTemp.substring(commalocation + 1);
counter++;
}
}
catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
return address;
}
public static int recordCount() {
int count = 0;
try {
count = rs.getNumRecords();
}
catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
return count;
}
}


  AddressDB类包含好几个 public访问方法,它们都对来自外部调用者的访问隐藏记录存储的细节。AddressDB()构造程序调用 RecordStore.openRecordStore(),正如前面讨论的那样。我也创建了四个助手方法用于访问基层记录存储: recordCount()、 getAddress()、 getName()和 addAddress()。注意,在本例子中addAddress()方法只是在 name/address字段之间放了一个逗号。同样地, getAddress()和getName()从记录存储中取回 name/address字段。
  AddressBookMIDLet类(见下)包含一个 AddressDB对象,一个 List GUI组件和一个 Back命令和 Exit命令。我们将使用 AddressDB类中的 addAddress()方法,把地址添加到数据库中。在 startApp()方法中,使用调用 List.append()和 AddressDB.addAddress()方法来填充 List。这是在 commandAction()内部完成的,其结果就是创建一个新的文本框并且添加显示出来。因为 cmdBack命令对象是使用 Command.BACK变量创建的,当又一个元素被添加显示时,环境知道显示一个 Back命令按钮。然后通过把显示焦点设置回 mnuMain列表对象,处理 “back”命令事件。

import javax.microedition.midlet.*;import javax.microedition.lcdui.*;
 public class AddressBookMIDLet extends MIDlet implementsCommandListener {
Display display = null;
List mnuMain = null;
TextBox txtAddress = null;
static final Command cmdBack = new Command("Back", Command.BACK,0);
static final Command cmdExit = new Command("Exit", Command.STOP,3);
AddressDB dbAddress = null;
public AddressBookMIDLet()
{
dbAddress = new AddressDB();
file://杜撰的地址
dbAddress.addAddress("Bill Gates", "123 Elm Street");
dbAddress.addAddress("George Bush", "742 Avenue B");
dbAddress.addAddress("Yuki Aka", "853 Franklin Avenue");
dbAddress.addAddress("Oba Muchow", "101 Scenic Highway");
dbAddress.addAddress("Bill Clinton", "741 Highway 101");
}
public void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
mnuMain = new List("Addresses", Choice.IMPLICIT);
int count = dbAddress.recordCount();
for (int i=0; i < count; i++) {
mnuMain.append(dbAddress.getName(i+1), null);
}
mnuMain.addCommand(cmdExit);
mnuMain.setCommandListener(this);
display.setCurrent(mnuMain);
}
public void pauseApp() {
display = null;
}
public void destroyApp(boolean unconditional) {
notifyDestroyed();
}
public void commandAction(Command c, Displayable d) {
String str = c.getLabel();
if (str.equals("Exit")) {
destroyApp(true);
}
else if (str.equals("Back")) {
display.setCurrent(mnuMain);
}
else {
List select = (List)display.getCurrent();
String txtSelect =
AddressDB.getName(select.getSelectedIndex() + 1) + ", " +
dbAddress.getAddress(select.getSelectedIndex() + 1);
txtAddress = new TextBox("Address", txtSelect, 255,
TextField.ANY);
txtAddress.addCommand(cmdBack);
txtAddress.setCommandListener(this);
display.setCurrent(txtAddress);
}
}
}


  四、本节小结

  在本例子中,我示范如何使用 J2ME记录管理系统(RMS)构造一个基本的通讯录应用程序,支持局部数据存储的能力是 J2ME与其他无线技术比如 WML/WMLScript的不同之处,当然,要使来自移动设备的数据与一个企业数据库同步需要附加的网络和输入/输出性能,下面我想谈谈J2ME网络功能。

  J2ME网络程序设计

  前面我介绍了通过记录管理系统 ( RMS )开发本地设备数据存储,J2ME另外一个很重要的特性就是使用 J2ME连接结构打开网络连接并传送数据的能力。javax.microedition.io包内的这个结构包括 Connection类和好几个很有用的接口 (包括 StreamConnection、 ContentConnection和 HTTPConnection )。本文讨论这个包的设计并使用 StreamConnection和 ContentConnection接口增强前面介绍的 AddressBookMIDLet例子的功能。

  一、javax.microedition.io程序包

  如果你有使用 J2SE java.net包开发程序的经验,你就会知道它使用的非常广泛并且提供一些非常高级的网络性能。遗憾的是,由于设备内存的大小,这些高级特性就不适合有限连接设备配置 CLDC。作为弥补,我们有一个简化的但是功能完全的连接结构,允许传送数据的简单的连接。MID简表有进了一步,它还定义了一个 HTTPConnection接口,用于网络上的 HTTP访问。

  二、修改AddressBookMIDLet

  本节中的例程与上一节中记录管理系统 AddressBook例程几乎一样,上一节的例子使用的是本地的数据文件,而现在我要介绍的例子使用 J2ME网络功能从一个储存在互联网上的文本文件中取回地址。这个文本文件名为 addressbook.txt,文件中的姓名与地址使用逗号分隔。我前面曾提到,下列例子使用两个不同的 J2ME接口来执行传送数据: StreamConnection和 ContentConnection。

  三、使用StreamConnection存取数据

  StreamConnection接口定义了一个流连接必须有的最小的功能。现在我们对AddressBookMIDLet应用程序做出修改:

  删除 AddressBookMIDLet()构造程序中的 dbAddress.addAddress()方法调用,这个方法调用可以删除,因为新的程序没有必要自己动手向数据库中添加数据,新的程序将使用 J2ME的网络功能取回储存在网上的地址。

  把特定的连接代码添加到 AddressDB构造程序中。这两个例子中的特定连接代码只是简单地通过 TCP/IP取回地址并手动地把每个地址添加到通讯簿中。

StreamConnection connStream = null;InputStream inStream = null;
byte[] b = new byte[255];
String address, name;
int commalocation = 0;
try {
connStream = (StreamConnection)
Connector.open("http://localhost/addressbook.txt");
inStream = connStream.openInputStream();
int count = inStream.read(b);
address = new String(b);
address = address.trim();
StringTokenizer st = new StringTokenizer(address, "");
while (st.hasMoreTokens()) {
address = st.nextToken();
commalocation = address.indexOf(',');
name = address.substring(0, commalocation);
address = address.substring(commalocation + 1);
addAddress(name, address);
}
}
catch (IOException e) {
System.out.println(e);
e.printStackTrace();
}


  上面的代码能够工作,但是有点小问题。必须限定字节数组长度为255,因为 StreamConnection接口不能估计下载数据的大小。为此,我可以利用 ContentConnection接口以及很好使用的getLength()方法。

  另外一个问题就是 J2ME中缺少 J2SE的 java.util.StringTokenizer类。虽然可以自己写字符串分析器类,但是也可以从网上找到StringTokenizer类。
  四、使用ContentConnection存取数据

  ContentConnection接口与StreamConnection接口作用差不多,但是它提供了更多有用的方法。ContentConnection接口与 StreamConnection接口作用差不多,但是它提供了更多有用的方法。其中有一个非常有用的方法 getLength(),它返回内容的长度,为了使用这个方法,需要声明一个 ContentConnection变量:

ContentConnection connStream = null;

  我将把字节数组移进 try{}子句中,并改变另外三项:

  1. 把 Connector.open()方法的输出结果强制转化成一个 ContentConnection。

  2. 取得 ContentConnection后,调用 c.getLength()来取回这个数据的长度。

  3. 一旦取得内容的长度,就可以使用这个长度动态地创建一个字节数组。

  除此之外,其他的部分与原来的程序相同。

ConnStream = (ContentConnection)
Connector.open("http://localhost/addressbook.txt");
int len = (int)connStream.getLength();
byte[] b = new byte[len];

  五、本节小结

  在 MID简表中包含网络功能是有前瞻性的,使 J2ME成为未来无线电应用开发的领导。这个功能将是人工智能技术的基础,使J2ME成为未来技术的基石 (例如,你可以使用 HTTPConnection接口和 XML分析器构造一个 WML浏览器)。事实上,象 kXML这样的 XML分析器将允许 J2ME客户端支持 SOAP、 XML-RPC和其他基于 XML的分布技术 
javax.microedition.jar 文件结构 javax/microedition/io/ javax/microedition/lcdui/ javax/microedition/midlet/ javax/microedition/rms/ 立即下载

相关推荐

【AI实战派】从零部署YOLOv8:香橙派AIpro边缘端目标检测全流程解析

本文详细解析了在香橙派AIpro边缘设备上从零部署YOLOv8目标检测模型的全流程。内容涵盖硬件开箱、环境搭建、模型转换(ONNX到昇腾OM格式)以及编写Python推理脚本,并提供了性能优化与实战技巧,帮助开发者高效实现实时边缘AI应用。

weixin_29183637的博客 330

基于j2me的个人通讯录

//=====================MessageMIDlet主类===============================package messagemidlet;//主类import javax.microedition.midlet.*;import javax.microedition.lcdui.*;public class MessageMIDlet

simplemaster的专栏 865

tmux + Claude Code 远程开发指南:从 WSL 配置到断线无忧

远程开发中,SSH 连接中断常导致后台任务丢失,这是困扰开发者的经典难题。tmux 作为终端复用器,通过将进程挂在常驻会话中,使其脱离 SSH 连接独立运行,从根本上解决了断线导致的任务终止问题。Claude Code 等 AI 编程代理需要长时间运行并保持交互上下文,恰好依赖这种会话持久化能力。结合 Windows Subsystem for Linux 提供类 Unix 环境,开发者可在 Windows 上实现稳定的远程开发工作流。本文将完整介绍从 WSL 环境配置、tmux 会话管理,到与 Claud

weixin_30423065的博客 348

深入理解MIDP的界面类体系

深入理解MIDP的界面类体系作者:陈跃峰Email:cqucyf@gmail.com        因为在MIDP手机编程中,没有控制台的概念,所以所有的MIDP手机软件都必须有自己的界面,下面就熟悉一下MIDP的界面类体系。       首先说明的是,MIDP的标准界面类都位于javax.microedition.lcdui包中,使用时一定要记得引入。       在界面体系中,所以可以直接显示

爪哇米工作室陈跃峰的移动开发博客 4102

硬盘dma读写过程

保护模式中,pci上的硬盘dma读写方法

481

YOLOv11改进策略【Neck】| PRCV 2023,SBA(Selective Boundary Aggregation):特征融合模块,描绘物体轮廓重新校准物体位置,解决边界模糊问题

SBA 模块在医疗图像分割中具有重要作用,其设计出发点是解决图像中物体边界模糊以及融合特征时的冗余和不一致问题。

Limiiiing的博客 1943

Java 2 Micro Edition[J2ME]

<!--google_ad_client = "pub-7058131363132249";/* 468x15, 创建于 08-6-3 */google_ad_slot = "4187223796";google_ad_width = 468;google_ad_height = 15;//--> <script type="text/javascript"src=

Tisty的兵工厂--新Blog:http://www.UbuntuSky.cn 1980

华为OD机考双机位A卷 - 开心消消乐(Java & Python& JS & C/C++ & GO )

华为OD机考双机位A卷 - 开心消消乐(OD上机考试双机位A卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1268

轻量级用户界面工具包(LWUIT)简介

 一般来说,Java ME 让我们能够编写可在支持该平台的众多小型设备中移植的应用程序。虽然基本功能在所有受支持的设备上表现良好,但用户界面仍然是困扰开发者的一个常见问题。由于 javax.microedition.lcdui (Java ME 中的主要用户界面 API)的本地实现在不同设备上差异非常大,因此我们无法保证应用程序拥有设备无关和统一的界面外观。不统一的

Lightweight User Interface Toolkit 1266

金属表面粗糙度对信号的影响

之前的文章中,已经采用CST中的微带线模块进行了很多的仿真分析,本文将再次利用这些模块,从另外一个角度去探讨关于传输线的使用问题--金属的表面粗糙度。 众所周知,数据传输中,当速率越来越高时,信号在金属介质中的趋肤效应就愈发明显,能量就会更多地集中于金属的表面进行流动,此时,如果金属表面不再光滑而是凹凸不平,能量的传输过程就会产生波动,当这种波动积累到一定的量级,就会严重影响到传输线的阻抗稳定性,从而导致信号失真和传输异常。

一只豌豆象的博客 2895

Python 神经计算实训 实训答案分享

【代码】Python 神经计算实训 实训答案分享。

2403_89314916的博客 351

J2ME中RMS的使用解析

     在J2ME中,RMS作为唯一的永久性存储工具,其重要性是不言而喻的。但是很多刚刚开始学习J2ME的新人总是抱怨在这方面的资料很少,或者是针对性不强。因此,我想把自己在这方面的一些学习心得和大家交流一下。    RMS即Record Manager System,在手机应用中常常作为得分记录、游戏信息存储等的工具使用。    RMS的使用可以分为两个部分:一、单一记录的构造;二、Recor

cuilichen的专栏 2456

手把手教你玩转RISC-V指令集​​​专栏--​​1.2 对比x86/ARM:RISC-V的三大核心优势(开放、灵活、可扩展)​

​:RISC-V以“开放打破垄断、灵活适配场景、扩展定义未来”的三大优势,正在重塑计算架构格局。其核心价值不仅是技术革新,更是对全球半导体产业链话语权的重新分配。

amy_mhd的博客 130

J2ME RMS的学习笔记 (转载)

RMS,全称Record Management System,是J2ME应用程序进行持久性存储的唯一途径。在手机应用中常常作为得分记录、游戏信息存储等的工具使用。通过两篇文章的学习,我大致掌握了RMS的开发。第一篇文章《RMS概念解析与使用指南》从一些Q&A中介绍了RMS所涉及的基本概念,然后结合数据库的概念介绍了javax.microedition.rms包里面的四个接口、一个类、五个异常(文中

ghfseawindy的专栏 3914

数学建模模型总结

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

J2me中RMS用法

<br />   RMS(Record Management System)是MIDP中一个非常重要的子系统,因为它是J2ME应用程序进行持久性存储的唯一途径。当然你的系统如果支持JSR75的话,那么你可以使用FileConnection来对文件进行操作,那超出了本文的讨论范围。持久性存储在我们编写应用程序的时候经常要用到,比如纪录游戏的排行榜、记录用户输入的用户名和密码等。本文将主要从RMS的基本概念和使用指南方面进行介绍,目的在于给读者进行一定的指导。<br />    RMS是首先在MIDP1.0中提

Delion 4014

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

J2ME中RMS高效存取

<br />前言    ——如果想直接看技术这段可以忽略<br />    对于初学J2ME的人来说,如果去市面上挑上几本所谓的教程来学的话还不如奉劝他直接学J2ME的API文档。人家的教程也无非把API翻译了一遍。所以对于J2ME开发人员来说技术上看上去根本没什么含金量。就那么几个类几个函数调来调去的。    呵呵,痛苦的事情也在这里,目前对于大部分支持JAVA程序的手机来说他们提供JAVA虚拟机可用的内存相当的少一般的也就在2MB的样子,内存无疑是检验程序是否给力的一个标准。    前段时间做手机JAV

JasonChan2008的专栏 719

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

J2ME的RMS

      在JAVAME中,程序的数据保存的地方,无外乎两种,一种是把数据保存在RMS里面,这是所有的JAVAME的手机都支持的,还有一种就是把数据保存在手机的文件系统里面,这个不是所有手机都能支持的,只有支持JSR075的手机,才支持把数据保存在文件系统里面,并且如果你的程序没有经过签名的话,你每次保存或者读取,手机都会弹出恼人的提示,是否允许程序访问文件系统。所在我一般都是把数据存在RMS里...

babala_234的专栏 236

J2ME 的 RMS 使用一例:BookStore

本例通过一个简单的图书记录来演示在J2ME环境下如何使用RMS来做记录的存取 BookStore.java  package ora.ch6; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java

lizhengduan的专栏 586

J2ME 程序中RMS的一些问题

工作搞个J2ME程序,测试时候发现RMS数据只能在程序运行时保存,并没有真正生成.db文件。解决方法,在开始菜单Sun JAVA Wireless Toolkit 2.5.1 for CLDC栏中运行Preferences,跳出偏好框,在里面的存储栏的存储根目录填写./DefaultColorPhone (因为默认的相对路径是C:/WTK2.5.1/appdb)问题解决了 另外,R

Stone的专栏 1983

利用J2ME里的RMS对记录进行排序

        偶然在网上看到有人问:如何利用RMS对其内的积分进行排序。恰巧最近在总结、沉淀一些工作中的积累,于是就有了这篇文章。         J2ME里RMS对记录进行排序的方法,是借鉴了J2SE里的colletcion框架的处理方法而来的。        我们知道如果Collection框架中的实现类要对其内的Object元素进行排序,要调用Sort()方法,但是其内的Objec

大道至简 1688

【J2ME】保存数据--操作RMS

J2ME保存数据有一些蛋筒,这货不是数据库! 以下是我写的工具类: import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOExcepti

Oo8_8oO 864

j2me RMS读取

j2me RMS读取2010年05月24日 星期一 14:25在实现RMS的读写前,首先要注意RMS对汉字不兼容,为了解决这个这个首要问题,首先要编写以下两个成员函数: public byte[] StringtoBytes(String Str) { // 写成字节    byte[] STB = null;    try {        ByteArrayOutputStream baos...

eyesye 220
上一篇: 转贴:玩转WM5.0注册表,实现神奇功能(经典之经典)
下一篇: JAVA数据类型强制转换
evening424
博客等级 码龄20年 4粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值