Golang:将marshal xml写入文件

时间:2016-07-13 19:20:13

标签: xml intellij-idea go

如果我使用os库将其写入文件,我有一个编组XML的字节数组:

fh, _ := os.OpenFile("filename", os.O_CREATE, 0644)
_, err := fh.Write(XMLByteArray)

我在文件末尾收到一堆垃圾,好像这是一个糟糕的写:

<project version="4">
  <component name="test">
    <option name="urls">
      <list></list>
    </option>
  </component>
</project>    </option>
  </component>
</project>on>
            </component>
    </project>

如果我用io / ioutil库这样写它:

err = ioutil.WriteFile("filename", XMLByteArray, 0644)
    if err != nil {
        log.Fatal(err)
    }

我得到了正确的XML:

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="test">
    <option name="urls">
      <list></list>
    </option>
  </component>
</project>

这是我真正不理解的部分。此文件是动态路径生成的结果,是IntelliJ的配置。如果我使用os.Write()然后正确关闭文件处理程序,IntelliJ会立即读取文件,但由于XML混乱而导致错误。如果我使用ioutil.WriteFile()编写文件,则文件看起来正确,但IntelliJ无法识别该文件是否存在。

所以我的问题是:

  1. os.Write()ioutil.WriteFile()之间的区别是什么?
  2. 为什么这种差异导致字节数组的写入方式不同?

1 个答案:

答案 0 :(得分:2)

OpenFile调用中,该文件已存在且正在重新打开且未截断。写入的数据小于文件的内容,因此只覆盖文件的开头,最后留下垃圾。

根据os flags,您可以在打开时截断文件:

os.OpenFile("filename", os.O_CREATE | os.O_TRUNC, 0644)

或使用os.Create()

这基本上就是iotuil.WriteFile正在做的事情(参见source)。

如果IntelliJ没有足够的权限,则可能无法打开该文件。尝试在代码中将权限更改为0666,并检查是否使用这些权限创建了文件。请注意,如果文件已存在,则忽略权限参数。此外,创建文件时设置的权限可能受进程的umask限制。