当前位置: 首页 > news >正文

[JAVAee]文件操作-IO

本文章讲述了通过java对文件进行IO操作

IO:input/output,输入/输出. 

建议配合文章末尾实例食用

目录

文件

文件的管理

文件的路径

文件的分类

文件系统的操作

File类的构造方法

File的常用方法

文件内容的读写

FileInputStream读取文件

构造方法

常用方法

Scanner读取

FileOutputStream写入文件

PrintfWriter写入

关于close()方法

文件操作示例

根据文件名搜索并删除文件

文件的复制

根据文件内容或文件名搜索


文件

针对硬盘来说,会将存储的数据分成一个一个独立的单位进行保存,这个独立的单位就被抽象的称为"文件".

我们平时的文件都是存储在硬盘当中的.

文件的管理

随着存储的数据增多,对于这些数据也会进行一定的管理.

对于文件,我们会进行层级管理,也就是数据结构中的树形结构.就这样,出现了一种管理文件的特殊文件:目录(directory)也就是俗称的文件夹.

文件的路径

路径(path)是一个文件在系统中的具体位置.

从树形结构来看,就是由上到下的从一个根节点开始描述到目标文件.

路径的表示:从盘符开始,用"\"或"/"分割开(在Windows中一般都从"此电脑"开始,表示的时候可以将其忽略)

路径根据"基准目录"的不同,又可以分为:

  • 绝对路径:从盘符开始往下遍历直到目标文件,所得到的路径
  • 相对路径:从指定的目录开始往下遍历直到目标文件,所得到的路径

C:\Program Files\Java\jdk1.8.0_192(绝对目录)

\Java\jdk1.8.0_192(相对目录)

在windows系统上,一个文件的路径是绝对唯一的,可以说文件与路径一一对应的.

文件的分类

根据所保存的数据的不同,文件可以被分为:

二进制文件:按照标志格式保存的没被字符集编码过的文件

文本文件:存储被字符集编码过的文本

文件系统的操作

 在JAVA的标准库当中,提供了File这个类.

此处的File实例化出的对象是硬盘上一个文件或目录的抽象表示.

File类的构造方法

构造方法中的路径指定的文件可以是存在的,也可以是不存在的.

File(File parent, String child)

通过父亲抽象路径名与子抽象路径名创建一个File实例

File(String pathname)

通过转换传输的路径名字符串转化成为抽象路径名来创建File实例

File(String parent, String child)

从父路径名字符串和子路径名字符串创建新的 File实例。

File(URI uri)

通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。

File的常用方法

这些方法的作用都能很清楚的明白,就不再一一演示了.

修饰符及返回
值类型
方法说明
StringgetParent()返回 File 对象的父目录文件路径
StringgetName()返回 FIle 对象的纯文件名称
StringgetPath()返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返
回 true
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
voiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到
JVM 运行结束时才会进行
String[]list()返回 File 对象代表的目录下的所有文件名
File[]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象
表示
booleanmkdir()创建 File 对象代表的目录
booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目
booleanrenameTo(File
dest)
进行文件改名,也可以视为我们平时的剪切、粘贴操
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

如果放入的是绝对路径 

public static void main(String[] args) throws IOException {File file = new File("D:\\tools\\TMP");System.out.println(file.getParent());System.out.println(file.getName());System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.getCanonicalPath());}

 放入的是相对路径.

当调用打印绝对路径与相对路径的时候会根据当前所在的工作目录创建.

这时候,文件是并不存在的.调用createNewFile()才会创建新的文件.

File file = new File(".\\TMP");

文件内容的读写

针对文件内容的操作,会使用到"流"来操作.

流,从字面意思上可以看作为"水流",是可以随心所读的读写的.对于读取数据,可以一次读取1个字节,5个字节,10个字节也可以一次性读完100个字节.相反,对于写入数据来说,也是一样的.这些数据不会被限制一次只能读取一定量或被捆绑在一起.

因此,就把读写文件相关的对象,成为"流对象".

在java标准库的流对象,从类型上可以分成两大类:

  • 字节流对象:InputStream,OutputStream...(可以读取文本文件与二进制文件)
  • 字符流对象:Reader,Writer...(只能读取文本文件)

在此处的输入与输出,是以CPU为基准的:

Input是从CPU向硬盘输入,达到读取文件的效果.

Output是从CPU向硬盘输出,达到写入文件的效果. 

FileInputStream读取文件

上面介绍的字节流对象的InputStream只是一个抽象类,对于文件的IO来说.使用其中一个实现类FileInputStream就可以了

构造方法

方法说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流
//构造方法1
File file = new File("D:/tools/TMP/book.txt");
FileInputStream inputStream = new FileInputStream(file);
//构造方法2        
FileInputStream inputStream1 = new FileInputStream("D:/tools/TMP/book.txt");

常用方法

