【问题标题】:File changes permission after writing block of byte写入字节块后文件更改权限
【发布时间】:2017-03-16 21:06:38
【问题描述】:

我在尝试使用 RandomAcessFile 读取和写入同一个文件时遇到问题。

我正在从一个文件中读取 16 个字节的块,并将它们写入同一文件的给定位置(例如第 256 个)。

问题出在ra.write(b) 行。执行以下行时,我在文本编辑器 Kate(我正在使用 Linux Manjaro)上收到一条消息:

文件 /home/mite/IdeaProjects/IspitJuni2015/dat.txt 以 UTF-8 编码打开,但包含无效字符。 它设置为只读模式,因为保存可能会破坏其内容。 使用选择的正确编码重新打开文件,或者在工具菜单中再次启用读写模式以便能够对其进行编辑。

它会打开只读模式。 我也尝试手动取消选中 Kate 中的只读权限,但它也不起作用。似乎是什么问题?

 public static byte[] read(long i) throws IOException{
    File in = new File("./dat.txt");
    RandomAccessFile ra = new RandomAccessFile(in,"rw");
    byte[] readObj= new byte[16];
    if (i>in.length()/16)
    {
        return null;
    }
    ra.seek(i*16);
    ra.read(readObj);
    ra.close();
    return readObj;
}
public static void write(long i, byte[] obj) throws IOException{
    File out=new File("./dat.txt");
    RandomAccessFile ra=new RandomAccessFile(out,"rw");
    if (!out.exists())
    {
        out.createNewFile();
    }
    long size=out.length();
    if (i*16>size)
    {
        ra.seek(out.length());
        for (long j=size;j<i*16;j+=16)
        {
            byte[] b=new byte[16];
            ra.write(b);
        }
    }
    ra.seek((i)*16);
    System.out.println(new String(obj));
    ra.write(obj);
    ra.close();
}
public static void main(String[] args) throws IOException{
    write(35,read(4));
}

【问题讨论】:

  • out.exists()/createNewFile() 块充其量是毫无意义的,但尤其是您构建了RandomAccessFile 之后。删除它。
  • 嗨米特科。下面已经做了一个回答,你能回复一下吗,回复一下对你有没有帮助?
  • @halfer 嗨,我留下重播和可能的解决方案。你可以看看下面
  • 好的,谢谢。习惯上,虽然不是严格强制性的,但也对帮助您的人进行 ping 操作。表达感激之情或评论最终解决方案对您有用是很好的,因此张贴者知道他们的努力得到了赞赏。

标签: java utf-8 readonly randomaccessfile


【解决方案1】:

我认为你误解了编辑告诉你的内容。

首先,并非所有可能的字节序列都是有效的 UTF-8 字符串,例如 "UTF-8 decoder capability and stress test"。因此,当您将 16 个字节从 UTF-8 文件的一个位置复制到另一个位置时,您可能会得到一个不再包含有效 UTF-8 文本的文件。

我怀疑您在 Kate 中打开了相同的文件以查看您的编辑结果。编辑对您说的是,它注意到您打开的文件不是有效的 UTF-8 文件,因此它不知道如何正确处理它,从而防止意外损坏您现在看起来像的潜在宝贵数据二进制(不是文本)到编辑器,编辑器拒绝将 UI 中的任何内容保存回该文件。这不会更改文件系统级别的任何权限,并且可能其他(愚蠢的)编辑器不会就此类可能的损坏向您发出警告。

【讨论】:

    【解决方案2】:

    感谢您的回复。我发现了问题。

    有时文本编辑器会在文件末尾添加一个额外的字节,Java 不支持将其作为字节。通常这是EOF 字节并被视为UTF-8,Java 只接受写入/读取ASCI 字节,除了通过writeUTF() 方法进行操作。

    而且这个字节在文本编辑器中是不可见的,这就是我写这篇文章的原因。

    我花了两天时间才找出问题所在,但如果有人卡在这里,请记住 EOF 字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-15
      • 2019-11-17
      • 2015-06-23
      • 2021-03-25
      • 2012-02-29
      • 2015-03-24
      • 2022-01-22
      • 2020-07-04
      相关资源
      最近更新 更多