Golang包——io

Reader接口

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

Reader 接口包装了基本的 Read 方法,用于输出自身的数据。Read 方法用于将对象的数据流读入到 p 中,返回读取的字节数和遇到的错误。
如果读到了数据(n > 0),则 err 应该返回 nil。如果数据被读空,没有数据可读(n == 0),则 err 应该返回 EOF。 如果遇到读取错误,则 err 应该返回相应的错误信息。

Reader扩展接口

type ReaderFrom interface {
    ReadFrom(r Reader) (n int64, err error)
}

ReaderFrom 接口包装了基本的 ReadFrom 方法,用于从 r 中读取数据存入自身。 直到遇到 EOF 或读取出错为止,返回读取的字节数和遇到的错误。

type ReaderAt interface {
    ReadAt(p []byte, off int64) (n int, err error)
}
type ByteReader interface {
    ReadByte() (c byte, err error)
}

ByteReader 接口包装了基本的 ReadByte 方法,用于从自身读出一个字节。返回读出的字节和遇到的错误。

type ByteScanner interface {
    ByteReader
    UnreadByte() error
}

ByteScanner 在 ByteReader 的基础上增加了一个 UnreadByte 方法,用于撤消最后一次的 ReadByte 操作,以便下次的 ReadByte 操作可以读出与前一次一样的数据。
UnreadByte 之前必须是 ReadByte 才能撤消成功,否则可能会返回一个错误信息(根据不同的需求,UnreadByte 也可能返回 nil,允许随意调用 UnreadByte,但只有最后一次的 ReadByte 可以被撤销,其它 UnreadByte 不执行任何操作)

type RuneReader interface {
    ReadRune() (r rune, size int, err error)
}

RuneReader 接口包装了基本的 ReadRune 方法,用于从自身读取一个 UTF-8 编码的字符到 r 中。返回读取的字符、字符的编码长度和遇到的错误。

type RuneScanner interface {
    RuneReader
    UnreadRune() error
}

RuneScanner 在 RuneReader 的基础上增加了一个 UnreadRune 方法,用于撤消最后一次的 ReadRune 操作,以便下次的 ReadRune 操作可以读出与前一次一样的数据。
UnreadRune 之前必须是 ReadRune 才能撤消成功,否则可能会返回一个错误信息(根据不同的需求,UnreadRune 也可能返回 nil,允许随意调用 UnreadRune,但只有最后一次的 ReadRune 可以被撤销,其它 UnreadRune 不执行任何操作)。

自定义实现reader接口

package main

import (
    "io"
)

type UpperString struct {
    s string
    i int64
}

func NewUpperString(s string)*UpperString{
    return &UpperString{s,0}
}

func (upperStr *UpperString)Len()int{
    if upperStr.i >= int64(len(upperStr.s)) {
        return 0
    }
    return int(int64(len(upperStr.s)) - upperStr.i)
}

func (upperStr *UpperString) Read(b []byte) (n int, err error) {
    for ; n<len(b)&&int(upperStr.i)<len(upperStr.s); upperStr.i++ {
        c := upperStr.s[upperStr.i]
        if c >= 'a' && c <= 'z' {
            c -= 'a' - 'A'
        }
        b[n] = c
        n++
    }
    if n == 0 {
        return n, io.EOF
    }
    return n, nil
}

func main() {
        str := NewUpperString("abcderghijkmnopq")
    b := make([]byte, str.Len())
    n, _ := str.Read(b)
    println(string(b[:n]))

}

Writer 接口

type Writer interface {
    Write(p []byte) (n int, err error)
}

Writer 接口包装了基本的 Write 方法,用于将数据存入自身。
Write 方法用于将 p 中的数据写入到对象的数据流中,
返回写入的字节数和遇到的错误。
如果 p 中的数据全部被写入,则 err 应该返回 nil。
如果 p 中的数据无法被全部写入,则 err 应该返回相应的错误信息。

Write扩展接口
type WriterTo interface {
    WriteTo(w Writer) (n int64, err error)
}

WriterTo 接口包装了基本的 WriteTo 方法,用于将自身的数据写入 w 中。直到数据全部写入完毕或遇到错误为止,返回写入的字节数和遇到的错误。

