View difference between Paste ID: VWwVkpbh and LdetDgSB
SHOW: | | - or go back to the newest paste.
1
import java.io.File;
2
import java.io.FileNotFoundException;
3
import java.io.FileOutputStream;
4
import java.io.RandomAccessFile;
5
import java.nio.channels.FileChannel;
6
import java.nio.channels.FileLock;
7
import java.nio.charset.StandardCharsets;
8
import java.nio.file.Files;
9
import java.util.Arrays;
10
11
public class SomeClass {
12
  public static void main(final String[] args) throws Exception {
13
    final File file = File.createTempFile("SharedLockDemo", ".tmp");
14
    file.deleteOnExit();
15
    try (FileOutputStream fs = new FileOutputStream(file)) {
16
      fs.write("HELLO".getBytes(StandardCharsets.US_ASCII));
17
    }
18
19
    if (!file.exists())
20
      throw new FileNotFoundException();
21
    try (final RandomAccessFile raf = new RandomAccessFile(file, "r");
22
        FileChannel channel = raf.getChannel()) {
23
      // Must be shared, since we are only in read access mode.
24
      final FileLock lock = channel.lock(0, Long.MAX_VALUE, true);
25
      final long size = channel.size();
26
      System.out.println("Size: " + size); // should be |HELLO| = 5
27
28
      final String[] commands = new String[3];
29
      commands[0] = "CMD"; // CMD startet echten neuen Prozess
30
      commands[1] = "/C"; // Führt folgende Befehle aus:
31
      commands[2] = "ECHO BOGUS > \"" + file.getCanonicalPath()
32
          + "\" || EXIT 1"; // String Ausgabe
33
34
      System.out.println("Commands: " + Arrays.toString(commands));
35
      // Befehl ausführen:
36
      final Process process = Runtime.getRuntime().exec(commands);
37
      final int exitValue = process.waitFor();
38
      // I'd expect the value to be 1.
39
      System.out.println("Exit Value: " + exitValue);
40
41
      lock.release();
42
43
      System.out.println("Contents of file:");
44
      final byte[] contents = Files.readAllBytes(file.toPath());
45
      if (contents.length == 0)
46
        System.out.println("<EMPTY>");
47
      else
48
        System.out.println(new String(contents, StandardCharsets.US_ASCII));
49
    }
50
51
  }
52
53
/* OUTPUT (Windows 7, Java 8):
54
55
Size: 5
56
Commands: [CMD, /C, ECHO BOGUS > "C:\Users\Claude\AppData\Local\Temp\SharedLockDemo4948636556524834177.tmp" || EXIT 1]
57
Exit Value: 0
58
Contents of file:
59
<EMPTY>
60
61
*/
62
63
}