目录

  • 文件打开和读写
  • 读取压缩文件
  • 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())
}

  

最新文章

  1. 教你一招:EXCEL单元格随机生成字母
  2. 如何更高效地定制你的bootstrap
  3. DOM之parentNode与offsetParent
  4. atitit.表格的绑定client side 最佳实践
  5. [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程
  6. Server2003系统上的内置服务器设置某类IP无法访问问题
  7. android WebView交互优化
  8. tuple解包给类的构造函数
  9. XenServer6.2详细安装步骤
  10. Generative Learning algorithms
  11. POJ3318【随机化算法挺有意思】
  12. eclipse 设置编辑窗口字体和背景颜色
  13. 前端js之JavaScript
  14. 启动nginx报错问题
  15. linux的时间问题
  16. PYTOGO之旅——环境搭建
  17. JavaScript学习备忘
  18. LVS+Keepalived搭建高可用负载均衡
  19. TCC
  20. On the internet, nobody known you are a dog !

热门文章

  1. JAVA实现种子填充算法
  2. Flask无法访问(127.0.0.1:5000)的问题解决方法
  3. SQL链接服务器查询-OPENQUERY的使用
  4. Asp.netCore 是用的Socket 吗?
  5. Apollo 与 .net core
  6. .net core 杂记:用Autofac替换内置容器
  7. 使用Django时需要注意的八个要点
  8. SAP云平台上的ABAP编程环境里如何消费第三方服务
  9. 笔记一下debian8升级到debian9遇到的几个坑
  10. [原创]extjs htmleditor增加截图快速粘贴功能 插件