go语言io操作

文章目录[x]
  1. 1:file文件操作
  2. 1.1:路径
  3. 1.2:创建文件夹(单层)
  4. 1.3:创建多层文件夹
  5. 1.4:其他文件操作,都是比较简单的,直接看一下就明白的
  6. 2:reader读取操作
  7. 3:write
  8. 4:bufio:高效io读写
  9. 4.1:读操作

虽然说这一章知识有点多,但是还得记,虽然倍感枯燥,但是小生想说的是,也许孤独可以使人冷静。

最近在网易云上听了一首歌,感觉挺有意思的,在这里,小生与诸君共勉之~

file文件操作


FileInfo接口中定义了File信息相关的方法。

package main

import (
"os"
"fmt"
)

func main() {
/*
FileInfo:文件信息
interface
Name(),文件名
Size(),文件大小,字节为单位
IsDir(),是否是目录
ModTime(),修改时间
Mode(),权限

*/
fileInfo,err := os.Stat("/home/yvam/go/src/demo/a.txt")
if err != nil{
fmt.Println("err :",err)
return
}
fmt.Printf("%T\n",fileInfo)
//文件名
fmt.Println(fileInfo.Name())
//文件大小
fmt.Println(fileInfo.Size())
//是否是目录
fmt.Println(fileInfo.IsDir()) //IsDirectory
//修改时间
fmt.Println(fileInfo.ModTime())
//权限
fmt.Println(fileInfo.Mode()) //-rw-r--r--
}

上面的程序,打印了一些文件的基本信息,下面是打印结果

*os.fileStat
a.txt
4
false
2020-09-18 19:54:25.843344317 +0800 CST
-rw-r--r--

路径

fileName1:="/home/yvam/go/src/demo/a.txt"
fileName2:="bb.txt"
fmt.Println(filepath.IsAbs(fileName1)) //true
fmt.Println(filepath.IsAbs(fileName2)) //false
fmt.Println(filepath.Abs(fileName1))
fmt.Println(filepath.Abs(fileName2)) // /Users/ruby/go/src/l_file/bb.txt

fmt.Println("获取父目录:",path.Join(fileName1,".."))

执行结果

true
false
/home/yvam/go/src/demo/a.txt <nil>
/home/yvam/go/src/demo/bb.txt <nil>
获取父目录: /home/yvam/go/src/demo

创建文件夹(单层)

err := os.Mkdir("/home/yvam/go/src/demo/bb",os.ModePerm)
	if err != nil{
		fmt.Println("err:",err)
		return
	}
	fmt.Println("文件夹创建成功。。")

执行结果:

创建多层文件夹

err :=os.MkdirAll("/home/yvam/go/src/demo//a/cc/dd/ee",os.ModePerm)
	if err != nil{
		fmt.Println("err:",err)
		return
	}
	fmt.Println("多层文件夹创建成功")

其他文件操作,都是比较简单的,直接看一下就明白的

//3.创建文件:Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)
file1,err :=os.Create("/home/yvam/go/src/demo/a/ab.txt")
if err != nil{
fmt.Println("err:",err)
return
}
fmt.Println(file1)

file2,err := os.Create(fileName2)//创建相对路径的文件,是以当前工程为参照的
if err != nil{
fmt.Println("err :",err)
return
}
fmt.Println(file2)

//4.打开文件:
file3 ,err := os.Open(fileName1) //只读的
if err != nil{
fmt.Println("err:",err)
return
}
fmt.Println(file3)
/*
第一个参数:文件名称
第二个参数:文件的打开方式
const (
// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
O_RDONLY int = syscall.O_RDONLY // open the file read-only.
O_WRONLY int = syscall.O_WRONLY // open the file write-only.
O_RDWR int = syscall.O_RDWR // open the file read-write.
// The remaining values may be or'ed in to control behavior.
O_APPEND int = syscall.O_APPEND // append data to the file when writing.
O_CREATE int = syscall.O_CREAT // create a new file if none exists.
O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist.
O_SYNC int = syscall.O_SYNC // open for synchronous I/O.
O_TRUNC int = syscall.O_TRUNC // truncate regular writable file when opened.
)
第三个参数:文件的权限:文件不存在创建文件,需要指定权限
*/
file4,err := os.OpenFile(fileName1,os.O_RDONLY|os.O_WRONLY,os.ModePerm)
if err != nil{
fmt.Println("err:",err)
return
}
fmt.Println(file4)

//5关闭文件,
file4.Close()

//6.删除文件或文件夹:
//删除文件
err := os.Remove("/home/yvam/go/src/demo/a/aa.txt")
if err != nil{
fmt.Println("err:",err)
return
}
fmt.Println("删除文件成功。。")
删除目录
err := os.RemoveAll("/home/yvam/go/src/demo/a/cc")
if err != nil{
fmt.Println("err:",err)
return
}
fmt.Println("删除目录成功。。")

reader读取操作


直接看代码呢

package main

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

