首页 > 其他分享 >狂神说Go语言—I/O

狂神说Go语言—I/O

时间:2022-12-30 22:11:07浏览次数:34  
标签:文件 语言 err fmt Println file Go 狂神 os

i:input 读

o:output 写

01010101 流

获取文件信息

计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件。file类是在os包中的,封装了底层的文件描述符和相关信息,同时封装了Read和Write的实现。

Fileinfo接口定义了file信息相关的方法

package main

import (
   "fmt"
   "os"
)

func main() {
   fileinfo, error := os.Stat("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\a.txt") //"./a.txt"在控制台运行出错的,在terminal中运行
   if error != nil {
      fmt.Println(error)
      return
   }
   fmt.Println(fileinfo.Name())    //文件的名称
   fmt.Println(fileinfo.IsDir())   //是否是一个文件
   fmt.Println(fileinfo.Size())    //文件大小、字节
   fmt.Println(fileinfo.Mode())    //文件读写属性
   fmt.Println(fileinfo.ModTime()) //文件的修改时间

   // 反射获取文件更加详细的信息
   fmt.Println(fileinfo.Sys())
}
/*
a.txt
false
10
-rw-rw-rw-
2022-12-30 10:05:41.5050535 +0800 CST
&{32 {554152117 31005683} {2890671406 31005693} {939907367 31005683} 0 10}
*/

科普:权限

linux下有两种文件权限表示方式,符号和八进制表示

符号表示:

-		---		---		---
type	owner	group	others
type:文件类型 - 文件 d 目录|连接符号
---,代表的文件读写可执行 字母 r w x,如果额米有那个权限就用 - 代替

八进制表示

r 004
w 003
x 001
- 000

比如 777 就是可读可写可执行

创建目录与文件

package main

import (
   "fmt"
   "os"
)

func main() {
   err := os.Mkdir("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\test", os.ModePerm)
   if err != nil {
      fmt.Println(err)
      //return
   }
   fmt.Println("文件创建成功")

   //MkdirAll 创建层级目录
   err2 := os.MkdirAll("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\test1\\a1\\b1\\c1", os.ModePerm)
   if err2 != nil {
      fmt.Println(err2)
   }

   // Remove删除目录,如果目录下有文件则会删除不了
   //RemoveAll删除目录下所有的文件
   err3 := os.RemoveAll("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\test1")
   if err3 != nil {
      fmt.Println(err3)
   }
   return
}

创建文件

package main

import (
   "os"
)

func main() {
   //_, erro := os.Create("lesson10/d.txt")
   //if erro != nil {
   // fmt.Println(erro)
   //}
   //return
   //fmt.Println(f1.Name())

   //删除文件
   os.Remove("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\d.txt")

}

I/0读

打开文件

读取a.txt文件中的数据

package main

import (
   "fmt"
   "os"
)

func main() {
   //一、查看文件权限

   fileinfo, error := os.Stat("lesson10/a.txt")
   if error != nil {
      fmt.Println(error)
      return
   }
   fmt.Println(fileinfo.Mode()) //查看权限 -rw-rw-rw-

   //1、打开文件,建立连接open
   o1, erro := os.Open("lesson10/a.txt")
   if erro != nil {
      fmt.Println(erro)
      return //如果程序出错,需要返回信息
   }
   fmt.Println(o1.Name())
   // 2、关闭连接
   defer o1.Close()

   //读取a.txt信息
   //传入需要一个切片
   bs := make([]byte, 1, 1024)
   n, err := o1.Read(bs)
   fmt.Println(n) //读取到个数 一次可以读取到1个信息
   fmt.Println(string(bs))
   fmt.Println(err)

   n, err = o1.Read(bs) //再次向下读取 如果不赋值这里将只能读取第一个字符
   fmt.Println(n)       //多次赋值执行,可以继续往下读取信息
   fmt.Println(string(bs))
   fmt.Println(err)

   ////二、上面一种我们不知道文件的权限
   ////1、OpenFile对文件进行指定的连接
   //o2, erro := os.OpenFile("lesson10/a.txt", os.O_RDONLY|os.O_WRONLY, os.ModePerm) //os.O_RDONLY|os.O_WRONLY:可读|可写
   //if erro != nil {
   // fmt.Println(erro)
   // return //如果程序出错,需要返回信息
   //}
   //fmt.Println(o2.Name())
   ////   2、关闭连接
   //defer o1.Close()
}

I/O写

package main

import (
   "fmt"
   "os"
)

func main() {

   //打开文件,建立连接
   file, err := os.OpenFile("lesson10/a.txt", os.O_RDONLY|os.O_WRONLY|os.O_APPEND, os.ModePerm)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(file.Name())
   defer file.Close()

   // 向文件里面写入信息
   bs := []byte{65, 66, 67} //write传入参数也是一个byte切片
   n, err := file.Write(bs)
   fmt.Println(n) //追加的字符个数

   // 字符串输入
   n, err = file.WriteString("xuexiangban,狂神说")
   fmt.Println(n)
}

文件复制

package main

import (
   "fmt"
   "io"
   "os"
)

func main() {
   soure := "D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\img\\12_28.jpg"
   destination := "D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\img_copy\\12_28_03.jpg"
   //copy(destination,soure,  1024)
   //copy2(destination, soure)
   copy3(destination, soure)
}

