zoukankan      html  css  js  c++  java
  • Golang IO

    Golang IO

    如果使用相对路径,采用project structure中指定的路径

    文件操作

    • 判断文件目录是否存在
    	//返回文件的信息, 如果err == nil 表示文件或目录存在
    	stat, err := os.Stat("test1.txt")
    	fmt.Println(stat)
    	//判断文件是否存在, 需要err参数
    	fmt.Println(os.IsExist(err))
    

    开启流

    方式一: 读

    	//关联的文件只有读权限, 一般用作读操作
    	file, _ := os.Open("test.txt")
    

    方式二 : 读写

    	//类似于Java中的Channel
    	//flag表示对文件的权限,可以通过管道符分隔
    	file, _ := os.OpenFile("test.txt", os.O_WRONLY|os.O_CREATE, os.ModeDir)
    

    输入流操作

    可以采用相对路径, 相对于Content Root

    案例一: 不带缓冲

    手动开辟一块内存实现读取

    func main() {
    	file, err := os.Open("D:/goRepo/test.txt")
    	defer file.Close()
    	if err == nil {
    		fmt.Println(file)
    		bytes := []byte{}
    		//手动开辟一块内存,类似于Java中的IO操作
    		bytes = make([]byte, 1024)
    		for  {
    			if len, err := file.Read(bytes);err==nil {
    				fmt.Println("内容为", string(bytes[:len]))
    			}else{
    				break
    			}
    		}
    	}
    }
    

    案例二: 带缓冲

    读取文件的内容并显示在ttl(带缓冲区的方式), 使用os.Open, file.Close, bufio.NewReader, reader.ReadString

    func main() {
    	file, err := os.Open("D:/goRepo/test.txt")
    	//关闭文件句柄
    	defer file.Close()
    	if err == nil {
    		//File结构体实现Reader接口
    		//默认缓冲区大小4096,相当于Java中BufferedReader
    		reader := bufio.NewReader(file)
    		for  {
    			//ReadString读取到换行符就结束,返回的内容包含delimiter
    			//io.EOF读到文件末尾
    			if content, err := reader.ReadString('
    ');err == io.EOF {
    				break
    			}else{
    				fmt.Println(content)
    			}
    		}
    	} else {
    		fmt.Println(err)
    	}
    }
    

    案例三: ioutil

    读取文件的内容并显示在终端(使用ioutil一次将整个文件读入到内存中), 这种方式适用于文件不大的情况

    func main() {
    	//将整个文件读取到内存中, 类似于Java中Files.readAllLines(Path path)
    	//采用相对路径
        //这里不需要显示的关闭流, 函数内已经封装了
    	file, _ := ioutil.ReadFile(("test.txt"))
        //返回[]byte
    	fmt.Println(string(file))
    }
    

    输出流操作

    案例一: 不带缓冲

    func main() {
        //如果需要创建文件,需要添加权限
    	file, _ := os.OpenFile("test.txt", os.O_WRONLY|os.O_CREATE, os.ModeDir)
    	defer file.Close()
    	//返回写入的字节个数
    	num, _ := file.Write([]byte("hello world, writing,open"))
    	fmt.Println(num)
    }
    

    案例二: 带缓冲

    func main() {
    	//os.O_RDWR包括读写
    	if file, err := os.OpenFile("test.txt", os.O_RDWR, os.ModeDir);err == nil {
    		defer file.Close()
    		//创建一个带缓冲的输出流
    		writer := bufio.NewWriter(file)
    		for i := 0; i < 5; i++ {
    			writer.Write([]byte("writing,hello world 
    "))//等价于writer.WriteString()
    			writer.Flush()
    		}
    	}else{
    		print(err)
    	}
    }
    

    案例三: 追加写入

    func main() {
        //os.O_APPEND允许追加写入内容, 与FileChannel.open(Paths, StandardOpenOption.APPEND)相同
    	if file, err := os.OpenFile("test.txt", os.O_RDWR|os.O_APPEND, os.ModePerm);err == nil {
    		defer file.Close()
    		writer := bufio.NewWriter(file)
    		for i := 0; i < 5; i++ {
    			writer.Write([]byte("writing,hello world 
    "))//等价于writer.WriteString()
    			writer.Flush()
    		}
    	}else{
    		print(err)
    	}
    }
    

    复制

    方式一: 普通缓冲

    func main() {
    	read, err2 := os.Open("test1.txt")
    	write, err1 := os.OpenFile("test2.txt", os.O_CREATE|os.O_WRONLY, 1)
    	defer write.Close()
    	defer read.Close()
    	if err1 == nil && err2 == nil {
    		reader := bufio.NewReader(read)
    		writer := bufio.NewWriter(write)
    		for {
    			if str, err3 := reader.ReadString('
    '); err3 != nil {
    				break
    			} else {
    				fmt.Println(str)
    				writer.WriteString(str)
    				writer.Flush()
    			}
    		}
    	}
    }
    

    方式二: ioutil

    会自动创建文件

    func main() {
    	data, _ := ioutil.ReadFile("test1.txt")
    	_ = ioutil.WriteFile("test2.txt", data, 1)
    }
    

    方式三: io.copy()

    func main() {
    	//和Java中Files.copy类似
    	io.Copy(bufio.NewWriter(writer),bufio.NewReader(reader))
    }
    
  • 相关阅读:
    vue+drf+第三方滑动验证码的接入实现
    基于k8s Ingress Nginx+OAuth2+Gitlab无代码侵入实现自定义服务的外部验证
    [转] Java 命名规范
    npm 下载慢问题解決方案
    java float跟double类型区别
    select、input为什么不能使用after before
    es6数组方法详解
    pytest-pytest.main()运行测试用例,pytest参数
    Selenium截屏 图片未加载的问题解决--【懒加载】
    selenium元素定位中的iframe切换问题总结
  • 原文地址:https://www.cnblogs.com/kikochz/p/13499967.html
Copyright © 2011-2022 走看看