Golang文件IO 一

文件IO编程最基本、最常用的就属读写文件操作了。ioutil包实现了一些IO实用功能,其中就包括非常简捷、好用的文件读取功能。

ioutil包有7个函数1个变量:

var Discard io.Writer = devNull(0)

func NopCloser(r io.Reader) io.ReadCloser

func ReadAll(r io.Reader) ([]byte, error)

func ReadDir(dirname string) ([]os.FileInfo, error)

func ReadFile(filename string) ([]byte, error)

func TempDir(dir, prefix string) (name string, err error)

func TempFile(dir, prefix string) (f *os.File, err error)

func WriteFile(filename string, data []byte, perm os.FileMode) error

ReadFile和WriteFile这两个函数分别实现了读文件和写文件操作,一行代码即可搞定,非常便捷。

func ReadFile(filename string) ([]byte, error)

ReadFile读取filename指定的文件,返回文件的内容。如果调用成功返回err==nil,而不是err==EOF。因为ReadFile读取整个文件,不会将Read操作遇到的EOF报告为一个错误。

func WriteFile(filename string, data []byte, perm os.FileMode) error

WriteFile将data写入到filename指定的文件。如果文件不存在,WriteFile用权限perm创建文件;如果文件存在,WriteFile函数在写之前先将文件截断。

可以搭配json包实现程序配置的读写功能。下面是一个读写数据库配置的例子。

package main

import (

    "fmt"

    "io/ioutil"

    "log"

    "encoding/json"

)

type AppConf struct{

    DriverName string `json:"driver_name"`

    SqlUser string `json:"sql_user"`

    SqlPass string `json:"sql_password"`

    SqlUrls string `json:"sql_urls"`

    SqlDB string `json:"sql_db"`

}

func main() {

    appConf := AppConf{DriverName:"mysql",

    SqlUser:"root",

    SqlPass:"password",

SqlUrls:"tcp(127.0.0.1:3306)",

SqlDB:"mydb"}

    bConf,err := json.MarshalIndent(appConf,"","\t")

    if err != nil {

        log.Fatal(err)

    }

    err = ioutil.WriteFile("app.cfg",bConf,0666)

    if err != nil {

        log.Fatal(err)

    }

    var appConf2 AppConf

    bConf,err =ioutil.ReadFile("app.cfg")

    if err != nil {

        log.Fatal(err)

    }

    err = json.Unmarshal(bConf,&appConf2)

    if err != nil {

        log.Fatal(err)

    }

    fmt.Println("appConf === appConf2",appConf==appConf2)

}

  

运行结果如下:

生成的app.cfg内容如下:

{

    "driver_name": "mysql",

    "sql_user": "root",

    "sql_password": "password",

    "sql_urls": "tcp(127.0.0.1:3306)",

    "sql_db": "mydb"

}

  

通常WriteFile的权限是0666。关于权限的定义,可以查看golang源码(C:\Go\src\os\types.go)

// A FileMode represents a file's mode and permission bits.

// The bits have the same definition on all systems, so that

// information about files can be moved from one system

// to another portably. Not all bits apply to all systems.

// The only required bit is ModeDir for directories.

type FileMode uint32

// The defined file mode bits are the most significant bits of the FileMode.

// The nine least-significant bits are the standard Unix rwxrwxrwx permissions.

// The values of these bits should be considered part of the public API and

// may be used in wire protocols or disk representations: they must not be

// changed, although new bits might be added.

const (

    // The single letters are the abbreviations

    // used by the String method's formatting.

    ModeDir FileMode = 1 << (32 - 1 - iota) // d: is a directory

    ModeAppend // a: append-only

    ModeExclusive // l: exclusive use

    ModeTemporary // T: temporary file; Plan 9 only

    ModeSymlink // L: symbolic link

    ModeDevice // D: device file

    ModeNamedPipe // p: named pipe (FIFO)

    ModeSocket // S: Unix domain socket

    ModeSetuid // u: setuid

    ModeSetgid // g: setgid

    ModeCharDevice // c: Unix character device, when ModeDevice is set

    ModeSticky // t: sticky

    // Mask for the type bits. For regular files, none will be set.

    ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice

    ModePerm FileMode = 0777 // Unix permission bits

)

  

FileMode在所有系统种的定义相同,与linux系统的权限定义类似,一些可取的值包括如下:

  const (

        OS_READ = 04

        OS_WRITE = 02

        OS_EX = 01

        OS_USER_SHIFT = 6

        OS_GROUP_SHIFT = 3

        OS_OTH_SHIFT = 0

        OS_USER_R = OS_READ<<OS_USER_SHIFT

        OS_USER_W = OS_WRITE<<OS_USER_SHIFT

        OS_USER_X = OS_EX<<OS_USER_SHIFT

        OS_USER_RW = OS_USER_R | OS_USER_W

        OS_USER_RWX = OS_USER_RW | OS_USER_X

        OS_GROUP_R = OS_READ<<OS_GROUP_SHIFT

        OS_GROUP_W = OS_WRITE<<OS_GROUP_SHIFT

        OS_GROUP_X = OS_EX<<OS_GROUP_SHIFT

        OS_GROUP_RW = OS_GROUP_R | OS_GROUP_W

        OS_GROUP_RWX = OS_GROUP_RW | OS_GROUP_X

        OS_OTH_R = OS_READ<<OS_OTH_SHIFT

        OS_OTH_W = OS_WRITE<<OS_OTH_SHIFT

        OS_OTH_X = OS_EX<<OS_OTH_SHIFT

        OS_OTH_RW = OS_OTH_R | OS_OTH_W

        OS_OTH_RWX = OS_OTH_RW | OS_OTH_X

        OS_ALL_R = OS_USER_R | OS_GROUP_R | OS_OTH_R

        OS_ALL_W = OS_USER_W | OS_GROUP_W | OS_OTH_W

        OS_ALL_X = OS_USER_X | OS_GROUP_X | OS_OTH_X

        OS_ALL_RW = OS_ALL_R | OS_ALL_W

        OS_ALL_RWX = OS_ALL_RW | OS_GROUP_X)

  

