zoukankan      html  css  js  c++  java
  • Go中的文件操作

    文件操作

    • 读取文件的内容并显示在终端(带缓冲区的方式),使用os.Openfile.Close,bufio.NewReader(),reader.ReadString函数和方法。
    package main
    
    import (
    	"bufio"
    	"fmt"
    	"io"
    	"os"
    )
    
    func main() {
    	// 打开一个文件
    	file, err := os.Open("/home/gocode/src/filedemo/test")
    	if err != nil{
    		fmt.Println("open file err=",err)
    	}
    
    	defer file.Close()  // 要及时关闭文件句柄,否则发有内存泄漏
    
        // 创建一个*Reader,带缓冲区的,默认的缓冲区为4096
    	reader := bufio.NewReader(file)
        // 循环读取文件内容
    	for{
    		str, err := reader.ReadString('
    ')
    		if err == io.EOF{  // io.EOF表示文件的末尾
    			break
    		}
    		fmt.Print(str)
    	}
    	fmt.Println("文件读取结束")
    }
    
    • 一次将整个文件读取到内存中,这种方式适用于文件不大的情况,相关方法和函数(ioutil.ReadFile

      package main
      
      import (
      	"fmt"
      	"io/ioutil"
      )
      
      
      func main() {
      	file := "/home/gocode/src/filedemo/test"
          
          // 使用ioutil.ReadFile一次性读取
          content, err := ioutil.ReadFile(file)  // 返回值是[]byte{}
      	if err != nil{
      		fmt.Println("read file err:",err)
      	}
      
      	fmt.Println(string(content))  // 需要转换成字符串显示
         
          // 我们没有显示的打开文件,所以也不需要显示的关闭
          // Open()和Close()被封装到ReadFile 函数内部
      }
      
    • 写文件操作

      (1)创建一个新文件,写入内容5句“hello Gardon”

      // 写入时,使用带缓存的*Writer
      package main
      
      import (
      	"bufio"
      	"fmt"
      	"os"
      )
      
      func main() {
      	// 创建一个新文件,写入内容5句“hello Gardon”
      	filePath := "test.txt"
      	file, err := os.OpenFile(filePath,os.O_WRONLY|os.O_CREATE,0666)
      	if err != nil{
      		fmt.Println("open file err=",err)
      		return
      	}
      
      	defer file.Close()
      
      	// 写入内容5句“hello Gardon”
      	str := "hello Gardon
      "
      	// 写入时,使用带缓存的*Writer
      	writer := bufio.NewWriter(file)
      	for i:=0;i<5;i++{
      		writer.WriteString(str)
      	}
      	// 因为writer是带缓存,因此在调用WriteString方法时,其实内容是先写到缓存的
      	writer.Flush()
      }
      

      (2)打开一个存在的文件,将原来的内容覆盖成新的内容10句“你好Christian”

      package main
      
      import (
      	"bufio"
      	"fmt"
      	"os"
      )
      
      func main() {
      	filePath := "test.txt"
      	file,err := os.OpenFile(filePath,os.O_WRONLY|os.O_TRUNC,0666)
      	if err != nil{
      		fmt.Println("open file err:",err)
      		return
      	}
      
      	defer file.Close()
      
      	writer := bufio.NewWriter(file)
      
      	str := "你好Christian
      "
      	for i:=0;i<10;i++{
      		writer.WriteString(str)
      	}
      	writer.Flush()
      }
      

      (3)打开一个存在的文件,在原来的内容追加内容“ABC!ENGLISH”

      package main
      
      import (
      	"bufio"
      	"fmt"
      	"os"
      )
      
      func main() {
      	filePath := "test.txt"
      	file,err := os.OpenFile(filePath,os.O_WRONLY|os.O_APPEND,0666)
      	if err != nil{
      		fmt.Println("open file err:",err)
      		return
      	}
      
      	defer file.Close()
      
      	writer := bufio.NewWriter(file)
      
      	str := "ABC!ENGLISH
      "
      	writer.WriteString(str)
      	writer.Flush()
      }
      

      (4)打开一个存在的文件,将原来的内容读出显示在终端,并追加5句“hello 西安”

      package main
      
      import (
      	"bufio"
      	"fmt"
      	"io"
      	"os"
      )
      
      func main() {
      	filePath := "test.txt"
      	file,err := os.OpenFile(filePath,os.O_RDWR|os.O_APPEND,0666)
      	if err != nil{
      		fmt.Println("open file err:",err)
      		return
      	}
      
      	defer file.Close()
      
      	reader := bufio.NewReader(file)
      	for{
      		str,err:=reader.ReadString('
      ')
      		if err == io.EOF{
      			break
      		}
      		fmt.Print(str)
      	}
      	writer := bufio.NewWriter(file)
      
      	str := "hello 西安
      "
      	for i := 0; i<5;i++{
      		writer.WriteString(str)
      	}
      	writer.Flush()
      }
      
      

      (5)将一个文件中的内容写入到另外一个文件中。(判断要写入的文件是否存在)

      package main
      
      import (
      	"fmt"
      	"io/ioutil"
      	"os"
      )
      
      // 判断文件以及文件夹是否存在
      func pathExists(path string) (bool,error){
      	_,err := os.Stat(path)
      	if err == nil{
      		return true,nil
      	}
      	if os.IsNotExist(err){
      		return false,nil
      	}
      	return false,err
      }
      
      
      func main() {
      	file1 := "test.txt"
      	file2 := "kkk.txt"
      
      	content, err := ioutil.ReadFile(file1)
      	if err != nil{
      		fmt.Printf("read file err=%v
      ",err)
      		return
      	}
      
      	b,_:= pathExists(file2)  // 判断文件是否存在,不存在则创建
      	if !b{
      		file,err := os.OpenFile(file2,os.O_RDWR|os.O_CREATE,0666)
      		if err != nil{
      			fmt.Println("create file err:",err)
      			return
      		}
      		defer file.Close()
      	}
      
      	err = ioutil.WriteFile(file2,content,0666)
      	if err != nil{
      		fmt.Println("write file error=",err)
      		return
      	}
      }
      
    • 拷贝文件

      package main
      
      import (
      	"bufio"
      	"fmt"
      	"io"
      	"os"
      )
      
      func CopyFile(dstFileName, srcFileName string) (written int64,err error){
      	srcFile, err := os.Open(srcFileName)
      	if err != nil{
      		fmt.Println("open file err:",err)
      		return
      	}
      
      	defer srcFile.Close()
      
      	reader := bufio.NewReader(srcFile)
      
      	dstFile, err := os.OpenFile(dstFileName,os.O_RDWR|os.O_CREATE,0666)
      	if err != nil{
      		fmt.Println("open file err:",err)
      		return
      	}
      
      	defer dstFile.Close()
      
      	writer := bufio.NewWriter(dstFile)
      
          return io.Copy(writer,reader)  // 调用io.Copy()    
      }
      
      func main() {
      	srcFile := "kkk.txt"
      	dstFile := "kkkk.txt"
      	_, err := CopyFile(dstFile,srcFile)
      	if err != nil{
      		fmt.Println("copy err:",err)
      	}
      }
      
    • 统计字符出现的次数

      // 打开一个文件,创建一个Reader,每取一行,就去统计有多少个英文,数字,空格和其他字符
      // 将结果保存在结构体中
      
      package main
      
      import (
      	"bufio"
      	"fmt"
      	"io"
      	"os"
      )
      
      type Charcount struct{
      	ChCount int
      	NumCount int
      	SpaceCount int
      	OtherCount int
      }
      
      func main() {
      	fileName := "kkk.txt"
      	file,err := os.Open(fileName)
      	if err != nil{
      		fmt.Println("open file err:",err)
      		return
      	}
      	defer file.Close()
      
      	count := Charcount{}
      
      	reader := bufio.NewReader(file)
      	for {
      		str,err := reader.ReadString('
      ')
      		if err == io.EOF{
      			break
      		}
      		for _,v:=range str{
      			switch  {
      			case v >= 'a' && v <= 'z':
      				fallthrough
      			case v >= 'A' && v <= 'Z':
      				count.ChCount += 1
      			case v == ' ' || v == '	':
      				count.SpaceCount +=1
      			case v >= '0' && v <= '9':
      				count.NumCount += 1
      			default:
      				count.OtherCount += 1
      			}
      		}
      	}
      	fmt.Println(count)
      }
      
  • 相关阅读:
    Thymeleaf学习记录(1)--启动模板及建立Demo
    Redis教程基本命令
    错误:Attempted to load applicationConfig: [classpath:/application.yml] but snakeyaml was not found on the classpath
    备注
    MYSQL建表问题(转)
    Class.forName("com.mysql.jdbc.Driver")找不到类
    mySql连接报错
    电脑启动过程
    C++输入输出流--<iostream>详解
    类内部实例化自身可行吗?
  • 原文地址:https://www.cnblogs.com/huiyichanmian/p/13754275.html
Copyright © 2011-2022 走看看