// 3、os.ReadFile方法
// 它是一次性读取文件一次性写出,不适合较大的文件,文件如果较大容易造成内存溢出
func copy3(destination, soure string) {
   filebuf, _ := os.ReadFile(soure)
   os.WriteFile(destination, filebuf, 0777)
}

// 2、系统的copy方法
func copy2(destination, soure string) {
   //输入文件
   sourefile, err := os.Open(soure)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer sourefile.Close()

   // 输出文件
   destinationfile, err := os.OpenFile(destination, os.O_WRONLY|os.O_CREATE, os.ModePerm) //O_WRONLY可读可写的合并,O_CREATE没有文件则自动创建
   if err != nil {
      fmt.Println(err)
      return
   }
   defer destinationfile.Close()
   written, error := io.Copy(destinationfile, sourefile)
   if error != nil {
      fmt.Println(error)
   }
   fmt.Println("文件大小:", written)
}

// 1、定义一个copy方法:目标文件,初始文件 ,缓存字节的大小
func copy(destination, soure string, bufsize int) {
   //输入文件
   sourefile, err := os.Open(soure)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer sourefile.Close()

   // 输出文件
   destinationfile, err := os.OpenFile(destination, os.O_WRONLY|os.O_CREATE, os.ModePerm) //O_WRONLY可读可写的合并,O_CREATE没有文件则自动创建
   if err != nil {
      fmt.Println(err)
      return
   }
   defer destinationfile.Close()

   // 缓冲区
   buf := make([]byte, bufsize)
   //读取
   for {
      n, err := sourefile.Read(buf) //读取一次 1024字节远远不够,可以通过for循环读取完毕
      if err == io.EOF || n == 0 {
         fmt.Println("复制完毕")
         break
      }
      _, err = destinationfile.Write(buf[:n]) //buf[:n]从0开始读取完毕
      if err != nil {
         fmt.Println("写入失败", err)
      }
   }

}

image-20221230203409139

Seeker接口

Seeker是包装Seek方法的接口

type Seeker interface{
	Seek(offset int 64,whence int)(int64,error)
}

Seek(offset,whence),设置指针光标的位置,读写文件:

第一个参数:偏移量

第二个参数:如何设置

0:seekStart  表示相对于文件开头
1:seekCurrent	表示相对于当前光标所在位置来说的
2:seekend		表示相对于文件末尾
package main

import (
   "fmt"
   "io"
   "os"
)

func main() {
   file, _ := os.OpenFile("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\a.txt", os.O_RDWR, os.ModePerm)
   defer file.Close()

   // 业务
   file.Seek(3, io.SeekStart) //从开头执行,移三位
   buf := []byte{0}
   file.Read(buf) //buf需要切片传入
   fmt.Println(string(buf))

   file.Seek(3, io.SeekCurrent) //从光标当前位置
   file.Read(buf)               //buf需要切片传入
   fmt.Println(string(buf))

   file.Seek(0, io.SeekEnd) //从光标当前位置,不再向后移
   file.WriteString("kaibai")

}

标签:文件,语言,err,fmt,Println,file,Go,狂神,os
From: https://www.cnblogs.com/DuPengBG/p/17015918.html

相关文章

  • 用c语言打印1000到2000的闰年
    #include<stdio.h>intmain(){intyeaar=0;for(year=1000;year<=2000;year++){if(year%4==0&&year%100!=0)printf("%d",year);elaeif(year%400==0)......
  • ubuntu上cargo run报错error: failed to run custom build command for `openssl-sys
    这是因为使用reqwest的包,用到了openssl的库。按照提示"Makesureyoualsohavethedevelopmentpackagesofopensslinstalled.libssl-devonUbuntuoropenssl-deve......
  • beego入门
    beego的官方仓库地址是 https://github.com/beego/beego为什么要特别说明这个事情呢?因为我们引入的包地址,有可能是从官方fork的,特别是beego,有的教程上通过goget引入的包......
  • go连接mysql
    go连接mysqlpackagemainimport( "database/sql" "fmt" "time" _"github.com/go-sql-driver/mysql")//定义一个全局对象dbvardb*sql.DBfuncinitDB()(......
  • 语言和关键字,运算符
    编译性语言:如Java,是先准备好在执行,先生成中间的字节码文件解释性语言:如javascrip,边翻译边执行取余:取余的主要作用是判断能否整除尽量不要拿浮点数进行比较和运算,会......
  • go下载依赖提示连接失败
    1、现象Go下载模块提示连接失败dialtcp142.251.42.241:443:connectex:Aconnectionattemptfailedbecausetheconnectedpartydidnotproperlyrespondaftera......
  • Django路由层
    目录路由层1.路由匹配2.转换器详3.正则匹配4.正则分组5.反向解析路由层1.路由匹配django2.X及以上path第一个参数写什么就匹配什么django1.X第一个参数是正则表达式......
  • 1007.Django模型基础02
    一、常用的查询常用的查询方法(注:User为app项目):获取所有的记录:rs=User.objects.all()获取第一条数据:rs=User.objects.first()获取最后一条数据:rs=User.objects......
  • MongoDB分片集群搭建
    MongoDB简介MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库......
  • m虚拟MIMO系统的配对调度算法的matlab仿真,对比Random配对,Orthogonal配对以及Detemin
    1.算法概述利用多输入多输出(MIMO,MultipleInputMultipleOutput)技术通过空间复用能够显著的提高通信系统的容量,并可以很好的缓解时/频资源日益紧张的现状。该技术在L......