读取文件的三种方法
package main
import (
"fmt"
"os"
)
func main() {
fileobj, err := os.Open("E:\\goproject\\src\\gocode\\code1\\xx.txt") //打开一个文件只读,./代表同目录下的文件
if err != nil {
fmt.Printf("open file failed ,err:%v\n", err)
return
}
//读取文件内容
defer fileobj.Close() //defer的作用是程序即将退出时才进行关闭文件
var tem = make([]byte, 128) //读取时要使用切片 所以进行了创建,一次性只能读128个,想要读完,就必须采用循环的读法
n, err := fileobj.Read(tem) //n为文件中的字节数 err为错误
if err != nil {
fmt.Printf("read file failed ,err:%v\n", err)
return
}
fmt.Printf("read %d bytes from file.\n", n)
fmt.Println(string(tem))
}
循环读入
package main
import (
"fmt"
"io"
"os"
)
func ReadAll() {
fileobj, err := os.Open("E:\\goproject\\src\\gocode\\code1\\xx.txt") //打开一个文件只读,./代表同目录下的文件
if err != nil {
fmt.Printf("open file failed ,err:%v\n", err)
return
}
//读取文件内容
defer fileobj.Close()
for {
var tem = make([]byte, 128) //每次读128个字节的数据
n, err := fileobj.Read(tem)
if err == io.EOF { // end of file
//把当前读了多少个字节数据打印出来,然后退出
fmt.Println(string(tem[:n]))
return
}
if err != nil {
fmt.Printf("read file failed ,err:%v\n", err)
return
}
fmt.Printf("read %d bytes from file.\n", n)
fmt.Println(string(tem[:n]))
}
}
func main() {
ReadAll()
}
使用bufio读取文件
// read by bufio
func ReadBufio() {
fileobj, err := os.Open("E:\\goproject\\src\\gocode\\code1\\xx.txt") //打开一个文件只读,./代表同目录下的文件
if err != nil {
fmt.Printf("open file failed ,err:%v\n", err)
return
}
//读取文件内容
defer fileobj.Close()
reader := bufio.NewReader(fileobj) //传入文件对象
for {
line, err := reader.ReadString('\n') //read什么返回什么
if err == io.EOF {
fmt.Print(line)
return
}
if err != nil {
fmt.Printf("read file by bufio failed,err:%v\n", err)
}
fmt.Print(line)
}
}
使用os读取原为outil中
// 使用os读取
func reados() {
file, err := os.ReadFile("E:\\goproject\\src\\gocode\\code1\\xx.txt")
if err != nil {
fmt.Printf("read by os failed ,err:%v\n", err)
return
}
fmt.Println(string(file)) //强制转化为string类型,原本为字节类型
}
ps。这种方法无法读取内存过大的文件
整体代码:
package main
import (
"bufio"
"fmt"
"io"
"os"
)
// 只读一次
func ReadOnly() {
fileobj, err := os.Open("E:\\goproject\\src\\gocode\\code1\\xx.txt") //打开一个文件只读,./代表同目录下的文件
if err != nil {
fmt.Printf("open file failed ,err:%v\n", err)
return
}
//读取文件内容
defer fileobj.Close()
var tem = make([]byte, 128) //每次读128个字节的数据
n, err := fileobj.Read(tem)
if err != nil {
fmt.Printf("read file failed ,err:%v\n", err)
return
}
fmt.Printf("read %d bytes from file.\n", n)
fmt.Println(string(tem[:n]))
}
func ReadAll() {
fileobj, err := os.Open("E:\\goproject\\src\\gocode\\code1\\xx.txt") //打开一个文件只读,./代表同目录下的文件
if err != nil {
fmt.Printf("open file failed ,err:%v\n", err)
return
}
//读取文件内容
defer fileobj.Close()
for {
var tem = make([]byte, 128) //每次读128个字节的数据
n, err := fileobj.Read(tem)
if err == io.EOF { // end of file
//把当前读了多少个字节数据打印出来,然后退出
fmt.Println(string(tem[:n]))
return
}
if err != nil {
fmt.Printf("read file failed ,err:%v\n", err)
return
}
fmt.Printf("read %d bytes from file.\n", n)
fmt.Println(string(tem[:n]))
}
}
// read by bufio
func ReadBufio() {
fileobj, err := os.Open("E:\\goproject\\src\\gocode\\code1\\xx.txt") //打开一个文件只读,./代表同目录下的文件
if err != nil {
fmt.Printf("open file failed ,err:%v\n", err)
return
}
//读取文件内容
defer fileobj.Close()
reader := bufio.NewReader(fileobj) //传入文件对象
for {
line, err := reader.ReadString('\n') //read什么返回什么
if err == io.EOF {
fmt.Print(line)
return
}
if err != nil {
fmt.Printf("read file by bufio failed,err:%v\n", err)
}
fmt.Print(line)
}
}
// 使用os读取
func reados() {
file, err := os.ReadFile("E:\\goproject\\src\\gocode\\code1\\xx.txt")
if err != nil {
fmt.Printf("read by os failed ,err:%v\n", err)
return
}
fmt.Println(string(file)) //强制转化为string类型,原本为字节类型
}
func main() {
reados()
}
文件写入
想要文件写入,必须采用os.openfile
路径//写入方式:见下图//文件权限
// 写入
func Write() {
fileobj, err := os.OpenFile("E:\\goproject\\src\\gocode\\code1\\xx.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) //所有要进行写入的操作都写到这段话中
if err != nil {
fmt.Printf("open file failed,err:%v\n", err)
return
}
defer fileobj.Close()
str := "帅比lzy"
fileobj.Write([]byte(str))
fileobj.WriteString("aloha")
}
func writebybufio() {
fileobj, err := os.OpenFile("E:\\goproject\\src\\gocode\\code1\\xx.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) //所有要进行写入的操作都写到这段话中
if err != nil {
fmt.Printf("open file failed,err:%v\n", err)
return
}
defer fileobj.Close()
writer := bufio.NewWriter(fileobj)
writer.WriteString("genshen impact start")
writer.Flush() //将缓冲区的内容写入,十分必要的语句
}
func writebyos() {
str := "yeyeyeyey!"
err := os.WriteFile("E:\\goproject\\src\\gocode\\code1\\xx.txt", []byte(str), 0644)
if err != nil {
fmt.Printf("write file failed,err:%v\n", err)
return
}
}