Golangシリーズ:一般的なファイル操作を読み取りおよび書き込み

言語が異なるシナリオの下で、サポートファイル操作の多くを提供して行き、対応する治療、体系的くし今日、ファイルの読み書きのいくつかの一般的に使用される形態があります。

まず、ファイルの内容を読み取ります

1、バイト単位のファイルを読み込み、

この実施形態は、バイトの読み込み、コードの基礎となる比較的少ない、大量に、我々は以下のコードを参照してくださいされています。

// read-bytes.go

package main

import (
    "fmt"
    "io"
    "os"
)

func main()  {
    file, _ := os.Open("test.txt")

    defer file.Close()

    // 字节切片缓存 存放每次读取的字节
    buf := make([]byte, 1024)

    // 该字节切片用于存放文件所有字节
    var bytes []byte

    for {
        // 返回本次读取的字节数
        count, err := file.Read(buf)

        // 检测是否到了文件末尾
        if err == io.EOF {
            break;
        }

        // 取出本次读取的数据
        currBytes := buf[:count]

        // 将读取到的数据 追加到字节切片中
        bytes = append(bytes, currBytes...)
    }

    // 将字节切片转为字符串 最后打印出来文件内容
    fmt.Println(string(bytes))
}

ioutilと併せて読ま2、

私たちは多くの問題にしたくない場合は、組み合わせることができioutil、上記のコードを合理化するために:

// read-with-util.go

package main

import (
    "fmt"
    "io/ioutil"
    "os"
)

func main()  {
    file, _ := os.Open("test.txt")

    defer file.Close()

    // ReadAll接收一个io.Reader的参数 返回字节切片
    bytes, _ := ioutil.ReadAll(file)

    fmt.Println(string(bytes))
}

os.Fileもio.Readerを実現しているので、我々は呼び出すことができるioutil.ReadAll(io.Reader)方法を、すべてのファイルを読み出し、バイト、バイト・キャッシングのリードサイクルの使用を排除するプロセス。

3、ioutil読み出し動作を完了するための唯一のパッケージ:

さらに原稿読取操作を簡略化するために、ioutilも提供してioutil.ReadFile(filename string)タスクを取得するためのコードの行を読み取る方法を:

// read-by-util.go

package main

import (
    "fmt"
    "io/ioutil"
)

func main()  {
    bytes, _ := ioutil.ReadFile("test.txt")

    fmt.Println(string(bytes))
}

4、行ずつ読み取り:

時には、分析プロセスを容易にするために、我々は行毎にファイルの内容を読み取ることができるように願って、この時間スキャナを行うことができます。

// read-line-by-line.go

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    file, _ := os.Open("test.txt")

    defer file.Close()

    // 接受io.Reader类型参数 返回一个bufio.Scanner实例
    scanner := bufio.NewScanner(file)

    var count int

    for scanner.Scan() {
        count++
        
        // 读取当前行内容
        line := scanner.Text()

        fmt.Printf("%d %s\n", count, line)
    }
}

これは単にjava.util.Scannerまあのレプリカで、言語スキャナはまた、このようなようにos.Stdinとなど、さまざまな入力ソースを、受け取ることがあります。

あなたが最終文書の内容を取得したい場合は、上記のコードは、直接使用すると、文字列スライス、毎回プログレッシブスキャンを作成することができ、各ラインのデータをプリントアウトし、コンテンツをすることができ、現在のラインセクションに追加されます。

これらは、当然のことながら、他のより高度な方法がありますが、いくつかの一般的なファイルの読取りモードです要約を行うための機会を持っています。

第二に、ファイル操作を書きます

図1に示すように、書き込み動作はioutilを使用して完成します

私たちioutil.ReadFile(ファイル名の文字列)の上に、誰対応とioutil.WriteFile(filename string, ...)方法、あなたは簡単に書き込み操作を完了することができます。

// write-by-util.go

package main

import (
    "io/ioutil"
)

func main() {
    data := []byte("hello goo\n")

    // 覆盖式写入
    ioutil.WriteFile("test.txt", data, 0664)
}

