官网 https://www.qiniu.com/

介绍

七牛云(隶属于上海七牛信息技术有限公司)是国内领先的以视觉智能和数据智能为核心的企业级云计算服务商,同时也是国内知名智能视频云服务商,累计为 70 多万家企业提供服务,覆盖了国内80%网民。围绕富媒体场景推出了对象存储、融合 CDN 加速、容器云、大数据平台、深度学习平台等产品、并提供一站式智能视频云解决方案。为各行业及应用提供可持续发展的智能视频云生态,帮助企业快速上云,创造更广阔的商业价值。
官网:https://www.qiniu.com/
通过七牛云官网介绍我们可以知道其提供了多种服务,我们主要使用的是七牛云提供的对象存储服务来存储图片 文件 视频 … 使用的最多的存储图片。

要使用七牛云的服务,首先需要注册成为会员。 自行注册 然后进行实名认证 大概需要1~3天的时间进行审核 通过的话就可以使用七牛云里的服务了

还有就是在七牛云里操作有的时候会提示你让你输入密码 ,这个密码就是你创建账号时候的密码

配置对象存储库

1.登录账户密码后按照图片进行操作

然后点击左边菜单的空间管理->建新空间

创建时候你会看到公开和私有的选择 公有空间与私有空间的区别,在于下载私有资源,需要带有下载凭证建议公开

别问为什么否则麻烦的是你 真的是绝密的东西还是放入自己本地比较好

进入创建的空间后点击文件管理

注意事项:

可以看到有一个外链域名 我们创建空间时候会赠送一个外链域名用于访问此空间内的文件 但是只有30天 过期了就会收回 如果只是测试那么完全够 如何是长期使用需要添加我们自己的外链域名

添加外链域名:

  1. 进入空间->域名管理->绑定域名

  • 域名类型:选择普通域名即可;
  • 加速域名:填写自己已经备案的二级域名;
  • 通信协议:选择HTTP而HTTPS是收费的;
  • 其它默认

添加加速域名后,七牛云会提供CNAME地址,如下。

如果不小心把这个页面管理我们也可以在域名管理里点击添加的那个域名里查看到

我们需要在域名服务商,也就是域名控制台,添加这一条域名解析记录,把加速域名指向分配的CNAME地址。

我以阿里云为例:

  1. 先进入到阿里云然后登录账户 然后搜索域名控制台

然后点击添加记录

然后我们点击cnd

然后在列表中点击域名管理就能发现我们刚才创建的域名如下图:

如果CNAME是红色x 那么就代表域名解析没成功 你好好检查检查

我们还可以使用windows来检测是否解析成功

windows可以 win+R ,打开运行,输入cmd,输入命令 nslookup 你的加速域名 。 如果地址那里的CNAME值和自己申请的一样,那么就成功了。

手动使用对象存储库

在操作前先把测试外链域名 改为 你上面添加的二级加速域名 然后保存为默认域名

否则等过期了你在其他地方使用测试外链读取图片的地址都将显示失败

上传文件

上传文件很简单,进入空间,文件管理,上传文件即可。 这里就不多说了 傻瓜操作 自己试试就好了

在七牛云里不能创建文件夹

因为:七牛云存储的服务端是一个 key-value 系统,而非树形结构,因此也没有 “目录” 或者 “文件夹” 的概念

使用上传的图片

上传后的图片文件可以复制链接,就可以使用在markdown或者网站中了,并且文件还带有七牛云CDN加速。

使用Java SDK 进行管理

此 SDK 适用于 Java 8 及以上版本。使用此 SDK 构建您的网络应用程序,能让您以非常便捷地方式将数据安全地存储到七牛云上。无论您的网络应用是一个网站程序,还是包括从云端(服务端程序)到终端(手持设备应用)的架构服务或应用,通过七牛云及其 SDK,都能让您应用程序的终端用户高速上传和下载,同时也让您的服务端更加轻盈。

主要用到的几个jar

    <dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.2.11</version><scope>compile</scope></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.3.1</version><scope>compile</scope></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.6.2</version><scope>compile</scope></dependency><dependency><groupId>com.qiniu</groupId><artifactId>happy-dns-java</artifactId><version>0.1.4</version><scope>compile</scope></dependency>

