【原创】go语言学习(十五)IO操作2
2024-08-26 14:35:09
目录
- 文件打开和读写
- 读取压缩文件
- bufio原理和cat命令实现
- defer详解
文件打开和读写
1、 文件是存储在外部介质上的数据集合。
A. 文件分类:文本文件和二进制文件
B. 文件存取方式:随机存取和顺序存放
2、文件打开
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//只读的方式打开
inputFile, err := os.Open("input.dat")
if err != nil {
fmt.Printf("open file err:%v\n", err)
return
}
defer inputFile.Close()
}
3、文件读取, file.Read和file.ReadAt。读到文件末尾返回:io.EOF
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
//只读的方式打开
inputFile, err := os.Open("input.dat")
if err != nil {
fmt.Printf("open file err:%v\n", err)
return
}
var buf[128]byte
inputFile.Read(buf[:])
defer inputFile.Close()
}
4、 bufio原理
5、bufio读取文件
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
inputFile, err := os.Open("input.dat")
if err != nil {
fmt.Printf("open file err:%v\n", err)
return
}
defer inputFile.Close()
inputReader := bufio.NewReader(inputFile)
for {
inputString, readerError := inputReader.ReadString('\n')
if readerError == io.EOF {
return
}
fmt.Printf("The input was: %s", inputString)
}
}
6、读取整个文件示例
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
inputFile := "products.txt"
outputFile := "products_copy.txt"
buf, err := ioutil.ReadFile(inputFile)
if err != nil {
fmt.Fprintf(os.Stderr, "File Error: %s\n", err)
return
}
fmt.Printf("%s\n", string(buf))
}
读取压缩文件
1、读取压缩文件
package main
import (
"bufio"
"compress/gzip"
"fmt"
"os"
)
func main() {
fName := "MyFile.gz"
var r *bufio.Reader
fi, err := os.Open(fName)
if err != nil {
fmt.Fprintf(os.Stderr, "%v, Can’t open %s: error: %s\n", os.Args[0], fName, err)
os.Exit(1)
}
fz, err := gzip.NewReader(fi)
if err != nil {
fmt.Fprintf(os.Stderr, "open gzip failed, err: %v\n", err)
return
}
r = bufio.NewReader(fz)
for {
line, err := r.ReadString('\n')
if err != nil {
fmt.Println("Done reading file")
os.Exit(0)
}
fmt.Println(line)
}
}
bufio原理和cat命令实现
1、文件写入
文件读写
os.OpenFile(“output.dat”, os.O_WRONLY|os.O_CREATE, 0666)
1. os.O_WRONLY:只写
第二个参数:文件打开模式
:
r ——> 004
w——> 002
x——> 001
第三个参数:权限控制:
2. os.O_CREATE:创建文件
3. os.O_RDONLY:只读
4. os.O_RDWR:读写
5. os.O_TRUNC :清空
6. os. O_APPEND:追加
2、文件写入示例
file.Write()
file.WriteAt()
file.WriteString()
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
outputFile, outputError := os.OpenFile("output.dat",
os.O_WRONLY|os.O_CREATE, 0666)
if outputError != nil {
fmt.Printf("An error occurred with file creation\n")
return
}
str := “hello world”
outputFile.Write([]byte(str))
defer outputFile.Close()
}
3、 文件写入示例
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
outputFile, outputError := os.OpenFile("output.dat",
os.O_WRONLY|os.O_CREATE, 0666)
if outputError != nil {
fmt.Printf("An error occurred with file creation\n")
return
}
defer outputFile.Close()
outputWriter := bufio.NewWriter(outputFile)
outputString := "hello world!\n"
for i := 0; i < 10; i++ {
outputWriter.WriteString(outputString)
}
outputWriter.Flush()
}
4、写入整个文件示例
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
inputFile := "products.txt"
outputFile := "products_copy.txt"
buf, err := ioutil.ReadFile(inputFile)
if err != nil {
fmt.Fprintf(os.Stderr, "File Error: %s\n", err)
return
}
fmt.Printf("%s\n", string(buf))
err = ioutil.WriteFile(outputFile, buf, 0x644)
if err != nil {
panic(err.Error())
}
}
5、拷贝文件
package main
import (
"fmt"
"io"
"os"
)
func main() {
CopyFile("target.txt", "source.txt")
fmt.Println("Copy done!")
}
func CopyFile(dstName, srcName string) (written int64, err error) {
src, err := os.Open(srcName)
if err != nil {
return
}
defer src.Close()
dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
return
}
defer dst.Close()
return io.Copy(dst, src)
}
6、cat命令实现
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
)
func cat(r *bufio.Reader) {
for {
buf, err := r.ReadBytes('\n')
if err == io.EOF {
break
}
fmt.Fprintf(os.Stdout, "%s", buf)
return
}
}
func main() {
flag.Parse()
if flag.NArg() == 0 {
cat(bufio.NewReader(os.Stdin))
}
for i := 0; i < flag.NArg(); i++ {
f, err := os.Open(flag.Arg(i))
if err != nil {
fmt.Fprintf(os.Stderr, "%s:error reading from %s: %s\n",
os.Args[0], flag.Arg(i), err.Error())
continue
}
cat(bufio.NewReader(f))
}
}
defer详解
1、defer原理分析
2、defer案例
package main
import (
"fmt"
)
func funcA() int {
x := 5
defer func() {
x += 1
}()
return x
}
func main() {
fmt.Println(funcA())
}
3、defer案列2
package main
import "fmt"
func funcB() (x int) {
defer func() {
x += 1
}()
return 5
}
func main() {
fmt.Println(funcB())
}
4、defer案例3
package main
import "fmt"
func funcC() (y int) {
x := 5
defer func() {
x += 1
}()
return x
}
func main() {
fmt.Println(funcC())
}
5、defer案例4
package main
import "fmt"
func funcD() (x int) {
defer func(x int) {
x += 1
}(x)
return 5
}
func main() {
fmt.Println(funcD())
}
最新文章
- 教你一招:EXCEL单元格随机生成字母
- 如何更高效地定制你的bootstrap
- DOM之parentNode与offsetParent
- atitit.表格的绑定client side 最佳实践
- [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程
- Server2003系统上的内置服务器设置某类IP无法访问问题
- android WebView交互优化
- tuple解包给类的构造函数
- XenServer6.2详细安装步骤
- Generative Learning algorithms
- POJ3318【随机化算法挺有意思】
- eclipse 设置编辑窗口字体和背景颜色
- 前端js之JavaScript
- 启动nginx报错问题
- linux的时间问题
- PYTOGO之旅——环境搭建
- JavaScript学习备忘
- LVS+Keepalived搭建高可用负载均衡
- TCC
- On the internet, nobody known you are a dog !
热门文章
- JAVA实现种子填充算法
- Flask无法访问(127.0.0.1:5000)的问题解决方法
- SQL链接服务器查询-OPENQUERY的使用
- Asp.netCore 是用的Socket 吗?
- Apollo 与 .net core
- .net core 杂记:用Autofac替换内置容器
- 使用Django时需要注意的八个要点
- SAP云平台上的ABAP编程环境里如何消费第三方服务
- 笔记一下debian8升级到debian9遇到的几个坑
- [原创]extjs htmleditor增加截图快速粘贴功能 插件