2015-07-18 3 views
1

В настоящее время я пытаюсь понять что-то. Для моего мирового редактора я хочу, чтобы моя программа читала текстовый файл и использовала его содержимое в качестве материала кода. Я уже сделал приличный файловый ридер, но теперь у меня проблема. В консоли я получаю правильный вывод, файл имеет только одну строку, которая говорит:Java использует кусок кода из текстового файла

this.makeGrass(new Vector3f(0, 1, 2)); 

это на самом деле часть кода, который говорит моя программа для визуализации конкретного объекта на сцене, в данном случае это модель травы. Однако вместо того, чтобы просто печатать эту информацию на консоль с

System.out.println(aryLines[i]); 

Я хочу, чтобы иметь возможность использовать информацию, хранящуюся на текстовый файл, так что я могу на самом деле добавить его в мой код рендеринга. Весь метод, который печатает строки на текстовом файле в консоли:

 public void TextOutput() 
    { 
     String file_name = "C:/Text.txt"; 

     try 
     { 
      StoreCoords file = new StoreCoords(file_name); 
      String[] aryLines = file.OpenFile(); 

      int i; 
      for (i = 0; i < aryLines.length; i++) 
      { 
       System.out.println(aryLines[i]); 
      // !! How to use the information as part of my code ?? 
      } 
     } catch(IOException e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 

Я надеюсь, вы понимаете, что я хочу: содержание моего текстового файла представляет собой фрагмент кода, который я хочу использовать в дальнейшем вместо имея его просто печатать на консоли, я уверен, что это возможно, но я бы не знал, как это сделать.

Спасибо за помощь!

+0

Я нашел это, которое может вам помочь: http://stackoverflow.com/questions/1057796/executing-java-code-given-in-a-text-file и это: http://stackoverflow.com/questions/6226063/run-a-simple-text-file-as-java – DigitalNinja

+0

Это не то, как программы должны быть написаны на Java. Код не должен загружаться динамически, а затем выполняется, и большинство (если не все) проблемы могут быть решены с помощью неизменяемых источников. –

ответ

1

Поскольку Java - это скомпилированный язык, вам придется перекомпилировать его во время выполнения, и я не уверен, что это возможно. Если бы я был вами, я бы жестко программировал свои собственные команды. . Вы хотите вызвать функцию с именем makeGrass, жёстко его Может быть, в текстовом файле вы можете иметь это:

makeGrass:0,1,2 

Тогда имеют это право после Println:

if(aryLines[i].startsWith("makeGrass:")) { 
      String Arguments = aryLines[i].substring(aryLines[i].indexOf(":")+1, aryLines[i].length()); 
      ArgArray = Arguments.split(","); 
      this.makeGrass(new Vector3f(Double.parseDouble(ArgArray[0]), Double.parseDouble(ArgArray[1]), Double.parseDouble(ArgArray[2]))); 
    } 

я собираюсь оставьте мой ответ так, считая, что вы опытный программист. Если я ошибаюсь, не стесняйтесь спрашивать, и я объясню вам это. Я также могу объяснить, как изменить его, чтобы добавить разные команды, если хотите.

Кроме того, это довольно небезопасно, потому что, если вход находится в неправильном формате, это приведет к сбою приложения. Если вы планируете разрешить пользователям редактировать файл, я могу показать вам, как добавлять меры безопасности.

Надеется, что это помогло, Джозеф Meadows

+0

Спасибо, я думаю, что то, что вы предлагаете, приближается к тому, что я ищу, может быть, я должен объяснить немного лучше, что такое мои намерения. Моя программа является мировым редактором и вместо позиционирования каждого объекта через код, определяя его с помощью: this.makeGrass (новый Vector3f (x, y, z)); Я хочу изменить положение внутри программы и сохранить новые координаты, нажав на какой-то ключ на клавиатуре (это похоже на сохранение игры) по этой причине я хотел, чтобы программа создала текстовый файл с соответствующим кодом, который имеет новые координаты и затем дайте java прочитать и «загрузить» новую позицию после перезапуска. – DisasterCoder

+0

Хорошо, я собирался опробовать то, что вы предложили, однако я не получаю работу. Я не из опытного программиста, поэтому, возможно, я просто пропустил что-то простое, но это дает мне ошибку для ArgArray, что мне нужно сделать, чтобы заставить ее работать? – DisasterCoder

+0

Мать бога, работает!Мне пришлось немного зачеркнуть мой класс Vector3f, теперь я отправлю ответ, и, возможно, кто-то может сказать мне, как я могу сделать его проще (вместо создания нового конструктора .. – DisasterCoder

1

Хорошо, благодаря Джозефу Meadows за подсказку, я делаю следующее дело, сразу после Println заявления я добавил код, предоставленный им. Для того, чтобы ArgArray работы, которую я должен был поставить String [] перед ним, а также я должен был создать новый конструктор в классе Vector3f, чтобы соответствовать Double.parseDouble штуковины ..

public void TextOutput() 
    { 
     String file_name = "C:/Users/Server/Desktop/textText.txt"; 

     try 
     {   
      StoreCoords file = new StoreCoords(file_name); 
      String[] aryLines = file.OpenFile(); 

      int i; 
      for (i = 0; i < aryLines.length; i++) 
      { 
       System.out.println(aryLines[i]);  

       if(aryLines[i].startsWith("makeGrass:")) { 
         String Arguments = aryLines[i].substring(aryLines[i].indexOf(":")+1, aryLines[i].length()); 
         String[] ArgArray = Arguments.split(","); 

         this.makeGrass(new Vector3f(Double.parseDouble(ArgArray[0]), 
                Double.parseDouble(ArgArray[1]), 
                Double.parseDouble(ArgArray[2]))); 
       } 
      } 
     } catch(IOException e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 

моего оригинальный Vector3f конструктор:

public Vector3f(float x, float y, float z) 
    { 
     this.m_x = x; 
     this.m_y = y; 
     this.m_z = z; 
    } 

и чтобы сделать код в методе TextOutput, я добавил еще один конструктор прямо под оригиналом.

public Vector3f(double parseDouble, double parseDouble2, double parseDouble3) { 
     this.m_x = (float) parseDouble; 
     this.m_y = (float) parseDouble2; 
     this.m_z = (float) parseDouble3; 
    } 

Теперь все работает отлично, консоль дает мне apropriate заявление

makeGrass:0,1,2 

и система рендеринга создает модель травы на apropriate координат, единственное, что я хочу изменить в настоящее время является то, что я не нужно добавлять дополнительный конструктор в класс Vector3f, я уверен, что тоже это выясню.

На картинке, представленной в этой ссылке вы можете увидеть то, что происходит:

http://www.pic-upload.de/view-27720774/makeGrassEx.png.html

Как вы можете видеть, содержание текстового файла печатается в консоли (то внизу цифры счетчик fps), а координаты, предоставленные текстовым файлом, интерпретируются правильно, две модели травы отображаются в соответствующих координатах, что именно то, что я хотел!

Еще раз спасибо за помощь Джозеф Медоуз, это именно то, что я искал!

0

Я не уверен, что вы решили это еще, но вам не нужен второй конструктор. Я не знал о типе данных, который вы использовали для координат, и предположил, что вы используете двойники, потому что я привык к использованию.

В действительности все типы могут быть проанализированы из строки. Посмотрите здесь:

this.makeGrass(new Vector3f(Double.parseDouble(ArgArray[0]), 
           Double.parseDouble(ArgArray[1]), 
           Double.parseDouble(ArgArray[2]))); 

Это прямо сейчас превращает строку в двойную. Это то, что

Double.parseDouble(); 

.

Похоже, что вы используете поплавки, поэтому вы всегда можете просто использовать метод поплавка синтаксического анализа:

Float.parseFloat("String"); 

Это привело бы с этим:

this.makeGrass(new Vector3f(Float.parseFloat(ArgArray[0]), 
           Float.parseFloat(ArgArray[1]), 
           Float.parseFloat(ArgArray[2]))); 

Извините за поздний ответ, и вы, несомненно, будете рады помочь. Мне просто нравится быть полезным!