我们下面使用springboot进行演示

创建SevenNiuYun项目 结构如下:

application.yml

spring:servlet:multipart:enabled: true #是否启用http上传处理max-request-size: 100MB #最大请求文件的大小max-file-size: 20MB #设置单个文件最大长度file-size-threshold: 20MB #当文件达到多少时进行磁盘写入

niuyun.properties

#秘钥
AccessKey=Hnwv7e3p2zxmv9Y-68Ti2pMq6a3myr5ursWHXD51
#秘钥
SecretKey=qbGRZLWEnZgs5Q8ZUt2_AvebMNDp3Tz4keb2bVII
#空间名称
Bucket=huqny
#空间地域  华东 华北  华南   如果和存储区域不同那么就会访问失败
Zone=华南
#外链域名  结尾必须带 /
Url=http://qny1.huitoushian.cn/

MessageConstant

package cn.niuyun.utils;/*** 消息常量*/
public class MessageConstant {public static final String PIC_UPLOAD_SUCCESS = "图片上传成功";public static final String PIC_UPLOAD_FAIL = "图片上传失败";public static final String PIC_DELETE_SUCCESS = "图片删除成功";public static final String PIC_DELETE_FAIL = "图片删除失败";public static final String PIC_DOWNLOAD_SUCCESS = "图片下载成功";public static final String PIC_DOWNLOAD_FAIL = "图片下载失败";
}

Result

package cn.niuyun.utils;import java.io.Serializable;/*** 封装返回结果*/
public class Result implements Serializable{private boolean flag;//执行结果,true为执行成功 false为执行失败private String message;//返回结果信息,主要用于页面提示信息private Object data;//返回数据public Result(boolean flag, String message) {super();this.flag = flag;this.message = message;}public Result(boolean flag, String message, Object data) {this.flag = flag;this.message = message;this.data = data;}public boolean isFlag() {return flag;}public void setFlag(boolean flag) {this.flag = flag;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}
}

操作对象存储工具类

QiniuUtils

