Replace use of File by Path in bisect tool.

Change-Id: Ie763b1061d1bff510f3a7cc0f4aa8e8e2947f27c
diff --git a/src/main/java/com/android/tools/r8/bisect/Bisect.java b/src/main/java/com/android/tools/r8/bisect/Bisect.java
index 7a483ad..ca6b334 100644
--- a/src/main/java/com/android/tools/r8/bisect/Bisect.java
+++ b/src/main/java/com/android/tools/r8/bisect/Bisect.java
@@ -16,11 +16,11 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
 import com.google.common.io.CharStreams;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
@@ -91,12 +91,9 @@
     // Setup output directory (or write to a temp dir).
     Path output;
     if (options.output != null) {
-      output = options.output.toPath();
+      output = options.output;
     } else {
-      File temp = File.createTempFile("bisect", "", new File("/tmp"));
-      temp.delete();
-      temp.mkdir();
-      output = temp.toPath();
+      output = Files.createTempDirectory("bisect");
     }
 
     ExecutorService executor = Executors.newWorkStealingPool();
@@ -104,9 +101,8 @@
       DexApplication goodApp = readApp(options.goodBuild, executor);
       DexApplication badApp = readApp(options.badBuild, executor);
 
-      File stateFile = options.stateFile != null
-          ? options.stateFile
-          : output.resolve("bisect.state").toFile();
+      Path stateFile =
+          options.stateFile != null ? options.stateFile : output.resolve("bisect.state");
 
       // Setup initial (or saved) bisection state.
       BisectState state = new BisectState(goodApp, badApp, stateFile);
@@ -168,9 +164,9 @@
     throw new CompilationError("Failed to run command " + args);
   }
 
-  private DexApplication readApp(File apk, ExecutorService executor)
+  private DexApplication readApp(Path apk, ExecutorService executor)
       throws IOException, ExecutionException {
-    AndroidApp app = AndroidApp.builder().addProgramFiles(apk.toPath()).build();
+    AndroidApp app = AndroidApp.builder().addProgramFiles(apk).build();
     return new ApplicationReader(app, new InternalOptions(), timing).read(executor);
   }
 
diff --git a/src/main/java/com/android/tools/r8/bisect/BisectOptions.java b/src/main/java/com/android/tools/r8/bisect/BisectOptions.java
index 8bd2c90..4f59900 100644
--- a/src/main/java/com/android/tools/r8/bisect/BisectOptions.java
+++ b/src/main/java/com/android/tools/r8/bisect/BisectOptions.java
@@ -4,9 +4,11 @@
 package com.android.tools.r8.bisect;
 
 import com.android.tools.r8.errors.CompilationError;
-import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import joptsimple.OptionParser;
 import joptsimple.OptionSet;
 import joptsimple.OptionSpec;
@@ -21,11 +23,11 @@
   public static final String OUTPUT_FLAG = "output";
   public static final String COMMAND_FLAG = "command";
 
-  public final File goodBuild;
-  public final File badBuild;
-  public final File stateFile;
-  public final File command;
-  public final File output;
+  public final Path goodBuild;
+  public final Path badBuild;
+  public final Path stateFile;
+  public final Path command;
+  public final Path output;
   public final Result result;
 
   public enum Result { UNKNOWN, GOOD, BAD }
@@ -76,8 +78,8 @@
     }
   }
 
-  private BisectOptions(File goodBuild, File badBuild, File stateFile, File command, File output,
-      Result result) {
+  private BisectOptions(
+      Path goodBuild, Path badBuild, Path stateFile, Path command, Path output, Result result) {
     this.goodBuild = goodBuild;
     this.badBuild = badBuild;
     this.stateFile = stateFile;
@@ -93,17 +95,17 @@
       printHelp(System.out);
       return null;
     }
-    File goodBuild = exists(require(options, parser.goodBuild, BUILD_GOOD_FLAG), BUILD_GOOD_FLAG);
-    File badBuild = exists(require(options, parser.badBuild, BUILD_BAD_FLAG), BUILD_BAD_FLAG);
-    File stateFile = null;
+    Path goodBuild = exists(require(options, parser.goodBuild, BUILD_GOOD_FLAG), BUILD_GOOD_FLAG);
+    Path badBuild = exists(require(options, parser.badBuild, BUILD_BAD_FLAG), BUILD_BAD_FLAG);
+    Path stateFile = null;
     if (options.valueOf(parser.stateFile) != null) {
       stateFile = exists(options.valueOf(parser.stateFile), STATE_FLAG);
     }
-    File command = null;
+    Path command = null;
     if (options.valueOf(parser.command) != null) {
       command = exists(options.valueOf(parser.command), COMMAND_FLAG);
     }
-    File output = null;
+    Path output = null;
     if (options.valueOf(parser.output) != null) {
       output = directoryExists(options.valueOf(parser.output), OUTPUT_FLAG);
     }
@@ -129,17 +131,17 @@
     throw new CompilationError("Missing required option: --" + flag);
   }
 