type WriterTo interface {
    WriteTo(w Writer) (n int64, err error)
}

WriterTo 接口包装了基本的 WriteTo 方法,用于将自身的数据写入 w 中。直到数据全部写入完毕或遇到错误为止,返回写入的字节数和遇到的错误。

type ByteWriter interface {
    WriteByte(c byte) error
}

ByteWriter 接口包装了基本的 WriteByte 方法,用于将一个字节写入自身

copy

src := strings.NewReader("1234567890")
    dst := new(strings.Builder)
    written, err := io.CopyN(dst, src, 8)
    if err != nil {
        fmt.Printf("error: %v\n", err)
    } else {
        fmt.Printf("Written(%d): %q\n", written, dst.String())
    }

os.file

O_RDONLY    //syscall.O_RDONLY(0x00000)只读
O_WRONLY    //syscall.O_WRONLY(0x00001)只写
O_RDWR      //syscall.O_RDWR(0x00002)可读可写
O_CREATE    //syscall.O_CREAT(0x00040)创建文件
O_EXCL      //syscall.O_EXCL(0x00080)配合O_CREATE使用,在创建文件时如果该文件已存在,则提示错误;open xxx: The file exists.
O_TRUNC     //syscall.O_TRUNC(0x00200)清零
O_APPEND    //syscall.O_APPEND(0x00400)续写
O_SYNC      //syscall.O_SYNC(0x01000)同步IO,表示对文件的更改会强制同步到硬盘,而不是写入缓存区后由系统写入硬盘

Closer

type Closer interface {
    Close() error
}
Closer 接口包装了基本的 Close 方法,用于关闭数据读写。
Close 一般用于关闭文件,关闭通道,关闭连接,关闭数据库等

Seeker

type Seeker interface {
    Seek(offset int64, whence int) (ret int64, err error)
}

Seeker 接口包装了基本的 Seek 方法,用于移动数据的读写指针。Seek 设置下一次读写操作的指针位置,每次的读写操作都是从指针位置开始的。
whence 的含义是:
如果 whence 为 0:表示从数据的开头开始移动指针。
如果 whence 为 1:表示从数据的当前指针位置开始移动指针。
如果 whence 为 2:表示从数据的尾部开始移动指针。
offset 是指针移动的偏移量。
ret返回新指针位置

接口组合

type ReadWriter interface {
    Reader
    Writer
}

type ReadSeeker interface {
    Reader
    Seeker
}

type WriteSeeker interface {
    Writer
    Seeker
}

type ReadWriteSeeker interface {
    Reader
    Writer
    Seeker
}

type ReadCloser interface {
    Reader
    Closer
}

type WriteCloser interface {
    Writer
    Closer
}

type ReadWriteCloser interface {
    Reader
    Writer
    Closer
}

附录

方法 说明
func OpenFile(name string, flag int, perm FileMode) (*File, error) 通用文件打开函数,其中多个标志位可采取||方式携带,perm为文件权限
func Open(name string) (*File, error) 以只读方式打开文件O_RDONLY
func Create(name string) (*File, error) 创建文件,且打开文件方式为可读、可写、trunc
func (f *File) Seek(offset int64, whence int) (ret int64, err error) 返回offset,其中whence可指定offset是相对于哪里(0表示文件开头,1表示当前offset,2表示文件结尾),需要注意的是,对于以APPEND模式打开的文件,官方文档表示行为不确定。The behavior of Seek on a file opened with O_APPEND is not specified.
func (f *File) Read(b []byte) (n int, err error)
func (f *File) ReadAt(b []byte, off int64) (n int, err error)
func (f *File) Write(b []byte) (n int, err error)
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
func Rename(oldname string, newname string) (err error) //文件改名,若newname已存在则覆盖原有文件,即删除newname再将oldname改名;注意文件名可携带相对或绝对路径且更改前后文件夹路径应一致,否则会被拒绝操作;注意Windows下路径的“\”需要转义
func Chdir(dir string) error 更改当前工作文件夹
func Mkdir(name string, perm FileMode) error 创建文件夹
func Chmod(name string, mode FileMode) error
func (f *File) Chmod(mode FileMode) error
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容