package cn.niuyun.utils;import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.storage.persistent.FileRecorder;
import com.qiniu.util.Auth;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.ResponseBody;import java.io.*;
import java.nio.file.Paths;
import java.util.Properties;/*** 七牛云工具类*/
public class QiniuUtils {public  static String accessKey;public  static String secretKey ;public  static String bucket ;public  static  Zone zone;public  static  String url;static {Properties properties=new Properties();try {properties.load(QiniuUtils.class.getClassLoader().getResourceAsStream("niuyun.properties"));} catch (IOException e) {e.printStackTrace();}accessKey = properties.getProperty("AccessKey");secretKey = properties.getProperty("SecretKey");bucket= properties.getProperty("Bucket");String zone_=properties.getProperty("Zone");if("华东".equals(zone_)){zone=Zone.zone0();}else if("华北".equals(zone_)){zone=Zone.zone1();}else{zone=Zone.zone2();}url= properties.getProperty("Url");}//上传文件public static void upload2Qiniu(byte[] bytes, String fileName){//构造一个带指定Zone对象的配置类Configuration cfg = new Configuration(zone);//...其他参数参考类注释UploadManager uploadManager = new UploadManager(cfg);//默认不指定key的情况下,以文件内容的hash值作为文件名String key = fileName;Auth auth = Auth.create(accessKey, secretKey);String upToken = auth.uploadToken(bucket);try {Response response = uploadManager.put(bytes, key, upToken);//解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);System.out.println(putRet.hash);} catch (QiniuException ex) {Response r = ex.response;System.err.println(r.toString());try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}}}//断点续传   分片续传public  static  void upload2Qiniu_xu(byte[] bytes, String fileName){Configuration cfg = new Configuration(zone);Auth auth = Auth.create(accessKey, secretKey);String upToken = auth.uploadToken(bucket);//默认不指定key的情况下,以文件内容的hash值作为文件名String key = fileName;//断点续传://获取 window  linx ... 的临时目录String localTempDir = Paths.get(System.getProperty("java.io.tmpdir"), bucket).toString();System.out.println("临时目录:"+localTempDir);try {//设置断点续传文件进度保存目录FileRecorder fileRecorder = new FileRecorder(localTempDir);UploadManager uploadManager = new UploadManager(cfg, fileRecorder);try {Response response = uploadManager.put(bytes, key, upToken);//解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);System.out.println(putRet.hash);} catch (QiniuException ex) {Response r = ex.response;System.err.println(r.toString());try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}}} catch (IOException ex) {ex.printStackTrace();}}//删除文件public static void deleteFileFromQiniu(String fileName){//构造一个带指定Zone对象的配置类Configuration cfg = new Configuration(zone);String key = fileName;Auth auth = Auth.create(accessKey, secretKey);BucketManager bucketManager = new BucketManager(auth, cfg);try {bucketManager.delete(bucket, key);} catch (QiniuException ex) {//如果遇到异常,说明删除失败System.err.println(ex.code());System.err.println(ex.response.toString());}}/*** 获取下载文件路径,即:donwloadUrl* @return*/public static String getDownloadUrl(String targetUrl) {Auth auth = Auth.create(accessKey, secretKey);String downloadUrl = auth.privateDownloadUrl(targetUrl);return downloadUrl;}/*** 下载*/public static void download(String fileName,String filePath ) {//获取downloadUrlString downloadUrl = getDownloadUrl(fileName);download(downloadUrl, filePath,fileName);}/*** 通过发送http get 请求获取文件资源* @param url* @param filepath* @return*/private static void download(String url, String filepath,String fileName) {OkHttpClient client = new OkHttpClient();System.out.println(QiniuUtils.url+url);Request req = new Request.Builder().url(QiniuUtils.url+url).build();okhttp3.Response resp = null;try {resp = client.newCall(req).execute();System.out.println(resp.isSuccessful());if(resp.isSuccessful()) {ResponseBody body = resp.body();InputStream is = body.byteStream();byte[] data = readInputStream(is);File imgFile = new File(filepath + fileName);          //下载到本地的图片命名FileOutputStream fops = new FileOutputStream(imgFile);fops.write(data);fops.close();}} catch (IOException e) {e.printStackTrace();System.out.println("Unexpected code " + resp);}}/*** 读取字节输入流内容* @param is* @return*/private static byte[] readInputStream(InputStream is) {ByteArrayOutputStream writer = new ByteArrayOutputStream();byte[] buff = new byte[1024 * 2];int len = 0;try {while((len = is.read(buff)) != -1) {writer.write(buff, 0, len);}is.close();} catch (IOException e) {e.printStackTrace();}return writer.toByteArray();}}

SetmealController

package cn.niuyun.controller;import cn.niuyun.utils.MessageConstant;
import cn.niuyun.utils.QiniuUtils;
import cn.niuyun.utils.Result;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
@RequestMapping("/setmeal")
public class SetmealController {//   http://localhost:8080/setmeal/upload//文件上传  返回上传的文件名称    配合存储空间内的外链域名/文件名直接就可以访问了@PostMapping("/upload")public Result upload(@RequestParam("imgFile") MultipartFile imgFile){System.out.println(imgFile);String originalFilename = imgFile.getOriginalFilename();String fileName = UUID.randomUUID().toString()+"_"+originalFilename;try {//将文件上传到七牛云服务器QiniuUtils.upload2Qiniu(imgFile.getBytes(),fileName);} catch (IOException e) {e.printStackTrace();return new Result(false, MessageConstant.PIC_UPLOAD_FAIL);}return new Result(true, MessageConstant.PIC_UPLOAD_SUCCESS,fileName);}//   http://localhost:8080/setmeal/uploadx//断点续传之 文件上传  返回上传的文件名称    配合存储空间内的外链域名/文件名直接就可以访问了@PostMapping("/uploadxu")public Result uploadxu(@RequestParam("imgFile") MultipartFile imgFile){System.out.println(imgFile);String originalFilename = imgFile.getOriginalFilename();String fileName = UUID.randomUUID().toString()+"_"+originalFilename;try {//将文件上传到七牛云服务器QiniuUtils.upload2Qiniu_xu(imgFile.getBytes(),fileName);} catch (IOException e) {e.printStackTrace();return new Result(false, MessageConstant.PIC_UPLOAD_FAIL);}return new Result(true, MessageConstant.PIC_UPLOAD_SUCCESS,fileName);}//   http://localhost:8080/setmeal/delete?imgFile=186b7297-f002-447f-8dd4-5c8acd72b597t.jpg//文件删除   返回删除的文件名称@GetMapping("/delete")public Result delete(@RequestParam("imgFile")String imgFile){try {QiniuUtils.deleteFileFromQiniu(imgFile);} catch (Exception e) {e.printStackTrace();return new Result(false, MessageConstant.PIC_DELETE_FAIL);}return new Result(true, MessageConstant.PIC_DELETE_SUCCESS,imgFile);}//文件下载// http://localhost:8080/setmeal/download?imgFile=20771b3b-3595-4560-af26-b289e5c026e4_5-160914192R3.gif@GetMapping("/download")public Result download(@RequestParam("imgFile")String imgFile , HttpServletRequest request){try {//测试阶段  本地保存路径
//            String filePath = "C:\\Users\\12841\\Desktop\\七牛云使用\\test\\";//生成阶段使用String filePath = request.getSession().getServletContext().getRealPath(File.separator)+File.separator+"dounload"+File.separator;File file=new File(filePath);if(!file.exists()){file.mkdirs();}System.out.println("文件下载的地方:"+filePath);QiniuUtils.download(imgFile,filePath);} catch (Exception e) {e.printStackTrace();return new Result(false, MessageConstant.PIC_DOWNLOAD_FAIL);}return new Result(false, MessageConstant.PIC_DOWNLOAD_SUCCESS);}}

Application

package cn.niuyun;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;//没有使用数据库的时候需要添加exclude= {DataSourceAutoConfiguration.class}  否则报错
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class);}
}

