package main
import ( "bufio" "fmt" "io" "io/ioutil" "os" "strconv" )
/*
文件和目录操作
文件的读取
一:读取文件(方法1)
1:只读方式打开文件file,err:=os.Open()
2:读取文件file.Read()
3:关闭文件流Defer file.Close()
二:读取文件(方法2)bufio读取文件
1:只读方式打开文件file,err:=os.Open()
2:创建Reader对象reader:=bufio.NewReader(file)
3:ReadString读取文件 line,err:=reader.ReadString('\n')
4:关闭文件流defer file.Close()
三:读取文件(方法3)ioutil读取文件
打开关闭文件的方法它都封装好了,只需要一句话就可以读取
ioutil.ReadFile("./main.go")
文件的写入
一:写入文件(方法1)
//打开并创建对应的权限
1:打开文件file,err:=os.OpenFile("I:/go/src/channel7/channel7.go",os.O_CREATE|OS.O_RDWR,0666)
2:写入文件
file.Write([]byte(str))//写入字节切片数据
file.WriteString("直接写入的字符串数据")//直接写入字符串
3:关闭文件流file.Close()
二:写入文件(方法2)bufio写入文件
1:打开文件file,err:=os.OpenFile("I:/go/src/channel7/channel7.go")
2:创建Writer对象writer:=bufio.NewWriter(file)
3:将数据先写入缓存writer.WriteString("hello golang")
4:将缓存中的内容写入文件Writer.Flush()
5:关闭文件游戏file.Close()
三:写入文件(方法3)ioutil写入文件
str:="hello golang"
err:=ioutil.WriteFile("I:/go/src/channel7/channel7.go",[]byte(str),0666)
*/
func main() {
fmt.Println("---------------------file.Read读取文件(只读)")
//test1()
fmt.Println("---------------------bufio读取文件(只读)")
//test2()
fmt.Println("---------------------ioutil读取文件(只读)")
/*
test3方法简单,适用于小文件
不用手动关闭,判断是否读取完毕等
*/
//test3()
//////////////////////如下为写入
fmt.Println("---------------------file.WriteString写入文件")
//test4()
fmt.Println("---------------------bufio写入文件")
//test5()
fmt.Println("---------------------ioutil写入文件")
test6()
}
func test6() {
str := "hello golang111111111111"
err := ioutil.WriteFile("./test.txt", []byte(str), 0666)
if err != nil {
fmt.Println("写入文件失败,err", err)
return
}
/*
直接清空????
*/
} func test5() {
file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666)
defer file.Close()
if err != nil {
fmt.Println("打开文件失败")
return
}
writer := bufio.NewWriter(file)
/*
//方法一:单条写入
writer.WriteString("hello golang") //将数据写入缓存,注意,一定要紧跟一个writer.Flush()
writer.Flush()
*/
for i := 0; i < 10; i++ {
writer.WriteString("hello golang" + strconv.Itoa(i) + "\r\n")
}
writer.Flush()
}
func test4() {
/*
func OpenFile(name string,flag int,perm FileMode)(*File,error)
name:要打开的文件名
flag:打开文件的模式:
os.O_WRONLY 只写
os.O_CREATE 创建文件
os.O_RDONLY 只读
os.O_RDWR 读写
os.O_TRUNC 清空
os.O_APPEND 追加
perm:文件权限,一个8进制数:r(读)04,w(写)02,x(执行)01
//主要给Linux使用的
//一般写0666即所有组合都有权限
*/
file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666)
defer file.Close()
if err != nil {
fmt.Println("打开失败")
return
}
/*
//方式一:
file.WriteString("直接写入的字符串")//一次只写入一行数据
//要写入多行,则使用for循环
*/
/*
//方式一循环
for i := 0; i < 10; i++ {
//如果是txt文件,必须是\r\n
file.WriteString("直接写入的字符串" + strconv.Itoa(i) + "\r\n") //一次只写入一行数据
}
*/
//方式二
var str = "直接写入字符串"
file.Write([]byte(str))
} func test3() {
byteStr, err := ioutil.ReadFile("I:/go/src/channel7/channel7.go")
if err != nil {
fmt.Println("打开失败")
return
}
fmt.Println(string(byteStr))
}
func test2() {
file, err := os.Open("I:/go/src/channel7/channel7.go")
defer file.Close()
if err != nil {
fmt.Println("打开失败")
return
}
reader := bufio.NewReader(file)
var fileStr string
for {
str, err := reader.ReadString('\n') //一次读取一行
if err == io.EOF {
fmt.Println("读取完毕")
fileStr += str //因为在读取完毕前,可能还有数据,所以需要再加一条
break
}
if err != nil {
fmt.Println(err)
return
}
fileStr += str
}
fmt.Println(fileStr)
/*
str, err := reader.ReadString('\n') //表示一次读取一行
if err != nil {
fmt.Println(err)
return
}
fmt.Println(str)
*/ //因为是一次读取一行,所以还是通过For循环来进行读取
} func test1() { //以只读方法打开文件 //打开文件
file, err := os.Open("I:/go/src/channel7/channel7.go") //绝对路径
//file, err := os.Open("./fileDir.go")//相对路径
defer file.Close()
if err != nil {
fmt.Println("打开失败")
return
}
fmt.Println(file) //&{0xc000122780}//一个指针类型的返回值
//2:读取文件
//由于返回值是一个[]byte,所以先定义个切片
var tempSlice = make([]byte, 128) //128表示每次读取多少个字节
/*
n, err := file.Read(tempSlice)
if err != nil {
fmt.Println("读取失败")
}
fmt.Printf("读取到了%v个字节\n", n)
fmt.Println(string(tempSlice))//这里只显示了文件的一部份内容,因为每次只读取128个字节的内容,解决办法为:使用For循环读取
*/
var strSlice []byte
for {
n, err := file.Read(tempSlice)
if err == io.EOF {
fmt.Println("读取完毕")
return
}
if err != nil {
fmt.Println("读取失败")
return
}
//strSlice = append(strSlice, tempSlice...)//由于是切片,每次读取128字节.将会在最后出错,所以改为下行.并将返回的N取回
strSlice = append(strSlice, tempSlice[:n]...)
fmt.Println(string(strSlice))
}
}