操作终端相关文件操作句柄
终端 | 名称 |
---|---|
os.Stdin | 标准输入 |
os.Stdout | 标准输出 |
os.Stderr | 标准错误 |
如下面将在终端打印出hello world
package main
import(
"fmt"
"os"
)
func main() {
fmt.Fprintf(os.Stdout,"hello world\n")
}
文件的读写:
package main
import(
"fmt"
"os"
)
func main() {
fmt.Fprintf(os.Stdin,"hello world\n")
file,err := os.OpenFile("./1.txt",os.O_CREATE|os.O_WRONLY, 0664)
if err != nil{
fmt.Println("open file err", err)
return
}
fmt.Fprintf(file, "write to file")
file.Close()
}
带缓冲区的读
package main
import(
"fmt"
"os"
"bufio"
)
var inputReader *bufio.Reader
var input string
var err error
func main() {
inputReader = bufio.NewReader(os.Stdin)
fmt.Println("please input something")
//注意是‘n’
input, err = inputReader.ReadString('\n')
if err == nil{
fmt.Println("the input is \n",input)
}
}
代码运行结果如下:
[root@launch-wind day09]# go run stdout.go
please input something
ancuiqahbfcvuqewbafcuqjb sCDB JKBFCQW
the input is
ancuiqahbfcvuqewbafcuqjb sCDB JKBFCQW
从文件中读
package main
import(
"fmt"
"os"
"bufio"
)
var inputReader *bufio.Reader
var input string
var err error
func main() {
//文件的普通读用Open就可以了,读写用OpenFile
file,err := os.Open("./1.txt")
if err != nil{
fmt.Println("read file faieled")
return
}
defer file.Close()
inputReader = bufio.NewReader(file)
input, err = inputReader.ReadString('\n')
if err == nil{
fmt.Println("the file content is \n",input)
}
}
案例:从文件中读取一行数据,统计之中数字,中午,英文,其他字符的数量。
代码如下:
package main
import(
"fmt"
"os"
"bufio"
"io"
)
var inputReader *bufio.Reader
var input string
var err error
type CharCount struct{
ChCount int
NumCount int
SpaceCount int
OtherCount int
}
func main() {
file,err := os.Open("./1.txt")
if err != nil{
fmt.Println("read file faieled")
return
}
defer file.Close()
var count CharCount
inputReader = bufio.NewReader(file)
for{
str, err := inputReader.ReadString('\n')
if err == io.EOF{
break;
}
if err != nil{
fmt.Println("read file failed!")
break
}
//转换成字符数组【】rune 字节数组是【】byte
run := []rune(str)
for _,v := range run{
switch {
case v >= 'a' && v <= 'z':
fallthrough
case v >= 'A' && v <= 'Z':
count.ChCount++
case v == ' ' || v == '\t':
count.SpaceCount++
case v>= '0' && v <= '9':
count.NumCount++
default:
count.OtherCount++
}
}
}
fmt.Printf("ch :%d space :%d num :%d other :%d\n",count.ChCount,count.SpaceCount,count.NumCount,count.OtherCount)
}
运行结果
[root@launch-wind day09]# go run stdout.go
ch :21 space :3 num :5 other :3
[root@launch-wind day09]# cat 1.txt
write to filer
12345
hello echo
压缩包文件的读取 “compress/gzip”,可以读取压缩文件 gzip.NewReader就可以了
前面讲的都是文件的读取,现在我们讲一下文件的写入。
文件的写入我们使用os.OpenFil("./1.txt", os.O_WRONLY, 0666)
参数 | 作用 |
---|---|
第一个参数 | 打开的文件 |
第二个参数 | 打开的方式 |
第三个参数 | 权限控制 |
第二个参数
参数值 | 含义 |
---|---|
os.O_WRONLY | 只写 |
os.O_CREATE | 没有就创建文件 |
os.O_RDONLY | 只读 |
os.O_RDWR | 读写操作 |
os.O_TRUNC | 清空文件操作 |
带缓冲的文件的写入实例
package main
import(
"fmt"
"os"
"bufio"
)
var inputReader *bufio.Reader
var input string
var err error
func main() {
file,err := os.OpenFile("./1.txt", os.O_WRONLY, 0666)
if err != nil{
fmt.Println("open file faieled")
return
}
defer file.Close()
outputWriter := bufio.NewWriter(file)
str := "hello echo\n"
for i:=0; i<10; i++{
outputWriter.WriteString(str)
}
//因为是带缓冲区的 所以要有这个函数才能写入磁盘 否则在内存里面
outputWriter.Flush()
}
拷贝文件 io.Copy(dst,src)
前者实现写的接口,后者实现读的接口。copy函数从源文件读取,然后写入目的文件中去。