01、golang打开文件读出一块文件数据,但是数据读不全
--读取思路:
--打开文件获取操作句柄
--读入一段数据打印
--defer 打开文件句柄之后,立即定义关闭函数
--不论是 os.Open() 还是 file.Read 函数。返回的都有err,需要对err判断是否被打开 对err判断是否读取完毕
--func Open(name string) (file *File, err error)
--Open打开一个文件用于打开。返回对象为:
--file:文件操作符,用于后续操作文件
--err: 用于判断
--代码示例如下:
func main(){
// 只读方式打开一个文件,获取文件操作句柄。希望能够通过闭包或上下文管理来完成函数
file, err := os.Open("test.txt")
if err != nil { // 错误不为空,就是有错误
fmt.Println("open file failed", err)
return
}
defer file.Close() // 定义文件关闭,以免忘记
// 通过句柄打开文件
var tmp = make([]byte, 128)
n, err01 := file.Read(tmp)
if err01 == io.EOF{
fmt.Println("文件读完了")
return
}
if err01 != nil{
fmt.Println("read file failed, err", err)
return
}
fmt.Printf("读取了%d字节的数据\n", n)
fmt.Println(string(tmp[:n]))
}
02、golang打开文件循环读取:这是一次读取一块数据,全部文件数据
func main(){
// 只读方式打开一个文件,获取文件操作句柄。希望能够通过闭包或上下文管理来完成函数
file, err := os.Open("test.txt")
if err != nil { // 如果读取失败报错
fmt.Println("open file failed", err)
return
}
defer file.Close() // 定义文件关闭,以免忘记
// 通过句柄打开文件
var content []byte
var tmp = make([]byte, 128)
for{
n, err := file.Read(tmp)
if err == io.EOF{ // 文件读完了
fmt.Println("文件读完了")
break
}
if err != nil{ // 文件读完且没有出错
fmt.Println("读取文件出错了")
return
}
content = append(content, tmp[:n]...) // 这个表示切片一次
}
fmt.Println(string(content))
}
03、bufio读取文件 -- 逐行读取
func main(){
// 只读方式打开一个文件,获取文件操作句柄[打开通道]。希望能够通过闭包或上下文管理来完成函数
file, err := os.Open("test.txt")
if err != nil { // 如果读取失败报错
fmt.Println("open file failed", err)
return
}
defer file.Close() // 定义文件关闭,以免忘记
// 打开文件
reader := bufio.NewReader(file) // 获取文件地址
for{
line, err := reader.ReadString('\n') // 按照\n切割字符串
if err == io.EOF{
if len(line) != 0{
fmt.Println(line)
}
fmt.Println("文件读取完毕")
break
}
if err != nil{
fmt.Println("读文件报错", err)
return
}
fmt.Println(line)
}
}
04、ioutil -- 读取整个文件,只需要传入文件地址即可
// 打开文件读入通道
content, err := ioutil.ReadFile("test.txt")
if err!=nil{
fmt.Println("read file error", err)
return
}
fmt.Println(string(content))
05、文件写入 -- os.OpenFile()
函数
--os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
...
}
--name:要打开的文件名
--flag:打开文件的模式
--perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。在Linux中就是文件权限,例如777。这个参数对于windows系统没有意义
--模式有以下几种:
模式 含义 -- 对应常数
os.O_WRONLY -- 只写 -- 0x00001
os.O_CREATE -- 创建文件 -- 0x00040
os.O_RDONLY -- 只读 -- 0x00000
os.O_RDWR -- 读写 -- 0x00002
os.O_TRUNC -- 清空 -- 0x00200
os.O_APPEND -- 追加 -- 0x00400
--在go语言中标志位类型为int,通过标志位之间的 | 操作,并按照二进制位上的1来判断有哪些模式被启用
--如果文件不存在且要写入时,会报错如下:
open file failed open write_in.txt: The system cannot find the file specified.
--Write和WriteString
--Write:按照字节写入
--WriteString:按照字符串写入
--代码示例:
func main(){
// 准备写入文件时需要设定不同的模式
fileObj, err := os.OpenFile("write_in.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil{
fmt.Println("open file failed", err)
return
}
defer fileObj.Close() // 关闭文件
// Write
fileObj.Write([]byte("不惭于景\n"))
// WriteString
fileObj.WriteString("慎其独也")
}
--bufio.NewWriter
--逐行读入
--代码示例:
func main(){
// 准备写入文件时需要设定不同的模式
fileObj, err := os.OpenFile("write_in.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil{
fmt.Println("open file failed", err)
return
}
defer fileObj.Close() // 关闭文件
writer := bufio.NewWriter(fileObj)
for i := 0; i < 1000; i++ {
writer.WriteString("hello沙河\n") //将数据先写入缓存
}
writer.Flush() //将缓存中的内容写入文件
}
--ioutil.WriteFile
--更加高级的写入函数
--代码示例如下:
str := "hello 沙河"
err := ioutil.WriteFile("./xx.txt", []byte(str), 0666)
if err != nil {
fmt.Println("write file failed, err:", err)
return
}