修饰符及
返回值类
方法说明
intread()读取一个字节的数据,返回 -1 代表已经完全读完了
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数
量;-1 代表以及读完了
intread(byte[] b,
int off, int len)
最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返
回实际读到的数量;-1 代表以及读完了
voidclose()关闭字节流

无参数read 

        while(true){int n = inputStream.read();if(n == -1){break;}System.out.printf("%c",n);//%c是字符型格式符,以字符为单位进行输出.直接输出会得到的是ASCII码}inputStream.close();//释放资源

byte[]参数read(更推荐使用此方法)

带有数组参数的read能够极大的减少对文件的IO次数,减少了发生异常的可能.

        byte[] buf = new byte[1024];//数组的长度为一次读取的字节数while(true){                //数组的长度不能一次读完字节,下一次的读取就会覆盖上一次的数据int len;len = inputStream.read(buf);if(len == -1){break;}for(int i = 0; i < len; i++){System.out.println(buf[i]);}}inputStream.close();//释放资源

Scanner读取

将FileInputStream套上一个Scanner更方便的操作

构造方法说明
Scanner(InputStream is, String charset)使用 charset 字符集进行 is 的扫描读取
Scanner scanner = new Scanner(inputStream,"UTF_8");while(scanner.hasNext()){String s = scanner.next();System.out.println(s);}scanner.close();

FileOutputStream写入文件

构造方法与FileInputStream是基本相同的.

返回
值类
方法签名说明
voidwrite(int b)写入要给字节的数据
voidwrite(byte[] b)将 b 这个字符数组中的数据全部写入 os 中
int

write(byte[] b,int off,

int len)

将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
voidclose()关闭字节流
voidflush()

刷新此输出流并强制任何缓冲的输出字节被写出

  • 关于flush方法,计算机为了减少I/O的次数.在写入数据的时候,先会把数据放入到缓冲区当中.如果数据特别小的,可能还在缓冲区中.未能及时的放到文件当中,其他流可能就会读取不到.
        FileOutputStream outputStream = new FileOutputStream("D:/tools/TMP/book.txt");outputStream.write('H');//单个字符byte[] arr = {(byte) 'E',(byte) 'L'};//byte[]outputStream.write(arr);String s = "LO";byte[] arr2 = s.getBytes("UTF-8");//将字符串转换成"UTF-8"字符集的字符放入byte[]outputStream.write(arr2);outputStream.flush();//刷新缓冲区outputStream.close();

写入后,会覆盖原有的数据.

PrintfWriter写入

FileOutputStream outputStream = new FileOutputStream("D:/tools/TMP/book.txt");
PrintWriter writer = new PrintWriter(outputStream);
writer.println("hello");
writer.flush();
writer.close();
outputStream.close();

关于close()方法

前面介绍了进程,关于进程会用PCB来进行描述

而PCB里又包括了:

  • pid
  • 内存指针
  • 文件描述符

对于close,我们释放的主要是文件描述符.其记载了在此进程中,打开了什么文件,关闭了什么文件或正在使用什么文件等.就像一个数组一样,每进行一个操作会占上一个下标,但表的长度有限,可能会被完全占满.一旦占满了不进行释放,再继续打开文件就会发生错误,可能造成文件资源泄露的问题.

除了直接的使用close方法释放资源,还可以使用相应的带有资源的try方法.

这样就不怕忘记使用close方法了

try(FileInputStream inputStream1 = new FileInputStream("D:/tools/TMP/book.txt")){byte[] buf = new byte[1024];while(true){int len;len = inputStream.read(buf);if(len == -1){break;}for(int i = 0; i < len; i++){System.out.println(buf[i]);}}}

文件操作示例

根据文件名搜索并删除文件

主要思路是:

  • 遍历当前的目录,如果遍历到的文件是一个目录继续递归遍历
  • 如果是一个普通文件,则判断是否为我们要找的文件
    public static Scanner scanner = new Scanner(System.in);public static void main(String[] args) {//输入要搜索的目录//判断目录是否存在//输入要删除的文件名//遍历目录,搜索文件是否存在System.out.println("请输入要搜素的根目录的路径");String dirName = scanner.next();File dir = new File(dirName);//创建目录实例if(!dir.isDirectory()){//判断是否为目录System.out.println("输入的路径并非根目录,或根目录不存在");return;}System.out.println("输入要删除的文件的关键字");String keyName = scanner.next();scanner(dir,keyName);}public static void scanner(File dir,String keyName){File[] files = dir.listFiles();//此方法,将dir当中的文件存储到File[]中if(files == null){return;//证明这个目录下没有东西了}//如果目录下还有东西,就将他遍历一遍for (File f: files) {if(f.isDirectory()){//如果还是目录,递归遍历里面的文件scanner(f,keyName);}else{//如果是普通文件,判断是否带有关键字if(f.getName().contains(keyName)){//如果带有关键字System.out.println("输入\"YES\"来确认是否要删除: " + f.getAbsolutePath());System.out.println("输入任意其他取消删除");String s = scanner.next();if(s.equals("YES")){System.out.println(f.delete());}else{System.out.println("取消");}}}}}

 

文件的复制

主要思路:

  • 判断被复制的文件在不在或者是否为一个普通文件
  • 判断要去的路径存不存在被复制的文件
  • 从被复制的文件进行读操作,再进行写操作写入到目标处
    public static void main(String[] args) {//判断被复制的文件在不在或者是否为一个普通文件//判断要去的路径存不存在被复制的文件//从被复制的文件进行读操作,再进行写操作写入到目标处Scanner scanner = new Scanner(System.in);System.out.println("输入要复制的文件的路径");String source = scanner.next();//要复制的文件File sourFile = new File(source);if(!sourFile.isFile()){//判断是否为一个普通文件,同时也判断了其是否存在System.out.println("路径错误,目标无法复制");return;}System.out.println("输入要复制到的路径");String dir = scanner.next();File dirFile = new File(dir);//要复制去的路径if(dirFile.isFile()){//如果已经有了文件,则不进行复制System.out.println("文件已存在或路径错误");return;}//进行读写操作//使用带资源的try,最后会自动释放资源try(InputStream inputStream = new FileInputStream(sourFile); OutputStream outputStream = new FileOutputStream(dirFile)) {byte[] buf = new byte[1024];while(true){int len = inputStream.read(buf);if(len == -1){System.out.println("复制完毕");break;}outputStream.write(buf);}} catch (IOException e) {e.printStackTrace();}}

根据文件内容或文件名搜索(简单版)

    //遍历目录,读取普通文件的内容与关键字进行匹配//如果是目录则递归遍历public static List<File> ret = new ArrayList<>();public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("输入要搜索的目录路径");String s = scanner.next();File sFile = new File(s);if(!sFile.isDirectory()){System.out.println("输入的路径有误");return;}System.out.println("输入关键字");String keyName = scanner.next();scan(sFile,keyName);System.out.println("相关搜索的文件有");for (File f:ret) {System.out.println(f.getAbsolutePath());}}public static void scan(File root,String keyName){File[] files = root.listFiles();//得到当前目录的所有文件if(files == null){//递归结束的条件return;}for (File f:files) {if(f.isDirectory()){//如果是目录//继续递归scan(f,keyName);}else{//如果是普通文件//判断文件名是否存在关键字//判断内容是否存在关键字//如果满足其一,则放到列表中if(isContainOnName(f,keyName) || isContainOnContent(f,keyName)){ret.add(f);}}}}public static boolean isContainOnName(File file,String keyName){return file.getName().contains(keyName);}public static boolean isContainOnContent(File file,String keyName){//进行读操作//组成一个字符串,判断keyName是否存在字符串中//当然这种方法有点蠢,性能非常差.不要用于大文件当中StringBuffer buffer = new StringBuffer();try(InputStream inputStream = new FileInputStream(file);Scanner scan = new Scanner(inputStream,"UTF-8")){while(scan.hasNext()){buffer.append(scan.next());}} catch (IOException e) {e.printStackTrace();}return buffer.indexOf(keyName) != -1;//StringBuffer没有contains可以用indexOf,如果返回值为-1代表无子串}

相关文章:

[JAVAee]文件操作-IO

本文章讲述了通过java对文件进行IO操作 IO:input/output,输入/输出. 建议配合文章末尾实例食用 目录 文件 文件的管理 文件的路径 文件的分类 文件系统的操作 File类的构造方法 File的常用方法 文件内容的读写 FileInputStream读取文件 构造方法 常用方法 Scan…...

【数据集】3小时尺度降水数据集-MSWEPV2

1 MSWEP V2 precipitation product 官网-MSWEP V2降水产品 参考...

Springboot之把外部依赖包纳入Spring容器管理的两种方式

前言 在Spring boot项目中&#xff0c;凡是标记有Component、Controller、Service、Configuration、Bean等注解的类&#xff0c;Spring boot都会在容器启动的时候&#xff0c;自动创建bean并纳入到Spring容器中进行管理&#xff0c;这样就可以使用Autowired等注解&#xff0c;…...

更安全,更省心丨DolphinDB 数据库权限管理系统使用指南

在数据库产品使用过程中&#xff0c;为保证数据不被窃取、不遭破坏&#xff0c;我们需要通过用户权限来限制用户对数据库、数据表、视图等功能的操作范围&#xff0c;以保证数据库安全性。为此&#xff0c;DolphinDB 提供了具备以下主要功能的权限管理系统&#xff1a; 提供用户…...

WPS本地镜像化在线文档操作以及样例

一个客户项目有引进在线文档操作需求&#xff0c;让我这边做一个demo调研下&#xff0c;给我的对接文档里有相关方法的说明&#xff0c;照着对接即可。但在真正对接过程中还是踩过不少坑&#xff0c;这儿对之前的对接工作做个记录。 按照习惯先来一个效果&#xff1a; Demo下载…...

STM32 Flash学习(一)

STM32 FLASH简介 不同型号的STM32&#xff0c;其Flash容量也不同。 MiniSTM32开发板选择的STM32F103RCT6的FLASH容量为256K字节&#xff0c;属于大容量产品。 STM32的闪存模块由&#xff1a;主存储器、信息块和闪存存储器接口寄存器等3部分组成。 主存储器&#xff0c;该部分…...

Spring中IOC容器常用的接口和具体的实现类

在Spring框架没有出现之前&#xff0c;在Java语言中&#xff0c;程序员们创建对象一般都是通过关键字new来完成&#xff0c;那时流行一句话“万物即可new&#xff0c;包括女朋友”。但是这种创建对象的方式维护成本很高&#xff0c;而且对于类之间的相互关联关系很不友好。鉴于…...

【MySQL】索引特性

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《零基础入门MySQL》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;没…...

【深度学习笔记】动量梯度下降法

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…...

《TCP IP网络编程》第十二章

第 12 章 I/O 复用 12.1 基于 I/O 复用的服务器端 多进程服务端的缺点和解决方法&#xff1a; 为了构建并发服务器&#xff0c;只要有客户端连接请求就会创建新进程。这的确是实际操作中采用的一种方案&#xff0c;但并非十全十美&#xff0c;因为创建进程要付出很大的代价。…...

基于CNN卷积神经网络的调制信号识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 1. 卷积神经网络&#xff08;CNN&#xff09; 2. 调制信号识别 3.实现过程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 % 构建调制类型…...

正则,JS:this,同步异步,原型链笔记整理

一 正则表达式 正则表达式&#xff08;regular expression&#xff09;是一种表达文本模式&#xff08;即字符串结构&#xff09;的方法&#xff0c;有点像字符串的模板&#xff0c;常常用来按照“给定模式”匹配文本 正则表达式可以用于以下常见操作&#xff1a; 匹配&…...

【NOIP】小鱼的数字游戏题解

author&#xff1a;&Carlton tag&#xff1a;递归&#xff0c;栈 topic&#xff1a;【NOIP】小鱼的数字游戏题解 language&#xff1a;C website&#xff1a;洛谷 date&#xff1a;2023年7月29日 目录 我的题解思路 优化 别人的优秀思路&#xff1a; 我的题解思路 题…...

算法的时间复杂度、空间复杂度如何比较?

目录 一、时间复杂度BigO 大O的渐进表示法&#xff1a; 例题一&#xff1a; 例题2&#xff1a; 例题3&#xff1a;冒泡排序的时间复杂度 例题4&#xff1a;二分查找的时间复杂度 书写对数的讲究&#xff1a; 例题5&#xff1a; 实例6&#xff1a; 利用时间复杂度解决编…...

We are the Lights 2023牛客暑期多校训练营4-L

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;有n*m盏灯&#xff0c;q次操作&#xff0c;每次可以将一整行或一整列的等打开或关闭 1<n,m<1e6;1<q<1e6 思路&#xff1a;对于同一行或者同一列来说&#xff0c;只要最后一次操作时开或者关&#xff0…...

ant-design-vue中table组件使用customRender渲染v-html

ant-design-vue遇到table中列表数据需要高亮渲染 1、customRender可以使用&#xff0c;但是使用v-html发现不生效还报错 const columns [title: name,dataIndex: name,customRender: (val, row) > {return <span v-html{val}></span>} ]2、customeRender函数…...

若依框架实现后端防止用户重复点击

若依框架实现后端防止用户重复点击 基于自定义注解、切面、Redis实现 1. 添加自定义注解&#xff1a; 代码放置位置&#xff1a;com/ruoyi/common/annotation/RepeatClick.java time: 时间默认0; unit&#xff1a;单位默认 秒; key: 默认空字符串 package com.ruoyi.fra…...

PCA对手写数字数据集的降维

手写数字的数据集结构为(42000, 784),用KNN跑一次半小时,得到准确率在96.6%上下,用随机森林跑一次12秒,准确率在93.8%,虽然KNN效果好,但由于数据量太大,KNN计算太缓慢,所以我们不得不选用随机森林。我们使用了各种技术对手写数据集进行特征选择,最后使用嵌入 法Select…...

Python入门【变量的作用域(全局变量和局部变量)、参数的传递、浅拷贝和深拷贝、参数的几种类型 】(十一)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…...

下级平台级联安防视频汇聚融合EasyCVR平台,层级显示不正确是什么原因?

视频汇聚平台安防监控EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...