ioutil.WriteFile(ファイル名の文字列、データ[]バイト、パーマos.FileMode):私たちは、WriteFileを()メソッドは、3つの引数を必要とし、それは完全な署名だあるを参照してください。ファイルが存在しない場合は、存在する場合それは、指定されたファイルの権限の下に作成され、最初に元のファイルの中身を空にし、新しいデータを書き込みます。

最後のパラメータは、それが現在のファイルの権利を表す32ビットの符号なし整数は、標準のUnixファイルのパーミッション・フォーマットであることに留意されたいです。

Unixのは、使用し-rwxrwxrwxたファイルのパーミッションを、表現するためにこのフォームを:

  • 第1:ファイル属性は、-通常のファイルを表しているdディレクトリを表し
  • 2-4場所:ファイルの所有者の許可
  • ビット5-7:Permissionsファイルには、ユーザー・グループに属しています
  • 最初の8-10:他の人の権利

権限設定で:

  • r これは、読み取り、値を表し 4
  • w 書き込み、値表現 2
  • x これは、exec、値を表し 1

我々は、次の採用os.FileMode試験:

package main

import (
    "fmt"
    "os"
)

func showMode(code int) {
    fmt.Println(os.FileMode(code).String())
}

func main() {
    showMode(0777)
    showMode(0766)
    showMode(0764)
}

次のようにプログラムを実行し、コンソールが出力されます。

-rwxrwxrwx
-rwxrw-rw-
-rwxrw-r--

2、ファイルハンドルで書き込み操作を完了

我々はオープン、読み取り専用ファイルをあるos.Open(名前文字列)メソッドを、使用している上に、OSのパッケージもos.OpenFile(名前文字列、フラグINT、提供パーマにFileMode) の追加を指定する方法を、读写方式そして文件权限パラメータは、ファイル操作がより柔軟になります。

ここで、フラグいくつかのあまり一般的な値:

  • os.O_CREATE:何も存在しない存在しない場合、作成します
  • os.O_RDONLY:読み取り専用読み取り専用
  • os.O_WRONLY:書き込み専用只写
  • os.O_RDWR:読み取りおよび書き込み読み書き
  • os.O_TRUNCは:開いているファイルの長さが0切断する際に切り捨て:クリアファイルを、すなわち
  • os.O_APPEND:ファイルに新しいデータを追加追加

ファイルを開いた後、我々はデータを書き込むために()とWriteStringは()メソッドを書くことができ、最終的に同期()メソッドを介してディスクにデータを永続化します:

// write-by-file-descriptor.go

package main

import (
    "fmt"
    "os"
)

// 打印写入的字节数
func printWroteBytes(count int) {
    fmt.Printf("wrote %d bytes\n", count)
}

func main() {
    // 以指定的权限打开文件
    file, _ := os.OpenFile("test2.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0664)

    defer file.Close()

    data := []byte("hello go\n")

    // 写入字节
    count, _ := file.Write(data)

    printWroteBytes(count)

    // 写入字符串
    count, _ = file.WriteString("hello world\n")

    printWroteBytes(count)

    // 确保写入到磁盘
    file.Sync()
}

図3に示すように、書き込み動作は、パケットによって完成されるBUFIO

このように、直接、包装の層で作られたファイルハンドルの上に実際には、通話モードを書く上で非常によく似ている、唯一の参照であります:

// write-with-bufio.go

package main

import (
    "bufio"
    "fmt"
    "os"
)

func printWroteBytes(count int) {
    fmt.Printf("wrote %d bytes\n", count)
}

func main() {
    file, _ := os.OpenFile("test.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0664)

    defer file.Close()

    // 获取bufio.Writer实例
    writer := bufio.NewWriter(file)

    // 写入字符串
    count, _ := writer.Write([]byte("hello go\n"))

    fmt.Printf("wrote %d bytes\n", count)

    // 写入字符串
    count, _ = writer.WriteString("hello world\n")

    fmt.Printf("wrote %d bytes\n", count)

    // 清空缓存 确保写入磁盘
    writer.Flush()
}

これらは、より多くを探検する機会を持ってフォローアップ、今日ここに締結し、一般的に使用されるファイルの読み書きです。

おすすめ

転載: www.cnblogs.com/liuhe688/p/11410464.html