使用Postman测试

普通文件上传

Post http://localhost:8080/setmeal/upload

断点续传

占时测试不出来断点的效果 因为上传的速度太快

如果想测试你可以这样

使用大文件10mb的 上传一次看看多少时间

然后在上传一次 在上传过程中把网断了之后从新传一次你看看是不是快了

Post http://localhost:8080/setmeal/uploadxu

文件删除

Get http://localhost:8080/setmeal/delete?imgFile=4b71d770-985b-4403-ba61-22ebb6d92629t.jpg

文件下载

文件下载有两种方式

第一种使用http请求的方式 这种方式适合前台直接点击a标签进行下载 (常用)

如何查找下载的规则你可以进入网页里的空间管理->文件管理

然后随意找一个文件进行下载 (注意不要选择带中文的文件) 然后弹出一个 下载框

将下载链接复制

http://qny1.huitoushian.cn/20771b3b-3595-4560-af26-b289e5c026e4_5-160914192R3.gif?attname=

我们可以发现 下载链接的组成 是由 http://外连接/文件名?attname= 组成

然后你可以在前端生成a标签的时候 将href里的路径拼成这样就行

列:

<a href="http://qny1.huitoushian.cn/20771b3b-3595-4560-af26-b289e5c026e4_5-160914192R3.gif?attname=">下载</a>

第二种下载方式就是前端发送请求 然后我们在后端进行下载到服务器指定文件下 保存路径自己指定 (不常用 有七牛云还用自己的服务器存储干嘛)

Get http://localhost:8080/setmeal/download?imgFile=20771b3b-3595-4560-af26-b289e5c026e4_5-160914192R3.gif

实际项目中的使用

在上面我们以及教会了 怎么操作对象存储库的常用方式 以及使用javaSDK 操作了 那么在项目里怎么使用呢

  1. 上传图片

    需要在上传的时候将图片名称保存到数据库 或者文件里

    这里注意:不同文件要进行规整

    表可以这样设置: 一张类型表 一张文件名表 一条类型表id 对应多条文件名表id 一对多的关系 这样就能进行文件的分类管理了有助于后期的查询删除和下载操作

  2. 显示图片

    查询数据库表里存储的文件名称 然后和外链进行拼接就行,之后放入img标签的 src里就行

  3. 下载图片

    和显示图片一样将从数据库中获取到的文件名进行拼接成下载的连接就行 之后放入a标签的href中就行

  4. 删除图片

    删除图片和显示图片原理一样但是需要使用ajax进行删除 请求的是controller里的接口 拼接对应的参数 不要忘了将数据库对应的数据删除 删除成功之后将前端删除的图片进行隐藏下次刷新的时候就没有了