-  private static File exists(String path, String flag) {
-    File file = new File(path);
-    if (file.exists()) {
+  private static Path exists(String path, String flag) {
+    Path file = Paths.get(path);
+    if (Files.exists(file)) {
       return file;
     }
     throw new CompilationError("File --" + flag + ": " + file + " does not exist");
   }
 
-  private static File directoryExists(String path, String flag) {
-    File file = new File(path);
-    if (file.exists() && file.isDirectory()) {
+  private static Path directoryExists(String path, String flag) {
+    Path file = Paths.get(path);
+    if (Files.exists(file) && Files.isDirectory(file)) {
       return file;
     }
     throw new CompilationError("File --" + flag + ": " + file + " is not a valid directory");
diff --git a/src/main/java/com/android/tools/r8/bisect/BisectState.java b/src/main/java/com/android/tools/r8/bisect/BisectState.java
index cb3bf6e..5500637 100644
--- a/src/main/java/com/android/tools/r8/bisect/BisectState.java
+++ b/src/main/java/com/android/tools/r8/bisect/BisectState.java
@@ -15,12 +15,11 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.hash.Hashing;
 import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
+import java.io.BufferedWriter;
 import java.io.IOException;
 import java.io.Writer;
 import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
@@ -147,14 +146,14 @@
   private final DexApplication badApp;
   private final List<DexProgramClass> sortedGoodClasses;
   private final Map<DexType, Integer> indexMap;
-  private final File stateFile;
+  private final Path stateFile;
 
   private List<Run> runs = new ArrayList<>();
 
   // Computed data
   private Range nextRange = null;
 
-  public BisectState(DexApplication goodApp, DexApplication badApp, File stateFile) {
+  public BisectState(DexApplication goodApp, DexApplication badApp, Path stateFile) {
     this.badApp = badApp;
     this.stateFile = stateFile;
     signature = makeSignature(goodApp);
@@ -174,12 +173,12 @@
     if (stateFile == null) {
       return;
     }
-    if (!Files.exists(stateFile.toPath())) {
+    if (!Files.exists(stateFile)) {
       System.out.println("Assuming initial run for non-existent state file: " + stateFile);
       return;
     }
     List<String> data = new ArrayList<>();
-    try (BufferedReader reader = new BufferedReader(new FileReader(stateFile))) {
+    try (BufferedReader reader = Files.newBufferedReader(stateFile)) {
       if (!signature.equals(readSignature(reader))) {
         throw new CompilationError(
             "Bisection state file does not match the reference build signature");
@@ -310,7 +309,7 @@
     if (stateFile == null) {
       return;
     }
-    try (FileWriter writer = new FileWriter(stateFile, false)) {
+    try (BufferedWriter writer = Files.newBufferedWriter(stateFile)) {
       writer.write(signature);
       writer.write("\n");
       for (Run run : runs) {
diff --git a/src/test/java/com/android/tools/r8/bisect/BisectTest.java b/src/test/java/com/android/tools/r8/bisect/BisectTest.java
index 5c67c83..dd47a3e 100644
--- a/src/test/java/com/android/tools/r8/bisect/BisectTest.java
+++ b/src/test/java/com/android/tools/r8/bisect/BisectTest.java
@@ -79,7 +79,7 @@
         Timing timing = new Timing("bisect-test");
         DexApplication appGood = new ApplicationReader(goodInput, options, timing).read();
         DexApplication appBad = new ApplicationReader(badInput, options, timing).read();
-        BisectState state = new BisectState(appGood, appBad, stateFile.toFile());
+        BisectState state = new BisectState(appGood, appBad, stateFile);
         state.read();
         if (lastResult != Result.UNKNOWN) {
           state.setPreviousResult(lastResult);