Работа с файлами и потоками

7. Работа с файлами и потоками #

Работа с файлами и потоками данных в Go выполняется с использованием стандартных пакетов, таких как os, io, io/ioutil, bufio, encoding/json, и encoding/xml.


7.1 Чтение и запись файлов #

Чтение файла: #

Используйте пакет os для открытия и чтения файла.

Пример:

package main

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

func main() {
    file, err := os.Open("example.txt")
    if err != nil {
        fmt.Println("Ошибка:", err)
        return
    }
    defer file.Close()

    content := make([]byte, 64)
    for {
        n, err := file.Read(content)
        if err == io.EOF {
            break
        }
        if err != nil {
            fmt.Println("Ошибка чтения:", err)
            return
        }
        fmt.Print(string(content[:n]))
    }
}

Запись в файл: #

Используйте os.Create для создания или перезаписи файла.

package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Create("output.txt")
    if err != nil {
        fmt.Println("Ошибка:", err)
        return
    }
    defer file.Close()

    _, err = file.WriteString("Привет, мир!\n")
    if err != nil {
        fmt.Println("Ошибка записи:", err)
    }
}

7.2 Работа с файловыми путями #

Для работы с путями используется пакет path/filepath.

Получение базового имени и расширения: #

package main

import (
    "fmt"
    "path/filepath"
)

func main() {
    path := "/home/user/documents/file.txt"
    fmt.Println("Базовое имя:", filepath.Base(path))      // file.txt
    fmt.Println("Расширение:", filepath.Ext(path))       // .txt
}

Построение пути: #

package main

import (
    "fmt"
    "path/filepath"
)

func main() {
    path := filepath.Join("home", "user", "documents", "file.txt")
    fmt.Println("Путь:", path) // home/user/documents/file.txt
}

7.3 Использование пакета io и io/ioutil #

io.Copy для копирования данных: #

package main

import (
    "io"
    "os"
)

func main() {
    src, _ := os.Open("source.txt")
    defer src.Close()

    dst, _ := os.Create("destination.txt")
    defer dst.Close()

    io.Copy(dst, src) // Копируем содержимое
}

Простое чтение файла с ioutil: #

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    content, err := ioutil.ReadFile("example.txt")
    if err != nil {
        fmt.Println("Ошибка:", err)
        return
    }
    fmt.Println(string(content))
}

Простая запись: #

ioutil.WriteFile("output.txt", []byte("Данные"), 0644)

Примечание: Начиная с Go 1.16, io/ioutil объявлен устаревшим. Используйте вместо него os и io.


7.4 Буферизация потоков #

Для работы с большими объемами данных эффективнее использовать буферизацию с пакетом bufio.

Чтение с буферизацией: #

package main

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

func main() {
    file, _ := os.Open("example.txt")
    defer file.Close()

    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        fmt.Println(scanner.Text()) // Чтение строки
    }
}

Запись с буферизацией: #

package main

import (
    "bufio"
    "os"
)

func main() {
    file, _ := os.Create("output.txt")
    defer file.Close()

    writer := bufio.NewWriter(file)
    writer.WriteString("Привет, буферизация!\n")
    writer.Flush() // Обязательно вызывайте Flush для записи буфера
}

7.5 Работа с JSON и XML #

Чтение и запись JSON: #

Пакет encoding/json позволяет сериализовать и десериализовать данные в формате JSON.

Пример:

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    // Запись JSON
    person := Person{Name: "Иван", Age: 30}
    file, _ := os.Create("person.json")
    defer file.Close()

    encoder := json.NewEncoder(file)
    encoder.Encode(person)

    // Чтение JSON
    file, _ = os.Open("person.json")
    defer file.Close()

    var decodedPerson Person
    decoder := json.NewDecoder(file)
    decoder.Decode(&decodedPerson)

    fmt.Println(decodedPerson)
}

Чтение и запись XML: #

Для работы с XML используйте encoding/xml.

Пример:

package main

import (
    "encoding/xml"
    "fmt"
    "os"
)

type Person struct {
    XMLName xml.Name `xml:"person"`
    Name    string   `xml:"name"`
    Age     int      `xml:"age"`
}

func main() {
    person := Person{Name: "Иван", Age: 30}

    // Запись XML
    file, _ := os.Create("person.xml")
    defer file.Close()
    encoder := xml.NewEncoder(file)
    encoder.Indent("", "  ")
    encoder.Encode(person)

    // Чтение XML
    file, _ = os.Open("person.xml")
    defer file.Close()

    var decodedPerson Person
    decoder := xml.NewDecoder(file)
    decoder.Decode(&decodedPerson)

    fmt.Println(decodedPerson)
}

Эти инструменты дают гибкость и удобство при работе с файлами и потоками данных, позволяя обрабатывать текстовые и бинарные форматы.