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. JavaScript正则表达式(Regular Expression):RegExp对象

    第一部分:新建正则表达式 JavaScript中正则表达式是参照Perl 5(一门历史很悠久的语言,现在tiobe编程语言排行依然在10名左右)建立的. 新建正则表达式的方法有两种: 1.使用字面量( ...

  2. 友元函数 C++

    #include<iostream> #include<vector> using namespace std; class Text{ public: Text():a(){ ...

  3. Scala入门系列(四):Map & Tuple

    Map 创建Map // 创建一个不可变的Map scala> val ages = Map("Leo" -> 30, "Sparks" -> ...

  4. 使用echarts,制作色温图

    1.需要下载echarts的echarts-all.js文件和创建地图需要用到的数据源 2.在项目中创建jsp文件,将js文件引入 <script type="text/javascr ...

  5. Postgresql中的explain

    PostgreSQL为每个收到的查询设计一个查询规划.选择正确的匹配查询结构和数据属性的规划对执行效率是至关重要要的,所以系统包含一个复杂的规划器来试图选择好的规划.你可以使用EXPLAIN命令查看查 ...

  6. javascript设计模式——中介者模式

    前面的话 程序由大大小小的单一对象组成,所有这些对象都按照某种关系和规则来通信.当程序的规模增大,对象会越来越多,它们之间的关系也越来越复杂,难免会形成网状的交叉引用.当改变或删除其中一个对象的时候, ...

  7. NS3网络仿真(10): 解析以太网帧

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 解析以太网帧的过程是构建以太网帧的逆过程,当我们接收到一个以太网帧时,仍然以上一节中的ARP帧为例 ...

  8. Spring MVC新手教程(二)

    第一篇文章宏观讲了Spring MVC概念,以及分享了一个高速入门的样例. 这篇文章主要来谈谈Spring MVC的配置文件. 首先来谈谈web.xml: web项目启动时自己主动载入到内存中的信息, ...

  9. hdu 5635 LCP Array(BC第一题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5635 LCP Array Time Limit: 4000/2000 MS (Java/Others) ...

  10. android面试总结01 activity生命周期

    面试常常会被问到的: Q:能说一下Activity的生命周期吗? Activity生命周期例如以下: onCreat onStart onResume onPause onStop onDestory ...