107.【并发与标准库】(六)

简介: 107.【并发与标准库】

2.标准库os模块之文件读操作

这里结束和file结构体相关的文件读操作

(1).打开和关闭文件
  1. 假如为空就报错

假如文件为空,不会再此创建,而会报错

open, err := os.Open("test.txt") //  返回值:  文件对象和错误信息
package main
import (
  "fmt"
  "os"
)
func openClose() {
  open, err := os.Open("test.txt") //  返回值:  文件对象和错误信息
  if err != nil {
    fmt.Printf("%v", err)
  } else {
    fmt.Printf("已经打开的文件名是: %v\n", open.Name())
  }
  open.Close() // 关闭文件
}
func main() {
  openClose()
}

  1. 假如为空就创建

文件 a.txt是不存在的,我们直接执行就会被创建

package main
import (
  "fmt"
  "os"
)
func openClose() {
  open, err := os.OpenFile("a.txt", os.O_RDWR|os.O_CREATE, 755) // 参数: 文件名. 文件的权限是读和创建 . 主用户可以读写执行其他的读和执行
  if err != nil {
    fmt.Printf("%v", err)
  } else {
    fmt.Printf("已经打开的文件名是: %v\n", open.Name())
  }
  open.Close() // 关闭文件
}
func main() {
  openClose()
}

(2).读取文件

假如说:我们的缓冲区不够大,文件内容读不完。那么我们有两种办法:第一种使用for循环进行一直读取,直到报错信息等于 io.EOF

  1. 第一种for循环读取 read
package main
import (
  "fmt"
  "io"
  "os"
)
func readOps() {
  open, err := os.Open("test.txt") //  返回值:  文件对象和错误信息
  for {
    if err != nil {
      fmt.Printf("%v", err)
    } else {
      fmt.Printf("已经打开的文件名是: %v\n", open.Name())
      bytes := make([]byte, 10)     //创建一个缓冲区,类型是byte数组,大小是10个字节
      read, err := open.Read(bytes) // 进行读取的操作,里面的参数是一个缓冲区 byte数组.---->返回的参数是: 占用的字节数
      if err == io.EOF { //假如说这个错误等于他那么我们就终止循环
        break
      } else {
        fmt.Printf("%v\n", read)
        fmt.Printf("读取到的内容是:%v\n", string(bytes)) //打印我们读取的文件,里面的参数是缓冲区
      }
    }
  }
  open.Close() // 关闭文件
}
func main() {
  readOps()
}

  1. 第二种空间足够大 read
package main
import (
  "fmt"
  "os"
)
func readOps() {
  open, err := os.Open("test.txt") //  返回值:  文件对象和错误信息
  if err != nil {
    fmt.Printf("%v", err)
  } else {
    fmt.Printf("已经打开的文件名是: %v\n", open.Name())
    bytes := make([]byte, 100)    //创建一个缓冲区,类型是byte数组,大小是10个字节
    read, err := open.Read(bytes) // 进行读取的操作,里面的参数是一个缓冲区 byte数组.---->返回的参数是:
    if err != nil {
      fmt.Printf("%v", err)
    } else {
      fmt.Printf("%v\n", read)
      fmt.Printf("读取到的内容是:%v\n", string(bytes)) //打印我们读取的文件,里面的参数是缓冲区
    }
  }
  open.Close() // 关闭文件
}
func main() {
  readOps()
}

  1. 从指定的字节开始读取 reatAt

package main
import (
  "fmt"
  "os"
)
func readOps() {
  open, err := os.Open("test.txt") //  返回值:  文件对象和错误信息
  if err != nil {
    fmt.Printf("%v", err)
  } else {
    fmt.Printf("已经打开的文件名是: %v\n", open.Name())
    bytes := make([]byte, 100)     //创建一个缓冲区,类型是byte数组,大小是10个字节
    at, _ := open.ReadAt(bytes, 3) // 从第几个字节开始读取,前面的不读取
    fmt.Printf("读取的字节个数是:%v\n", at)
    fmt.Printf("读取的内容是:%v\n", string(bytes))
  }
  open.Close() // 关闭文件
}
func main() {
  readOps()
}

  1. 遍历一个目录
package main
import (
  "fmt"
  "os"
)
func readOps() {
  dir, _ := os.ReadDir("a")
  for _, v := range dir {
    fmt.Printf("是否是一个目录: %v", v.IsDir())
    fmt.Printf("目录名字: %v", v.Name())
  }
}
func main() {
  readOps()
}



相关文章
|
4月前
|
算法 数据处理 Python
Python并发编程:解密异步IO与多线程
本文将深入探讨Python中的并发编程技术,重点介绍异步IO和多线程两种常见的并发模型。通过对比它们的特点、适用场景和实现方式,帮助读者更好地理解并发编程的核心概念,并掌握在不同场景下选择合适的并发模型的方法。
|
12月前
|
缓存 Go C语言
107.【并发与标准库】(七)
107.【并发与标准库】
45 0
|
12月前
|
缓存 Go
107.【并发与标准库】(二)
107.【并发与标准库】
38 0
|
4月前
|
数据采集 数据库 C++
python并发编程:并发编程中是选择多线程呢?还是多进程呢?还是多协程呢?
python并发编程:并发编程中是选择多线程呢?还是多进程呢?还是多协程呢?
46 0
|
12月前
|
缓存 索引
107.【并发与标准库】(九)
107.【并发与标准库】
32 0
|
10月前
|
编译器 Linux 调度
|
15天前
|
消息中间件 存储 安全
python多进程并发编程之互斥锁与进程间的通信
python多进程并发编程之互斥锁与进程间的通信
|
2月前
|
数据采集 算法 数据处理
Python中的并发编程:异步IO与多线程对比分析
传统的多线程编程在Python中因为全局解释器锁(GIL)的存在受到限制,导致多线程并不能充分利用多核处理器的优势。本文将探讨Python中的异步IO编程与多线程编程的差异与优劣,并分析适合的应用场景。
|
3月前
|
并行计算 API Python
Python中的并发编程(1)并发相关概念
Python中的并发编程(1)并发相关概念
|
4月前
|
消息中间件 程序员 调度
Python并发编程:利用多线程提升程序性能
本文探讨了Python中的并发编程技术,重点介绍了如何利用多线程提升程序性能。通过分析多线程的原理和实现方式,以及线程间的通信和同步方法,读者可以了解如何在Python中编写高效的并发程序,提升程序的执行效率和响应速度。