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('\n');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 \n"))//等价于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 \n"))//等价于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('\n'); 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))
}
posted @ 2020-08-14 02:10  CyberPelican  阅读(260)  评论(0编辑  收藏  举报