xml - 戈朗 : write marshal xml to file

标签 xml intellij-idea go

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

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. 为什么这种差异会导致字节数组的写入方式不同?

最佳答案

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

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

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

或者使用os.Create() .

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

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

关于xml - 戈朗 : write marshal xml to file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38360026/

相关文章:

java - Maven 测试在终端上失败,但在 IntelliJ 中通过

go - 是否可以在运行时检测Go二进制文件是否使用-H=windowsgui编译

android - "Content has view with id attribute ' android.r.id.list ' that is not a ListView Class."在 fragment 中创建 ListView 时

css - 动画 svg+xml base 64 css 背景在 IE 中不起作用

java - 错误:Could not run build action using Gradle distribution 'https://services.gradle.org/distributions/gradle-4.2.1-bin.zip'

java - 如何在 IntelliJ 中运行包含 main 的单个 java 文件

javascript - json:无法将字符串解码为 main.test_struct 类型的 Go 值

unit-testing - 我如何对文本将出现在屏幕中央进行单元测试?

Android:可绘制的 XML

xml - 用于更新部分 XML 元素值的 Bash 脚本