WriteFile权限指定为0777,Ubuntu上执行上面的例子,查看app.cfg的详细信息

dell@dell-VirtualBox:~/mygo/src/example/ioutil$ ll app.cfg

-rwxrwxr-x  dell dell  11月  : app.cfg*

WriteFile 权限指定为0666,Ubuntu上执行上面的例子,查看app.cfg的详细信息

dell@dell-VirtualBox:~/mygo/src/example/ioutil$ ll app.cfg

-rw-rw-r--  dell dell  11月  : app.cfg

Golang文件IO 一的更多相关文章

  1. golang文件传输服务

    续上篇,本篇介绍一个完整的golang文件传输服务器. 完整的代码可以看服务器,客户端 网络使用的框架如上篇介绍,这里就不再复述. 首先定义3个命令码: const ( request_file = ...

  2. GOLANG文件拷贝

    GOLANG文件拷贝 在Golang中,使用系统自带函数io.Copy() 如: srcFile := "C:/Users/Wisdom/Desktop/Wisdompic.png" ...

  3. 标准io与文件io

    A: 代码重复: 语句块1: while(判断) { 语句块2: 语句块1: } 上面可以改写为: while(1) { 语句块1: if(判断) break: 语句块2: } B: 标准IO和文件I ...

  4. 文件IO函数和标准IO库的区别

    摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lsee ...

  5. 转 漫谈linux文件IO

    在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...

  6. (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. Java文件IO操作应该抛弃File拥抱Paths和Files

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream;import java.nio.file.FileSystem; ...

  8. Java 文件IO续

    文件IO续 File类    用来将文件和文件夹封装成对象 方便对文件和文件夹的属性信息进行操作    File对象可以作为参数传递给流的构造函数 Demo1 File的构造方法 public cla ...

  9. Java 文件IO

    文件IO Java IO    IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中    按操作数据分为 字节流和字符流        字符流的 ...

随机推荐

  1. Python中的列表操作

    Python的列表操作可谓是功能强大且方便(相对于Java)简单.常规的操作就不说了(这不是一个入门教程),介绍几个很有特点的例子 添加 # 追加到结尾(append) li = [1, 2, 3, ...

  2. Prim算法模板

    //Gang #include<iostream> #include<cstring> #include<algorithm> #include<cstdio ...

  3. TL-WR703Nv1.7刷写openwrt固件

    TP-LINK TL-WR703N是一个小型的路由器,可以有线转WiFi,3G转WiFi,很多人拿它刷openwrt系统,然后可以在上面各种搞事. V1.7以前 通常刷openwrt的做法是, 下载一 ...

  4. replicated mode vs global mode - 每天5分钟玩转 Docker 容器技术(105)

    Swarm 可以在 service 创建或运行过程中灵活地通过 --replicas 调整容器副本的数量,内部调度器则会根据当前集群的资源使用状况在不同 node 上启停容器,这就是 service ...

  5. IDEA 无法运行Junit, 报错Class not found xxxx Empty test suite.

    网上搜了一圈没找到答案, 最后才发现是因为testmodule没有把class编译到主代码编译的路径.

  6. underscore源码解析(一)

    留存root // Establish the root object, `window` (`self`) in the browser, `global` // on the server, or ...

  7. reverse函数实现指定页面跳转

    需求: 在views中返回的url需要返回到具体的某一篇文章的评论列表 return redirect(reverse('cms_comment_manage',args=(number,))) dj ...

  8. webStorm和Sublime使用列编辑命令

    webStorm可以像Sublime一样使用列编辑,只是区别在于webStorm只可以编辑连续列表. 按住alt键鼠标选择一列,然后输入文字就会编辑多行,这个功能很赞,比较实用(按住ALT键选中之后, ...

  9. POJ2942 Knights of the Round Table 点双连通分量,逆图,奇圈

    题目链接: poj2942 题意: 有n个人,能够开多场圆桌会议 这n个人中,有m对人有仇视的关系,相互仇视的两人坐在相邻的位置 且每场圆桌会议的人数仅仅能为奇书 问有多少人不能參加 解题思路: 首先 ...

  10. 游戏服务端中使用Servlet和Java注解的一个好设计

    SNS类游戏基本都是使用HTTP短连接,用Java来开发服务端时能够使用Servlet+Tomcat非常轻松的架构起服务端来.在这里介绍一种使用Servlet比較好的一种设计,我也见过非常多基于HTT ...