-->

Create a read-only file

2019-02-18 03:48发布

问题:

I was wondering wether it is possible to create or simulate a file with a content set at creation and the assurance that nobody can ever change the file. If possible, can I do it in java?

回答1:

Setting a file to read only is not going to make it so no one can ever change it. It takes about 3 seconds to unset the read only flag. The file can then be opened in a hex editor or other program that can handle the file type and changes can be made.



回答2:

Try:

  • file.setReadOnly()
  • Runtime.getRuntime().exec("attrib " + "" + file.getAbsolutePath() + "" + " +R"); //(works on Windows)


回答3:

yes we can make read only file in java using setReadOnly() method.

After using this method, you will not be able to write or edit into the file.

import java.io.File;

public class FileReadOnly {
  public static void main(String[] args) {
    File file = new File("c:/file.txt");
    file.setReadOnly();
    System.out.println("File is in read only mode");
    }
}

or in this way also.

import java.io.File;
import java.io.IOException;

public class FileAttributesDemo {

  public static void main(String[] args) throws IOException {
    // Create a new file, by default canWrite=true, readonly=false
    File file = new File("test.txt");
    if (file.exists()) {
      file.delete();
    }
    file.createNewFile();
    System.out.println("Before. canWrite?" + file.canWrite());

    // set to read-only, atau canWrite = false */
    file.setWritable(false);
    System.out.println("After. canWrite?" + file.canWrite());
  }
}


回答4:

If you simply just need to create a Read-Only file, then won't the code below be sufficient? Unless I am missing something from your question:

import java.io.File;
import java.io.IOException;

public class FileAttributesDemo {

  public static void main(String[] args) throws IOException {
    // Create a new file, by default canWrite=true, readonly=false
    File file = new File("test.txt");
    if (file.exists()) {
      file.delete();
    }
    file.createNewFile();
    System.out.println("Before. canWrite?" + file.canWrite());

    // set to read-only, atau canWrite = false */
    file.setWritable(false);
    System.out.println("After. canWrite?" + file.canWrite());
  }
}


回答5:

To make it so setWritable(true) does not enable writing again you could extend File and override the setWritable() methods.

import java.io.File;
import java.io.IOException;
import java.lang.Override;

public class FileAttributeDemo2 {
    private static class ReadOnlyFile extends File {
        public ReadOnlyFile(String pathname) {
            super(pathname);
        }

        @Override
        public boolean setWritable(boolean writeable) {
            return setWritable(writeable, true);
        }

        @Override
        public boolean setWritable(boolean writeable, boolean ownerOnly) {
            if (!writeable) {
                return super.setWritable(false, ownerOnly);
            }
            return false;
        }
    }

    public static void main (String[] args) throws IOException {
        File file = new ReadOnlyFile("test.txt");
        if (file.exists()) {
            file.delete();
        }
        file.createNewFile();
        System.out.println("Before. canWrite? " + file.canWrite());

        file.setWritable(false);
        System.out.println("Set writable false. canWrite? " + file.canWrite());

        file.setWritable(true);
        System.out.println("Set writable true. canWrite? " + file.canWrite());

    }
}

which produces the output:

Before. canWrite? true 
Set Writable False. canWrite? false 
Set Writable True. canWrite? false