go提高升阶(四) I/O流学习
I/O
官网课程
购买课程找博主推荐
文章目录
- I/O
- 文件信息
- 创建文件、目录
- IO读
- IO写(权限)
- 文件复制
- Seeker接口
- 断点续传
- 遍历文件夹
- bufio
电脑中一切,都是以 二进制流的形式存在的。
jpg:010100000010010101001010101010010101010 编码格式,还原为一个图片展示到计算机显示器
mp4:010100000010010101001010101010010101010
i:input 输入
o:output 输出
文件信息
文本文件
二进制文件
file 类是封装 os 包中的。
封装了文件的信息:FileInfo 、 Read、Write
1、读取文件信息 FileInfo
2、向文件中写入内容 Write
3、读取文件内容 Read
package mainimport ("fmt""os"
)// file
// fileInfo
/*
type FileInfo interface {Name() string // base name of the fileSize() int64 // length in bytes for regular files; system-dependent for othersMode() FileMode // file mode bits : 权限ModTime() time.Time // modification timeIsDir() bool // abbreviation for Mode().IsDir()// 获取更加详细的文件信息, *syscall.Stat_t 反射来获取Sys() any // underlying data source (can return nil)
*/
func main() {// 获取某个文件的状态fileinfo, err := os.Stat("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\test")if err != nil {return}fmt.Println(fileinfo.Name()) // demo01.gofmt.Println(fileinfo.IsDir()) // falsefmt.Println(fileinfo.ModTime()) // 2023-02-23 20:25:43.1772351 +0800 CSTfmt.Println(fileinfo.Size()) // 1186 字节数fmt.Println(fileinfo.Mode()) // -rw-rw-rw-
}
创建文件、目录
通过代码创建文件
路径:
- 相对路径
- 相对当前目录的路径
- ./ 当前目录
- …/ 上一级目录
- 绝对路径
- 从盘符开始的路径
创建目录
mkdir / 权限
mkdirAll 创建层级目录
remove 删除目录
removeAll 强制删除目录
package mainimport ("fmt""os"
)// 创建目录
// 项目开源框架,一运行,就会自动生成脚手架目录
func main() {// 打开一个文件夹(1、存在我就打开 2、不存在,创建这个文件夹)// func Mkdir(name string, perm FileMode) error// ModePerm : 0777err := os.Mkdir("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\file1", os.ModePerm)if err != nil {// 存在就无法创建了 Cannot create a file when that file already exists.fmt.Println(err)}fmt.Println("文件夹创建完毕")// 创建层级文件夹err2 := os.MkdirAll("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\file2\\aa\\bb\\cc\\dd", os.ModePerm)if err2 != nil {fmt.Println(err2)}fmt.Println("层级文件夹创建完毕")// 删除 remove// func Remove(name string) error// 通过remove方法只能删除单个空文件夹:// remove D:\Environment\GoWorks\src\xuego\lesson11\file2: The directory is not empty.err3 := os.Remove("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\file2")if err3 != nil {fmt.Println(err3)//return}fmt.Println("file delete success!!")// 如果存在多层文件,removeAll,相对来说比较危险,删除这个目录下的所有东西, 强制删除err4 := os.RemoveAll("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\file2")if err4 != nil {fmt.Println(err4)return}fmt.Println("err4 delete success!!")
}
创建文件
os.create(),若存在就是的打开-就是返回的这个file对象. 如果不存在,创建在打开
package mainimport ("fmt""os"
)func main() {// 创建文件 Create// func Create(name string) (*File, error) {// 返回的file对象就是我们的文件file1, err := os.Create("a.go") // 相对路径if err != nil {fmt.Println(err)}fmt.Println(file1)// 删除os.Remove("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\a.go")}
IO读
1、与文件建立连接
package mainimport ("fmt""os"
)// IO读
func main() {// 找到这个文件的对象 create 创建、 打开Open// func Open(name string) (*File, error)file1, err := os.Open("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\123.txt")if err != nil {fmt.Println(err)}fmt.Println(file1)// file 类-- 指定的对象// 打开文件的时候,选定权限: 可读可写的方式打开// OpenFile(文件名,打开方式:可读、可写...,FileMode , 权限)file2, err2 := os.OpenFile("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\123.txt",os.O_RDONLY|os.O_WRONLY, os.ModePerm)if err2 != nil {fmt.Println(err2)}fmt.Println(file2)// 可以操作这个对象了}
2、读取 file.Read([]byte) ,将file中的数据读取到 []byte 中, n,err n读取到的行数,err 错误,EOF错误,就代表文件读取完毕了
一直调用read,就代表光标往后移动…
package mainimport ("fmt""os"
)// 读取文件数据
func main() {// 我们习惯于在建立连接时候通过defer来关闭连接,保证程序不会出任何问题,或者忘记关闭// 建立连接file, _ := os.Open("123.txt")// 关闭连接defer file.Close()// 读代码 ,Go 的错误机制,让我们专心可以写业务代码。// 1、创建一个容器 (二进制文本文件--0100101010 => 读取流到一个容器 => 读取容器的数据)bs := make([]byte, 2, 1024) // 缓冲区,可以接受我们读取的数据// 2、读取到缓冲区中。 // 汉字一个汉字占 3个位置n, err := file.Read(bs)fmt.Println(n)fmt.Println(err)fmt.Println(string(bs)) // 读取到的字符串 ab// 光标不停的向下去指向,读取出来的内容就存到我们的容器中。file.Read(bs)fmt.Println(string(bs)) // 读取到的字符串 cdfile.Read(bs)fmt.Println(string(bs)) // 读取到的字符串 en, err = file.Read(bs)fmt.Println(n)fmt.Println(err) // EOF ,读取到了文件末尾。就会返回EOF。fmt.Println(string(bs)) // 读取到的字符串n, err = file.Read(bs)fmt.Println(n)fmt.Println(err)fmt.Println(string(bs)) // 读取到的字符串}
IO写(权限)
建立连接 (设置权限:可读可写,扩充这个文件的append) os.OpenFile
关闭连接
写入 file.write
- file.Write
- file.WriteString
package mainimport ("fmt""os"
)func main() {fileName := "123.txt"// 权限:如果我们要向一个文件中追加内容, O_APPEND, 如果没有,就是从头开始写file, _ := os.OpenFile(fileName, os.O_WRONLY|os.O_RDONLY|os.O_APPEND, os.ModePerm)defer file.Close()// 操作bs := []byte{65, 66, 67, 68, 69} // A B C D En, err := file.Write(bs)if err != nil {fmt.Println(err)}fmt.Println(n)// string类型的写入n, err = file.WriteString("hhahahahah哈哈哈哈哈哈哈")if err != nil {fmt.Println(err)}fmt.Println(n)
}
文件复制
package utilsimport ("fmt""io""os"
)// Copy 方法需要参数为:source 源文件 ,destination 目标文件
func Copy(source, destination string, bufferSize int) {// 读取文件sourceFile, err := os.Open(source)if err != nil {fmt.Println("Open错误:", err)}// 输出文件 O_WRONLY , O_CREATE 如果不不存在,则会创建destinationFile, err := os.OpenFile(destination, os.O_WRONLY|os.O_CREATE, os.ModePerm)if err != nil {fmt.Println("OpenFile错误:", err)}// 关闭defer sourceFile.Close()defer destinationFile.Close()// 专注业务代码,拷贝buf := make([]byte, bufferSize)// 读取for {n, err := sourceFile.Read(buf)if n == 0 || err == io.EOF {fmt.Println("读取完毕源文件,复制完毕")break} else if err != nil {fmt.Println("读取错误:", err)return // 错误之后,必须要return终止函数执行。}// 将缓冲区的东西写出到目标文件_, err = destinationFile.Write(buf[:n])if err != nil {fmt.Println("写出错误:", err)}}}
调用
package mainimport "xuego/lesson11/utils"func main() {source := "C:\\xq.png"dest := "D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\xq.png"utils.Copy(source, dest, 1024)}
系统给我们提供了copy方法
// 调用系统的方法
func Copy2(source, destination string) {// 读取文件sourceFile, err := os.Open(source)if err != nil {fmt.Println("Open错误:", err)}// 输出文件 O_WRONLY , O_CREATE 如果不不存在,则会创建destinationFile, err := os.OpenFile(destination, os.O_WRONLY|os.O_CREATE, os.ModePerm)if err != nil {fmt.Println("OpenFile错误:", err)}// 关闭defer sourceFile.Close()defer destinationFile.Close()// 具体的实现written, err := io.Copy(destinationFile, sourceFile)fmt.Println("文件的字节大小:", written)
}
第三方包,也提供了这些方法。
Seeker接口
设置光标的位置,读写文件
type Seeker interface {// 1、offset 偏移量 3// 2、whence 如何设置,当前光标的位置。Seek(offset int64, whence int) (int64, error)
}
// 如何让光标在第三个位置?
// 1、找到当前光标在哪里
// a) 文件的头部, 0
// b) 文件的尾部 end
// c) 在任意地方,相对位置。const (SeekStart = 0 // 表示相对于文件的开头SeekCurrent = 1 // 表示相对于当前光标所在的位置SeekEnd = 2 // 相对于文件的末尾
)
关于seek的使用
package mainimport ("fmt""io""os"
)func main() {// 读取文件file, _ := os.OpenFile("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\a.txt",os.O_RDWR, os.ModePerm)// defer closedefer file.Close()// 测试seek// 相对开始位置。io.SeekStart// 相对于文件末尾, io.SeekEndfile.Seek(2, io.SeekStart)buf := []byte{0}file.Read(buf)fmt.Println(string(buf))// 相对于当前位置file.Seek(3, io.SeekCurrent)file.Read(buf)fmt.Println(string(buf))// 在结尾追加内容file.Seek(0, io.SeekEnd)file.WriteString("hahahaha")
}
断点续传
思考几个问题:
1、如果你要传的文件很大,70G,是否有方法可以缩短耗时?
- 将文件拆分
- 同时多线程进行下载
2、如果在文件传递过程中,程序被迫中断(断电、断网、内存满了…),下次重启之后,文件是否还需要重头再传?
- 希望能够继续上传或者下载
3、传递文件的时候,支持暂停和恢复上传?假设这个两个操作分布在重启前后?
- 支持!
file、read、write、seek
思路:
1、需要记住上一次传递了多少数据、temp.txt => 记录
2、如果被暂停或者中断了,我们就可以读取这个temp.txt的记录,恢复上传
3、删除temp.txt

理解
package mainimport ("fmt""io""os""strconv"
)// 断点续传
func main() {// 传输源文件地址srcFile := "C:\\Users\\遇见狂神说\\Desktop\\client\\gp.png"// 传输的目标位置destFile := "D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\server\\gp-upload.png"// 临时记录文件tempFile := "D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\temp.txt"// 创建对应的file对象,连接起来file1, _ := os.Open(srcFile)file2, _ := os.OpenFile(destFile, os.O_CREATE|os.O_RDWR, os.ModePerm)file3, _ := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, os.ModePerm)defer file1.Close()defer file2.Close()fmt.Println("file1/2/3 文件连接建立完毕")// 1、读取temp.txtfile3.Seek(0, io.SeekStart)buf := make([]byte, 1024, 1024)n, _ := file3.Read(buf)// 2、转换成string - 数字。countStr := string(buf[:n])count, _ := strconv.ParseInt(countStr, 10, 64)fmt.Println("temp.txt中记录的值为:", count) // 5120// 3、设置读写的偏移量file1.Seek(count, io.SeekStart)file2.Seek(count, io.SeekStart)fmt.Println("file1/2 光标已经移动到了目标位置")// 4、开始读写(复制、上传)bufData := make([]byte, 1024, 1024)// 5、需要记录读取了多少个字节total := int(count)for {// 读取数据readNum, err := file1.Read(bufData)if err == io.EOF { // file1 读取完毕了fmt.Println("文件传输完毕了")file3.Close()os.Remove(tempFile)break}// 向目标文件中写入数据writeNum, err := file2.Write(bufData[:readNum])// 将写入数据放到 total中, 在这里total 就是传输的进度total = total + writeNum// temp.txt 存放临时记录数据file3.Seek(0, io.SeekStart) // 将光标重置到开头file3.WriteString(strconv.Itoa(total))}}
遍历文件夹
package mainimport ("fmt""log""os"
)// cd /d 文件夹路径
// tree /F , 查看当前文件夹下的所有文件// 遍历文件夹
// 1、读取当前文件夹下的所有文件
// 2、如果是文件夹,进入文件夹,继续读取里面的所有文件
// 3、设置一些结构化代码
func main() {dir := "D:\\Environment\\GoWorks\\src\\xuego"tree(dir, 0)
}// 日常调试测试常用fmt输出 、 工作中or项目中更多是log日志输出
func tree(dir string, level int) {// 编写层级tabString := "|--"for i := 0; i < level; i++ {tabString = "| " + tabString}// 获取目录 ReadDir, 返回目录信息[]DirEntry,多个文件信息fileInfos, err := os.ReadDir(dir)if err != nil {log.Println(err)}// 遍历出来所有文件之后,获取里面的单个文件for _, file := range fileInfos {// 文件夹中文件的全路径展示filename := dir + "\\" + file.Name()fmt.Println(tabString + file.Name())// 如果是文件夹,再次遍历if file.IsDir() {tree(filename, level+1)}}}
bufio
Go语言自带的IO操作包。bufio,使用这个包可以大幅提升文件的读写效率。
buf: 缓冲区.
io操作效率本身是还可以的,频繁访问本地磁盘文件(效率低)
所以说 bufio ,提供了一个缓冲区,读和写都先在缓冲区中,最后再一次性读取或者写入到文件里,降低访问本地磁盘的次数。
bufio写入
package mainimport ("bufio""fmt""log""os"
)// bufio 的应用
func main() {file, err := os.Open("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\demo01.go")if err != nil {log.Println(err)}defer file.Close()// 读取文件// 创建一个bufio包下的 reader对象。//bufioReader := bufio.NewReader(file)//buf := make([]byte, 1024)//n, err := bufioReader.Read(buf)//fmt.Println("读取到了多少个字节:", n)// 读取键盘的输入// 键盘的输入,实际上是流 os.StdininputReader := bufio.NewReader(os.Stdin)// delim 到哪里结束读取readString, _ := inputReader.ReadString('\n')fmt.Println("读取键盘输入的信息:", readString)}
bufio写出
package mainimport ("bufio""fmt""os"
)// 写入
func main() {file, _ := os.OpenFile("D:\\Environment\\GoWorks\\src\\xuego\\lesson11\\a.txt",os.O_RDWR|os.O_CREATE,os.ModePerm)defer file.Close()// bufiofileWrite := bufio.NewWriter(file)writeNum, _ := fileWrite.WriteString("kuangshen")fmt.Println("writeNum:", writeNum)// 发现并没有写出到文件,是留在了缓冲区,所以我们需要调用 flush 刷新缓冲区// 手动刷新进文件fileWrite.Flush()
}
i/o差不多就这些,整理狂神笔记,可以到官网购买课程
官网连接
相关文章:
go提高升阶(四) I/O流学习
I/O 官网课程 购买课程找博主推荐 文章目录I/O文件信息创建文件、目录IO读IO写(权限)文件复制Seeker接口断点续传遍历文件夹bufio电脑中一切,都是以 二进制流的形式存在的。jpg:010100000010010101001010101010010101010 编码格式,还原为一个…...
【代码随想录训练营】【Day28】第七章|回溯算法|93.复原IP地址|78.子集|90.子集II
复原IP地址 题目详细:LeetCode.93 这道题与上一道练习题分割回文字符串十分详细,一样是涉及到分割字符串、判断字符串、递归与回溯的问题,所以这道题要解决的难点在于: 如何分割IP地址字符串如何判断分割的IP地址是否合法递归的…...
Get请求和Post请求区别
前后端交互请求数据的方式有很多种。 例如:Get Post Put Patch Delete Copy 等等很多请求方式 但是用的最多的就是Get和Post Get请求方式 1. get多用于从服务器请求获取数据 2.get传送的数据量较小,不能大于2KB 3.get安全性非常低 Post请求方式 1.…...
static关键字
static的基本基本用法可以分为下面几种: (1)static修饰全局变量 (2) 修饰局部变量 (3)修饰普通函数 (4)修饰类的成员变量 一、static修饰全局变量 当同时编译多个文件时…...
A Comprehensive Tool for Modeling CMOS Image-Sensor-Noise Performance论文总结及翻译
A Comprehensive Tool for Modeling CMOS Image-Sensor-Noise Performance Author: Ryan D. Gow Link: https://ieeexplore.ieee.org/document/4215175/metrics#metrics Select: ⭐️⭐️⭐️⭐️ Type: Academic Journal 备注: CMOS图像传感器噪声性能建模的综合工具 总结 …...
嘀嗒出行再闯IPO:千军万马我无懈
羽扇纶巾笑谈间,千军万马我无懈。 在激烈竞争中再度冲刺港交所IPO的嘀嗒出行,闪露出一丝歌词里的气魄。交通运输部下属网约车监管信息交互系统的数据显示,截至2023年1月31日,全国共有300家网约车平台公司取得网约车平台经营许可。…...
MATLAB算法实战应用案例精讲-【优化算法】增强型鲸鱼优化算法(EWOA)(附matlab代码实现)
前言 增强型鲸鱼优化算法(Enhanced Whale Optimization Algorithm,EWOA)是Mohammad H. Nadimi-Shahraki等人于2022年提出的一种改进算法。由于标准的鲸鱼优化算法及其它的改进算法都存在种群多样性低和搜索策略差的问题,因此引入有效的策略来缓解鲸鱼优化算法的这些核心缺点…...
登录Oracle数据库遇到ORA-01017密码错误的解决办法
文章目录症状分析解决办法欢迎加下方我的微信👇,拉你入学习群我们在登录Oracle数据库时可能会遇到ORA-01017错误,这里分析原因并提供解决办法。点击试看博主的专著《MySQL 8.0运维与优化》(清华大学出版社) 症状 图像…...
10个黑客基础教程!简单有效
如果你的电脑运行缓慢,请使用下面介绍的方法来帮助加速、优化和提高电脑的性能。 1.关闭启动时自动运行的应用程序 计算机上安装的许多应用程序都可以将自己配置为在启动期间自动启动并继续在后台运行,但是,如果不是每天都使用这些应用程序…...
JPA之实体之间的关系
JPA之实体之间的关系 10.1.1实体类创建 注解的应用 Table,Entity IdGeneratedValue指定主键,Column P174 实体类编写规范 Table(name "t_user") Entity(name "User") public class User implements Serializable {IdGeneratedVa…...
如何在 C++ 中调用 python 解析器来执行 python 代码(三)?
本文在 C 中调用 multi.py 脚本,并向它传入参数并执行,然后获得返回值并在 C 中打印结果。 目录 如何在 C 中调用 python 解析器来执行 python 代码(一)?如何在 C 中调用 python 解析器来执行 python 代码࿰…...
【Linux】gcc/g++/gdb的使用
🔥🔥 欢迎来到小林的博客!! 🛰️博客主页:✈️小林爱敲代码 🛰️社区 : 进步学堂 🛰️欢迎关注:👍点赞🙌收…...
浅浅谈一谈B树和B+树
目录: 🚀1.B树 🚀2.B树 索引背后的数据结构是啥呢,是B树,是为了数据库索引设计的,我们可以先了解B树,再说B树 1.什么是B树 B树也叫B-树,这里的-不读减,是一个符号 我们已经学过了二叉搜素树,B树其实就是N叉搜素树,二叉搜索树只能在每一个结点放一个…...
Keil新建一个国民32位MCU工程
1.打开Keil软件,点击Project→New uVision→Project 2.将工程保存到自己的工程文件夹,并给项目命名,点击保存 3.选择自己需要开发的芯片,点击OK 4.点击OK 5.出现上图所示,工程已经建好了,点击配置工程。 6.…...
webpack.config.js与package.json文件的配置
path要使用绝对路径,通过每次复制文件位置非常麻烦且容易导致问题 使用node中的 写个包名跟入口名称,其他全部回车 此步完成后,自动生成一个package.json包 licence指的是开源,一般不写 安装文件夹需要的依赖 dirname是node自带…...
超详细Eclipse配置JDK
在此附上Eclipse安装教程 超详细Eclipse安装教程 在此附上JDK1.8安装配置教程 超详细JDK1.8安装与配置 ①打开Eclipse–>点击Window–>点击Preferences ②找到Java–>找到Installed JREs–>点击Add… ③选中Standard VM–>之后点击Next ④点击Directory找…...
成功解决numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares
成功解决numpy.linalg.LinAlgError: SVD did not converge in Linear Least Squares 目录 解决问题 解决思路 解决方法—四大原因分析 T1、数据本身问题的解决方法...
Allegro如何设置铜皮避让的优先级操作指导
Allegro如何设置铜皮避让的优先级操作指导 在用Allegro进行PCB设计的时候,时常需要使用动态铜皮进行设计,当两块动态铜皮存在交集的时候,避让就会存在一个优先级,如下图 上方的铜皮避让调了下方的铜皮,上方的铜皮被避让了 如何调整让下方的铜皮避让上方的铜皮,如下图 具…...
(Trie Tree)字典树
(Trie Tree)字典树 场景:在n个字符串中查找某个字符串。 暴力匹配,时间复杂度为O(nm),m为字符串平均长度,效率过低。 字典查找单词"fly",首先查找’f’,然后…...
MQTT的学习之Mosquitto集群搭建
文章钢要: 1、进行双服务器搭建 2、进行多服务器搭建 一、Mosquitto的分布式集群部署 如果需要做并发量很大的时候就需要考虑做集群处理,但是我在查找资料的时候发现并不多,所以整理了一下,搭建简单的Mosquitto集群模式。 首…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟
众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了,延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp ,边缘服务器拉流推送到云服务器 …...
