zoukankan      html  css  js  c++  java
  • go语言文件操作

    摘要: 本文主要解说go语言的文件操作.系统底层的openwrite等系统调用,往往操作的文件对象是文件描写叙述符;而C语言库的文件操作须要借助fopen/fread等函数,它们的操作对象是文件指针.go语言中,对文件操作进行了进一步封装……

    1.os包中File类

    首先,file类是在os包中的,封装了底层的文件描写叙述符和相关信息,同一时候封装了Read和Write的实现。

    type File struct {
        *file
    }
    
    type file struct {
        fd  int
        name string
        dirinfo *dirInfo
        nepipe  int
    }
    
    func (f *File) Fd( )uintptr{
        if f== nil{
            return ^(uintptr(0))
        }
        return uintptr(f.fd)
    }

    //注意,上文中为什么能够用f.fd这个语法,f是File,而File中没有成员?

    func (f *File) Close() error{
    
    }
    
    func (f *File)Stat ()(fi FileInfo, err error){
    
    }

    同一时候File类还实现了例如以下方法:

    func (f *File) read(b []byte) (n int, err error);
    func (f *File) write(b []byte) (n int, err error) ;
    func (f *File) seek(offset int64, whence int) (ret int64, err error) ;

    2.io.ReadCloser

    在go语言中,带有er后缀的往往是接口,ReadCloser顾名思义,就是包括Read和Close方法的借口。我们去看看这两个接口的定义和实现:

    type Reader interface {
        Read(p []byte) (n int, err error)
    }
    type Closer interface {
        Close() error
    }
    

    注意:不同的包中对Reader的定义是不同的,以下是bufio中对Reader的定义

    3. bufio package

    type Reader struct {
        // contains filtered or unexported fields
    }
    
    type Reader struct {
                buf          []byte
                rd           io.Reader
                r, w         int
                err          error
                lastByte     int
                lastRuneSize int
    }

    bufio是带有缓冲的io读写包,我们先来看一个样例:

        package main
        import (
            "fmt"
            "os"
            "bufio"
            "io"
        )
        func main() {
            f, err := os.Open("c:\aaa.txt")//打开文件
            defer f.Close() //打开文件出错处理
            if nil == err {
                buff := bufio.NewReader(f) //读入缓存
                for {
                    line, err := buff.ReadString('
    ') //以'
    '为结束符读入一行
                    if err != nil || io.EOF == err {
                        break
                    }
                    fmt.Print(line)  //能够对一行进行处理
                }
            }
        }

    func NewReader(rd io.Reader) *Reader
    //NewReader returns a new Reader whose buffer has the default size.

    4.实例

    type Request struct {
        // The message body.
        ...
        Body io.ReadCloser
        ...
    }
    

    所以说,假设我们想实现Request中的Body,只须要实现io package中的两个interface就能够了.

  • 相关阅读:
    try catch finally
    类的小练习
    易混淆概念总结
    C#中struct和class的区别详解
    Doing Homework again
    悼念512汶川大地震遇难同胞——老人是真饿了
    Repair the Wall
    Saving HDU
    JAVA-JSP隐式对象
    JAVA-JSP动作
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4481480.html
Copyright © 2011-2022 走看看