func main() {
/*
读取数据:
Reader接口:
Read(p []byte)(n int, error)
*/
//读取本地aa.txt文件中的数据
//step1:打开文件
fileName := "/home/yvam/go/src/demo/a.txt"
file,err := os.Open(fileName)
if err != nil{
fmt.Println("err:",err)
return
}
//step3:关闭文件
defer file.Close()

//step2:读取数据
bs := make([]byte,4,4)

//第一次读取
n,err :=file.Read(bs)
fmt.Println(err) //<nil>
fmt.Println(n) //4
fmt.Println(bs) //[97 98 99 100]
fmt.Println(string(bs)) //abcd
/*
//第二次读取
n,err = file.Read(bs)
fmt.Println(err)//<nil>
fmt.Println(n)//4
fmt.Println(bs) //[101 102 103 104]
fmt.Println(string(bs)) //efgh

//第三次读取
n,err = file.Read(bs)
fmt.Println(err) //<nil>
fmt.Println(n) //2
fmt.Println(bs) //[105 106 103 104]
fmt.Println(string(bs)) //ijgh

//第四次读取
n,err = file.Read(bs)
fmt.Println(err) //EOF
fmt.Println(n) //0
*/
n = -1
fmt.Println("**********")

//设置鼠标指针的位置
file.Seek(0,0)
for{
n,err = file.Read(bs)
if n == 0 || err == io.EOF{
fmt.Println("读取到了文件的末尾,结束读取操作。。")
break
}
fmt.Println(string(bs[:n]))
}
}

执行结果:

<nil>
4
[97 98 99 100]
abcd
**********
abcd
efgh
ijkl
mnop
qrst
uvwx
wz
读取到了文件的末尾,结束读取操作。。

write


package main
import (
"os"
"fmt"
"log"
)

func main() {
/*
写出数据:
*/

fileName := "/home/yvam/go/src/demo/ab.txt"
//step1:打开文件
//step2:写出数据
//step3:关闭文件
//file,err := os.Open(fileName)
file,err := os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY|os.O_APPEND,os.ModePerm)
if err != nil{
fmt.Println(err)
return
}
defer file.Close()

//写出数据
//bs :=[]byte{65,66,67,68,69,70}//A,B,C,D,E,F
bs :=[] byte{97,98,99,100} //a,b,c,d
//n,err := file.Write(bs)
n,err := file.Write(bs[:2])
fmt.Println(n)
HandleErr(err)
file.WriteString("\n")

//直接写出字符串
n,err = file.WriteString("HelloWorld")
fmt.Println(n)
HandleErr(err)

file.WriteString("\n")
n,err =file.Write([]byte("today"))
fmt.Println(n)
HandleErr(err)

}

func HandleErr(err error){
if err != nil{
log.Fatal(err)
}
}

bufio:高效io读写


读操作

package main

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

func main() {
/*
bufio:高效io读写
buffer缓存
io:input/output

将io包下的Reader,Write对象进行包装,带缓存的包装,提高读写的效率

ReadBytes()
ReadString()
ReadLine()

*/

fileName:="/home/yvam/go/src/demo/ab.txt"
file,err := os.Open(fileName)
if err != nil{
fmt.Println(err)
return
}
defer file.Close()

//创建Reader对象
b1 := bufio.NewReader(file)
//1.Read(),高效读取
//p := make([]byte,1024)
//n1,err := b1.Read(p)
//fmt.Println(n1)
//fmt.Println(string(p[:n1]))

//2.ReadLine()
data,flag,err := b1.ReadLine()
fmt.Println(flag)
fmt.Println(err)
fmt.Println(data)
fmt.Println(string(data))

//3.ReadString()
s1,err :=b1.ReadString('\n')
fmt.Println(err)
fmt.Println(s1)

s1,err = b1.ReadString('\n')
fmt.Println(err)
fmt.Println(s1)

s1,err = b1.ReadString('\n')
fmt.Println(err)
fmt.Println(s1)

for{
s1,err := b1.ReadString('\n')
if err == io.EOF{
fmt.Println("读取完毕。。")
break
}
fmt.Println(s1)
}

//4.ReadBytes()
data,err =b1.ReadBytes('\n')
fmt.Println(err)
fmt.Println(string(data))

data1,err :=b1.ReadBytes('\n')
fmt.Println(err)
fmt.Println(string(data1))

//Scanner
//s2 := ""
//fmt.Scanln(&s2)
//fmt.Println(s2)

/* b2 := bufio.NewReader(os.Stdin)
s2, _ := b2.ReadString('\n')
fmt.Println(s2)
*/
}

写操作

package main

import (
"os"
"fmt"
"bufio"
)

func main() {
/*
bufio:高效io读写
buffer缓存
io:input/output

将io包下的Reader,Write对象进行包装,带缓存的包装,提高读写的效率

func (b *Writer) Write(p []byte) (nn int, err error)
func (b *Writer) WriteByte(c byte) error
func (b *Writer) WriteRune(r rune) (size int, err error)
func (b *Writer) WriteString(s string) (int, error)

*/

fileName := "/home/yvam/go/src/demo/cc.txt"
file,err := os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY,os.ModePerm)
if err != nil{
fmt.Println(err)
return
}
defer file.Close()

w1 := bufio.NewWriter(file)
//n,err := w1.WriteString("helloworld")
//fmt.Println(err)
//fmt.Println(n)
//w1.Flush() //刷新缓冲区

for i:=1;i<=1000;i++{
w1.WriteString(fmt.Sprintf("%d:hello\n",i))
}
w1.Flush()
}

代码都比较简单易懂

 

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00