Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使文件读取器能够解释特定的字母_Java_Filereader_Account_Letter - Fatal编程技术网

Java使文件读取器能够解释特定的字母

Java使文件读取器能够解释特定的字母,java,filereader,account,letter,Java,Filereader,Account,Letter,多亏了这个伟大的社区,我几乎完成了我的世界编辑器,我唯一需要知道的是如何告诉我的读取文件代码来处理特定的字母。当我在键盘上按enter键时,我会将矢量3f的坐标写入文本文件,该矢量3f是我活动游戏对象的位置。我的ProcessText方法可以读取文本文件并处理坐标,但只能读取一种格式: public void ProcessText() { String file_name = "C:/Users/Server/Desktop/textText.txt";

多亏了这个伟大的社区,我几乎完成了我的世界编辑器,我唯一需要知道的是如何告诉我的读取文件代码来处理特定的字母。当我在键盘上按enter键时,我会将矢量3f的坐标写入文本文件,该矢量3f是我活动游戏对象的位置。我的ProcessText方法可以读取文本文件并处理坐标,但只能读取一种格式:

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

        try
        {           
            ProcessCoords file = new ProcessCoords(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(Double.parseDouble(ArgArray[0]), 
                                       Double.parseDouble(ArgArray[1]), 
                                       Double.parseDouble(ArgArray[2]));                    
                }
            }   
        } catch(IOException e) {
            System.out.println(e.getMessage());
        }
     }
但当我按下enter键并根据引擎给出的坐标写入坐标时,我得到的是不同的格式:

makeGrass:(x y z)           //for example makeGrass:(3 1 4)
现在我需要知道的是,我必须如何重写ProcessText方法中的代码,这样它就可以解释另一种格式,这种格式的开头和结尾都有括号,并且用空格分隔x和y,y和z,而不是逗号

我真的不知道还有什么地方可以找到这个问题的答案,所以我非常感谢大家对这个问题的帮助和解释


提前多谢

如果可以保证makeGrass:x,y,z格式中不会有空格,也不会有括号,那么可以使用String.replaceAll()。。。如下所示:

myString = "makeGrass:(3 1 4)"
myString = myString.replaceAll("\(", ""); //replace ( with empty space
myString = myString.replaceAll("\)", ""); //replace ) with empty space
myString = myString.replaceAll(" ", ","); //replace spaces with commas
然后,您不需要使用不同的方法来处理这两种类型的输入。只需如上所示格式化,并将两个输入传递给同一个方法


通过这种方式,您将不需要在某些字符上拆分,然后重新生成字符串以适合您的格式

如果您可以保证makeGrass:x、y、z格式中不会有任何空格,并且其中也不会有任何括号,那么您可以使用string.replaceAll()。。。如下所示:

myString = "makeGrass:(3 1 4)"
myString = myString.replaceAll("\(", ""); //replace ( with empty space
myString = myString.replaceAll("\)", ""); //replace ) with empty space
myString = myString.replaceAll(" ", ","); //replace spaces with commas
然后,您不需要使用不同的方法来处理这两种类型的输入。只需如上所示格式化,并将两个输入传递给同一个方法


这样,您就不需要在某些字符上拆分,然后重新生成字符串以适合您的格式

只需使用正则表达式拆分:
[\s,]
在存在
空白
的位置拆分字符串

如果有括号,请使用此选项去除括号:

Arguments = Arguments.replaceAll("\\(", "").replaceAll("\\)", "");
是正则表达式符号的一部分。因此,它们需要用
\
转义,而
\
作为Java符号,需要用另一个
\
转义。因此它变成了““\(”。我们必须替换字符串并将其存储回字符串变量。因为Java是按值传递的。这两个操作在同一行中完成

该方法的修改代码为:

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



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

    try
    {           
        ProcessCoords file = new ProcessCoords(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());

                    Arguments = Arguments.replaceAll("\\(", "").replaceAll("\\)", "");

                    String[] ArgArray = Arguments.split("[\\s,]");


                    this.makeGrass(Double.parseDouble(ArgArray[0]), 
                                   Double.parseDouble(ArgArray[1]), 
                                   Double.parseDouble(ArgArray[2])); 
            }
        }   
    } catch(IOException e) {
        System.out.println(e.getMessage());
    }
 } 
public void ProcessText(){
字符串文件_name=“C:/Users/Server/Desktop/textText.txt”;
public void ProcessText()
{      
字符串文件_name=“C:/Users/Server/Desktop/textText.txt”;
尝试
{           
ProcessCoords文件=新的ProcessCoords(文件名);
字符串[]aryLines=file.OpenFile();
int i;
对于(i=0;i
只需使用正则表达式拆分:
[\s,]
在存在
空白
的位置拆分字符串

如果有括号,请使用此选项去除括号:

Arguments = Arguments.replaceAll("\\(", "").replaceAll("\\)", "");
是regex表示法的一部分。因此,它们需要用
\
进行转义,
\
作为Java表示法,需要用另一个
\
进行转义。因此它变成了“\”(“。我们必须替换字符串并将其存储回字符串变量。因为Java是按值传递的。这两个操作在同一行中完成

该方法的修改代码为:

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



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

    try
    {           
        ProcessCoords file = new ProcessCoords(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());

                    Arguments = Arguments.replaceAll("\\(", "").replaceAll("\\)", "");

                    String[] ArgArray = Arguments.split("[\\s,]");


                    this.makeGrass(Double.parseDouble(ArgArray[0]), 
                                   Double.parseDouble(ArgArray[1]), 
                                   Double.parseDouble(ArgArray[2])); 
            }
        }   
    } catch(IOException e) {
        System.out.println(e.getMessage());
    }
 } 
public void ProcessText(){
字符串文件_name=“C:/Users/Server/Desktop/textText.txt”;
public void ProcessText()
{      
字符串文件_name=“C:/Users/Server/Desktop/textText.txt”;
尝试
{           
ProcessCoords文件=新的ProcessCoords(文件名);
字符串[]aryLines=file.OpenFile();
int i;
对于(i=0;i
您想接受尽可能多的格式吗

这比我尝试匹配的拆分更安全,并且不需要对输入或接收的子字符串进行任何预处理或后处理:

Pattern pattern = Pattern.compile("([0-9]+)"); // outside of method

long[] ArgArray = new long[3];
Matcher matcher = pattern.matcher(Arguments);
int i = 0;
while (matcher.find() && i < 3) {
   ArgArray[i++] = Long.parseLong(matcher.group(1));
}
// there was a mistake if i < 3, otherwise you have 3 numbers in ArgArray
这样,在调用
find
一次后,
if(matcher.find())
将决定它是否是有效的makeGrass行,如果是,则可以在
if
中处理它