2015-11-23 4 views
-1

Я делаю игру или планирую ее создать, где использование имеет непосредственный контроль над некоторым кодом игры, для максимальной настройки. В любом случае, я планирую, что мой код будет читать собственный файл, скопировать себя в новый файл, поместить в новый код, а затем скомпилировать и запустить новый код.Self-Changer (Java)

Вот мой код:

import java.io.*; 
import java.util.*; 

public class Iteration1 { 
    public static int n = 1; 
    private static int one = 0; 

    public static void main(String[] args) throws Exception { 
     one++; 
     iterate(); 
     runNext(); 
    } 

    public static void iterate() throws IOException { 
     File f = new File("Iteration" + (n + one) + ".java"); 

     if(!f.createNewFile()) { 
      f.delete(); 
      f.createNewFile(); 
     } 

     Scanner s = new Scanner(new File("Iteration" + n + ".java")); 

     PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(f.getName(),true))); 

     int ln = one; 

     while(s.hasNext()) { 
      if(ln == (one + one + one + one + one + one)) { 
       pw.println("\n" + getCode()); 
      } 
      pw.println(s.nextLine().replaceAll(n+"",(n + one)+"")); 
      ln++; 
     } 

     pw.flush(); 
    } 

    public static String getCode() { 
     Scanner s = new Scanner(System.in); 
     System.out.println("Enter in additional code:"); 

     String code = ""; 
     String temp = s.nextLine(); 

     while(!temp.equals("//done")) { 
      code += "\t" + temp; 
      temp = s.nextLine(); 
     } 

     code.replaceAll(n+"", (n + one)+""); 
     return code; 
    } 

    public static void runNext() { 
     try { 
      Process compile = Runtime.getRuntime().exec("javac Iteration" + (n + one) + ".java"); 
      compile.waitFor(); 
      System.out.println("Compiled"); 

      Process execute = Runtime.getRuntime().exec("java Iteration" + (n + one)); 
      execute.waitFor(); 
      System.out.println("Ran"); 
     } catch (Exception ie) { 
      System.out.println("Error!"); 
     } 
    } 
} 

Основная проблема у меня в том, что мой код иногда работает, или прекращает принимать входные данные, или что-то еще. Я не могу понять, почему, но я решил проблему с выполнением. Он никогда не распечатывает «Ran» или не запрашивает вход во второй раз.

Кто-нибудь знает, почему это может быть?

+0

'if (ln == (one + one + one + one + one + one))' ... um what? Это легко худший код, который я прочитал через некоторое время ... – redFIVE

+0

'private static int one = 0;' ... 'one ++;' - что? – immibis

+3

Возможно, вам стоит сосредоточиться на освоении абсолютных основ Java, прежде чем пытаться что-то сделать ... «амбициозным». – redFIVE

ответ

0

Проблема заключается в том, что при выполнении второго процесса (java Iteration2) вход/выход не привязан к терминалу, с которого вы начали оригинальный процесс. Этот второй прогон зависает в getCode(), читая s.nextLine(), и поскольку вывод не записывается на ваш текущий терминал, вы не видите приглашение «Ввести дополнительный код:».

Исправление - боль. Вам нужно будет сделать что-то вроде PrintWriter pw = new PrintWriter(execute.getOutputStream());, а затем прочитать с помощью сканера, выписать на этот PrintWriter и закрыть Writer в конце. Возможно, вам потребуется проверить, является ли текущая консоль терминалом или нет, используя System.console() == null, поэтому код выполняет это только в неинтерактивном режиме итерации.