我可以将文件设置为只读而不使用 Java 中的 File 对象吗?

Can I set a file to read-only without using a File object in Java?

我使用的系统具有内置功能,可通过安装在我们最终用户机器上的 Apache Commons Imaging library. This library allows for modification of Metadata directly through an InputStream. This metadata is then read by Symantec DLP 将元数据标签添加到 Jpeg 图像,以防止他们对带标签的文件做有问题的事情(复制到闪存、其他存储、电子邮件等)。问题是用户仍然可以在事后修改标签,因为文件是可写的,这几乎使安全工作无效。

我正在寻找一种方法,通过可以环绕 InputStream 的内容修改数据,以类似的方式为文件写入元数据以使其变为只读。

Java File 对象有一个名为 setReadOnly() 的内置方法,理论上可以使用,但问题是我永远无法直接创建 File 对象。我们从客户端接收一个 InputStream,用其他库对其进行修改,并在将其写入存储之前出于安全原因对其进行加密。如果我将标签添加到加密文件中,它将在解密时被删除。 Apache Commons Imaging 支持大量元数据标签类型,但我未能成功找到任何 R/W 支持的标签。

有人知道如何直接通过 InputStream 或使用核心 Java、Apache Commons Imaging 或有用的第三方库的某些派生对象将文件设置为持久只读吗?

您只需使用 ProcessBuilder 对文件进行 chmod 即可轻松完成此操作。

类似于:

String fileLoc = "/var/tmp/myImage.jpg";
String[] cmd = {"chmod", "0444", fileLoc};
ProcessBuilder pb = new ProcessBuilder(cmd);
Process process = pb.start();
int error = process.waitFor();
if (error != 0){
    //non 0 means something bad happend
} 

编辑: 如果您不能将其作为文件访问,而只能将其作为流访问,则不能将其设置为只读,因为那是一个文件系统属性,文件中的任何内容实际上都没有改变。