Writing Files in Lua

Here’s the translation of the Go code to Lua, with explanations in Markdown format suitable for Hugo:

Writing files in Lua follows similar patterns to the ones we saw earlier for reading.

-- To start, here's how to dump a string (or just bytes) into a file.
local content = "hello\nlua\n"
local file = io.open("/tmp/dat1", "w")
file:write(content)
file:close()

-- For more granular writes, open a file for writing.
local f = io.open("/tmp/dat2", "w")

-- It's good practice to check if the file was opened successfully
if not f then
    error("Unable to open file")
end

-- In Lua, we need to manually close the file when we're done
local function closeFile()
    if f then
        f:close()
    end
end

-- You can write strings as you'd expect.
local d2 = "some\n"
f:write(d2)
print("wrote " .. #d2 .. " bytes")

-- WriteString is just called write in Lua
local d3 = "writes\n"
f:write(d3)
print("wrote " .. #d3 .. " bytes")

-- Lua doesn't have a direct equivalent to Sync, but you can flush the file
f:flush()

-- Lua doesn't have a built-in buffered writer, but you can implement one
local function BufferedWriter(file)
    local buffer = ""
    local bufferSize = 1024 -- Adjust as needed

    return {
        write = function(str)
            buffer = buffer .. str
            if #buffer >= bufferSize then
                file:write(buffer)
                buffer = ""
            end
            return #str
        end,
        flush = function()
            if #buffer > 0 then
                file:write(buffer)
                buffer = ""
            end
            file:flush()
        end
    }
end

local w = BufferedWriter(f)
local n4 = w.write("buffered\n")
print("wrote " .. n4 .. " bytes")

-- Use flush to ensure all buffered operations have been applied to the underlying writer.
w.flush()

-- Close the file
closeFile()

Try running the file-writing code.

$ lua writing-files.lua
wrote 5 bytes
wrote 7 bytes
wrote 9 bytes

Then check the contents of the written files.

$ cat /tmp/dat1
hello
lua
$ cat /tmp/dat2
some
writes
buffered

Next we’ll look at applying some of the file I/O ideas we’ve just seen to the stdin and stdout streams.