Go- 文件读写 -1
发布于: 4 小时前
Go 学习笔记,学习内容《Go入门指南》
主要介绍以下内容:
读取键盘和标准输入
读取字符串
利用 bufio 包从标准输入读取数据
利用 bufio 包读文件
读取整个文件
读取压缩文件
写文件
文件拷贝
代码示例可以直接运行
package main
import (
"bufio"
"compress/gzip"
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
)
func printDivider(str ...string) {
fmt.Println()
fmt.Println("-----------------------------------------------")
if len(str) > 0 {
fmt.Println(str)
}
}
var (
firstName, lastName, s string
i int
f float32
)
func main() {
/*
读取键盘和标准输入
*/
printDivider("读取键盘和标准输入")
fmt.Println("Please input your full name: ")
//fmt.Scanln(&firstName, &lastName)
//fmt.Printf("Hi %s %s\n", firstName, lastName)
/*
读取字符串
Sscan开头的函数都是从字符串读取
*/
printDivider("读取字符串")
fmt.Sscanf("3.14,100,Hello", "%f,%d,%s", &f, &i, &s)
fmt.Printf("From the string, we read %f, %d, %s\n", f, i, s)
/*
利用bufio包从标准输入读取数据
*/
printDivider("利用bufio包提供的缓冲读取来读取数据")
inputReader := bufio.NewReader(os.Stdin) // 创建一个读取器,并且与标准输入绑定
fmt.Println("Please enter your name: ")
input, err := inputReader.ReadString('\n') // 读取到\n结束,返回的input包含\n
if err != nil {
fmt.Println("There were errors reading, error: ", err)
fmt.Println("exiting program.")
return
}
fmt.Printf("Your name is %s", input)
switch input {
case "Philip\r\n":
fallthrough
case "Chris\r\n":
fallthrough
case "Ivo\r\n":
fmt.Printf("Welcome %s\n", input)
default:
fmt.Printf("You are not welcome here, Goodbye\n")
}
/*
利用bufio包读文件
*/
printDivider("利用bufio包读文件")
inputFile, inputError := os.Open("person.go") // 默认以只读方式打开文件,inputFile类型:*os.File
if inputError != nil {
fmt.Printf("An error occurred on opening the inputfile\n" +
"Does the file exist?\n" +
"Have you got access to it?\n")
return
}
defer inputFile.Close()
inputReader = bufio.NewReader(inputFile) // NewReader函数参数类型:*os.File
for {
inputString, readerError := inputReader.ReadString('\n') // windows和Linux的文件换行符不同,不用关心操作系统类型,直接使用\n就可以
fmt.Printf("The input was: %s", inputString)
if readerError == io.EOF {
break
}
}
/*
读取整个文件
*/
printDivider("读取整个文件")
inFile := "person.go"
outFile := "person_copy.go"
buf, err := ioutil.ReadFile(inFile)
if err != nil { // 若文件不存在,运行错误:File Error: open person-.go: The system cannot find the file specified.
fmt.Fprintf(os.Stderr, "File Error: %s\n", err)
//fmt.Fprintf(os.Stderr, "File Error: %s\n", err.Error())
}
fmt.Printf("%s\n", string(buf))
err = ioutil.WriteFile(outFile, buf, 0644) // err类型是接口类型,调用接口内的函数Error()输出错误信息
if err != nil {
panic(err.Error())
}
filename := filepath.Base("/path/to/golang/")
fmt.Println(filename) // 输出:golang
/* 对于各种格式的文件处理,可以从go package中找到对应的包处理,找不到的时候,自己实现处理 */
/*
读取压缩文件
支持压缩文件类型:gzip、flate、bzip2、lzw、zlib
*/
printDivider("读取压缩文件")
fName := "person.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) // 输出:C:\Users\ADMINI~1\AppData\Local\Temp\go-build2880183904\b001\exe\038_Read.exe, Can't open person.zip, error: open person.zip: The system cannot find the file specified.
}
fz, err := gzip.NewReader(fi)
if err != nil {
r = bufio.NewReader(fi)
} else {
r = bufio.NewReader(fz)
}
for {
line, err := r.ReadString('\n')
if err != nil {
fmt.Println("Done reading file")
break
}
fmt.Println(line)
}
/*
写文件
*/
printDivider("写文件")
outputFile, outputError := os.OpenFile("output.dat", os.O_WRONLY|os.O_CREATE, 0666)
if outputError != nil {
fmt.Printf("An error occured with file opening or creation\n")
return
}
defer outputFile.Close()
outputWrite := bufio.NewWriter(outputFile)
outputString := "Hello world\n"
for i := 0; i < 10; i++ {
outputWrite.WriteString(outputString)
}
outputWrite.Flush()
outputFile.WriteString(" Hello, GO\n")
fmt.Fprintf(outputFile, "Hello, Fprintf\n")
/*
文件拷贝
*/
printDivider("文件拷贝")
srcFile, err := os.Open("person.go")
_, err = io.Copy(outputFile, srcFile) // 追加的方式拷贝
if err != nil {
fmt.Println("io.Copy error: ", err)
}
}
复制代码
划线
评论
复制
发布于: 4 小时前阅读数: 5
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/834a385abf723a683c6cc5322】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
HelloBug
关注
还未添加个人签名 2018.09.20 加入
还未添加个人简介
评论