完成了文件上传,将图片存储在了七牛云服务器中。但是这个过程存在一个问题,就是如果用户只上传了图片而没有最终保存套餐信息到我们的数据库,这时我们上传的图片就变为了垃圾图片。对于这些垃圾图片我们需要定时清理来释放磁盘空间。这就需要我们能够区分出来哪些是垃圾图片,哪些不是垃圾图片。如何实现呢

方案就是利用redis来保存图片名称,具体做法为:
1、当用户上传图片后,将图片名称保存到redis的一个Set集合中,例如集合名称为
setmealPicResources
2、当用户添加套餐后,将图片名称保存到redis的另一个Set集合中,例如集合名称为
setmealPicDbResources
3、计算setmealPicResources集合与setmealPicDbResources集合的差值,

结果就是垃圾图片的名称集合,清理七牛云里这些图片即可 不要忘了将数据库里的对应数据也清除

差值就是双方都没有共同拥有的值 比如 [1,2,3] [1,2,4] 差值就是3 而redis有处理Set集合差值的方法 自行百度查询

什么时间进行清理呢? 我们可以使用 Quartz定时组件 创建定时任务进行清理 不会的自学

下载图片

和显示图片一样将从数据库中获取到的文件名进行拼接成下载的连接就行 之后放入a标签的href中就行

  1. 删除图片

    删除图片和显示图片原理一样但是需要使用ajax进行删除 请求的是controller里的接口 拼接对应的参数 不要忘了将数据库对应的数据删除 删除成功之后将前端删除的图片进行隐藏下次刷新的时候就没有了

完成了文件上传,将图片存储在了七牛云服务器中。但是这个过程存在一个问题,就是如果用户只上传了图片而没有最终保存套餐信息到我们的数据库,这时我们上传的图片就变为了垃圾图片。对于这些垃圾图片我们需要定时清理来释放磁盘空间。这就需要我们能够区分出来哪些是垃圾图片,哪些不是垃圾图片。如何实现呢

方案就是利用redis来保存图片名称,具体做法为:
1、当用户上传图片后,将图片名称保存到redis的一个Set集合中,例如集合名称为setmealPicResources
2、当用户添加套餐后,将图片名称保存到redis的另一个Set集合中,例如集合名称为setmealPicDbResources
3、计算setmealPicResources集合与setmealPicDbResources集合的差值,

结果就是垃圾图片的名称集合,清理七牛云里这些图片即可 不要忘了将数据库里的对应数据也清除

差值就是双方都没有共同拥有的值 比如 [1,2,3] [1,2,4] 差值就是3 而redis有处理Set集合差值的方法 自行百度查询

什么时间进行清理呢? 我们可以使用 Quartz定时组件 创建定时任务进行清理 ,不会的在我博客里找教程或者百度

点赞 -收藏-关注-便于以后复习和收到最新内容 有其他问题在评论区讨论-或者私信我-收到会在第一时间回复 如有侵权,请私信联系我 感谢,配合,希望我的努力对你有帮助^_^

