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))
}