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