SpringBoot-七牛云对象存储库相关推荐

  1. SpringBoot2.x 集成 七牛云对象存储Kodo

    本文主要对SpringBoot2.x集成七牛云对象存储Kodo进行简单总结,其中SpringBoot使用的2.4.5版本. 一.七牛云对象存储Kodo简介 七牛云对象存储Kodo是七牛云提供的高可靠. ...

  2. WordPress七牛云对象存储免费插件WPQiNiu

    ​​有些站长喜欢使用七牛云来加速 WordPress 站点的访问速度,平时需要手工将需要加速的静态文件或图片上传到七牛云存储空间才行.为了提供效率,boke112 联盟建议大家安装这款 WordPre ...

  3. 一个集成阿里云、腾讯云、七牛云对象存储的SDK

    概述 一个集成阿里云.腾讯云.七牛云对象存储的SDK An SDK integrating Alibaba cloud, Tencent cloud and qiniu cloud object st ...

  4. Java实现将文件(图片)上传到七牛云对象存储,并实现下载和删除功能

    引言:在搭建项目时如果把上传的文件存储在该项目运行的主机上,会导致访问该项目时加载非常缓慢,因此需要对象存储.并且对象存储具有网站数据动静分离,大幅提升网页性能,储存节点多,支持跨地域实时同步,成本低 ...

  5. Wordpress站点使用七牛云对象储存以及CDN加速

    一.新建对象储存空间 首先登录七牛云注册一个账号,并通过实名认证.随后在主页中选择 对象储存,在空间管理中选择新建空间. 设置空间名称以及访问控制. 二.新建域名 选择 CDN,然后选择 域名管理,加 ...

  6. 微信小程序使用七牛云对象存储保存图片和文件

    先给大家看效果图,如下: 一.开通七牛云对象存储服务(免费的) 官网:https://www.qiniu.com/,实名认证后,创建一个空间,用于保存文件 二.获取 AccessKey和SecretK ...

  7. 七牛云对象存储绑定个人域名

    七牛云对象存储绑定个人域名 七牛云介绍 主题说明 过程介绍 登录病创建存储空间 创建完成后 增加域名管理 查看域名解析 chame 域名 去域名管理页面 增加chame解析(我的是阿里云) 七牛云介绍 ...

  8. 使用z-file和七牛云对象存储构建个人网盘

    最近想构建一个个人网盘玩玩,用来存储些资源.这里使用云服务器+zfile+七牛云对象存储进行搭建. 租用云服务器 首先需要在常用的云服务网站买一个云服务器,如阿里云.腾讯云等.这里不说该怎么租用和搭建 ...

  9. 七牛云对象存储使用指南

    对象存储服务简介 七牛云海量存储系统(KODO)是自主研发的非结构化数据存储管理平台,支持中心和边缘存储.平台经过多年大规模用户验证已跻身先进技术行列,并广泛应用于海量数据管理的各类场景. 详细介绍参 ...

最新文章

  1. 听听阿里老哥对算法工程师技术学习路线的建议
  2. 对kubernetes的认识
  3. 通过GitHub Pages创建个人主页
  4. 如何给table表格的tr行加border边框(解决篇)
  5. SourceTree的基本使用 - 天字天蝎 - 博客园
  6. halcon 旋转_HALCON高级篇:3D相机标定
  7. 戴森工程师揭秘Dyson 360 Eye吸尘机器人的故事:先要做到“智能”
  8. java车辆使用管理系统_JAVA车辆管理系统,基于SSM框架的系统
  9. 推荐一款.NET开源免费的图表控件ScottPlot
  10. Windows Server 2008 R2 官方简体中文免费企业版/标准版/数据中心版下载
  11. 3D打印技术到底有多强大?
  12. sprint演示会议
  13. GEE开发之Modis_LST地表温度数据分析
  14. 税费计算机,友商税费计算器
  15. python若干整数的最大值_python脚本3_输入若干个整数打印出最大值
  16. RTX2060 Super和RTX2060 哪个好
  17. win10一键卸载所有自带应用
  18. android 蓝牙扫描流程,Android 9.0 Bluetooth源码分析(二)蓝牙扫描流程
  19. 《动手学ROS2》10.4 Cartographer介绍与安装
  20. 基于ssm高校科研管理系统-计算机毕业设计源码+LW文档

热门文章

  1. 股票数据的获取(tushare)
  2. openstack从iso创建虚拟机
  3. 计算1000以内能被5和7整除的最大整数
  4. QGIS制图表达-符号大小随比例尺变化
  5. PySide应用无法调出输入法输入中文
  6. java测试单个方法 @Test
  7. 用Go语言开发一个编程语言
  8. 内网机无法ping通外网机
  9. win32api之链接库的创建与调用(八)
  10. 迅投qmt量化交易系统以及实盘介绍