Java使用来自文本文件的一段代码

时间:2015-07-18 00:35:58

标签: java file text

我目前正在努力解决问题。对于我的世界编辑器,我希望我的程序读取文本文件并将其内容用作代码材料。我已经做了一个不错的文件阅读器,但现在我遇到了问题。在控制台中我得到正确的输出,该文件只有一行说:

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

这实际上是代码的一部分,它告诉我的程序将特定对象渲染到场景中,在这种情况下它是草模型。但是,而不是仅使用

将此信息打印到控制台
System.out.println(aryLines[i]);

我希望能够使用存储在.txt文件中的信息,以便将其实际添加到我的渲染代码中。将文本文件中的行打印到控制台的整个方法是:

     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());
        }
     }

我希望你理解我想要的东西:我的文本文件的内容是一段代码,我想进一步使用而不是只打印到控制台,我确信这是可能的,但我不知道如何。

3 个答案:

答案 0 :(得分: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])));
    }

假设您是一位经验丰富的程序员,我会留下这样的答案。如果我错了,请随便问我,我会向你解释。如果需要,我还可以解释如何修改它以添加不同的命令。

此外,这是相当不安全的,因为如果输入格式错误,则会导致应用程序崩溃。如果您计划让用户编辑该文件,那么我可以向您展示如何添加安全性。

希望这有帮助, 约瑟夫梅多斯

答案 1 :(得分:1)

好的,感谢Joseph 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;
    }

现在一切都很好,控制台给了我适当的陈述

makeGrass:0,1,2

并且渲染系统在适当的坐标处创建草模型,我现在唯一要改变的是我不必在Vector3f类中添加额外的构造函数,我相信我会想到也是。

在此链接提供的图片中,您可以准确地看到发生了什么:

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

如您所见,文本文件的内容将在控制台中打印出来(下面的数字是fps计数器),文本文件提供的坐标被正确解释,两个草模型显示在相应的坐标处这正是我想要的!

再次感谢Joseph Meadows的帮助,这正是我所寻找的!

答案 2 :(得分: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])));

对于迟到的回复表示歉心,欢迎您的帮助。我只是喜欢有用!