我已经创建了一个自定义函数,它应该在文件中搜索指定的标记,并返回它的值,如下所示:
函数调用:
getSingleLineValue("tagname");
在文件中找到行:
<tagname>=tagvalue
返回字符串:
tagvalue
以下是该函数的代码:
public String getSingleLineValue(String tag) {
// The value
String value;
// If the list of passed tags contains the wanted tag
if(passedTags.contains(tag)) {
// Close the readers
close();
// RESET EVERYTHING
try {
// Re-create the FileReader
fileReader = new FileReader(file);
// Re-create the BufferedReader
bufferedReader = new BufferedReader(fileReader);
// Reset the passed tags array
passedTags.clear();
// Recall the function
value = getSingleLineValue(tag);
// Return the value
return value;
} catch(IOException e) {
// Handle the exception
e.printStackTrace();
}
} else {
try {
// The current line
String line;
// While the file has lines left
while ((line = bufferedReader.readLine()) != null) {
// If the current line contains a pair of tag marks ( < and > )
if (line.contains("<") && line.contains(">")) {
// If the line contains the tag
if(line.contains(tag)) {
// Store the parts of the tag in an array (tag and value)
String[] tagParts = line.split("=");
// Get the value
value = tagParts[1];
// Return the value
return value;
} else {
// Get the passed tag
String passedTag = line.substring(1, line.indexOf(">") - 1);
// Add the tag to the passed tags array
passedTags.add(passedTag);
}
}
}
} catch(IOException e) {
// Handle the exception
e.printStackTrace();
}
}
// If the tag wasn't found, return null
return null;
}
名为file
的对象是一个简单的File
对象,其中包含我想要读取的文件的路径。它在同一个班级宣布。
名为fileReader
和bufferedReader
的对象听起来就像是这样。一个FileReader
和一个BufferedReader
,声明如下(也在同一个类中):
private FileReader fileReader;
private BufferedReader bufferedReader;
在类的构造函数中:
fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
问题是这个函数总是返回null,所以当我调用它时,上面关于我希望它如何工作的演示将看起来像这样:
函数调用:
getSingleLineValue("tagname");
在文件中找到行:
未知(也许这就是问题?)
返回字符串:
null
问题可能出在线上,因为当我打印它时,我在控制台中没有收到任何消息,但我真的不知道它有什么问题,如果这是问题。
非常感谢所有帮助!
答案 0 :(得分:0)
我发现了问题所在。 这不是功能,实际上工作正常,但是文件的编码。
我创建了一个简单的计算机版本并向其添加了该功能,并打印了所有读取行,并发现该程序中的文件读取方式与Sublime Text(计算机上的文本编辑器)不同。一条看起来像这样的线:
ABCDEFG
在文本编辑器中,被程序读取如下:
A B C D E F G
所以基本上,它在每个角色之间添加了一个空格。我认为问题在于文件编码,因此该功能本身很有效。
编辑:我通过使用FileInputStream解决了文件编码问题,并将其编码设置为“UTF-16LE”,这是我文件的正确编码,因此上面的代码看起来像这样:
public String getSingleLineValue(String tag) {
// The value
String value;
// If the list of passed tags contains the wanted tag
if(passedTags.contains(tag)) {
// Close the readers
close();
// RESET EVERYTHING
try {
// Re-create the FileInputStream
fileInput = new FileInputStream(file); // <----- Changed
// Re-create the InputStreamReader
inputReader = new InputStreamReader(fileInput, "UTF-16LE"); // <----- Changed
// Re-create the BufferedReader
bufferedReader = new BufferedReader(inputReader); // <----- Changed
// Reset the passed tags array
passedTags.clear();
// Recall the function
value = getSingleLineValue(tag);
// Return the value
return value;
} catch(IOException e) {
// Handle the exception
e.printStackTrace();
}
} else {
try {
// The current line
String line;
// While the file has lines left
while ((line = bufferedReader.readLine()) != null) {
// If the current line contains a pair of tag marks ( < and > )
if (line.contains("<") && line.contains(">")) {
// If the line contains the tag
if(line.contains(tag)) {
// Store the parts of the tag in an array (tag and value)
String[] tagParts = line.split("=");
// Get the value
value = tagParts[1];
// Return the value
return value;
} else {
// Get the passed tag
String passedTag = line.substring(1, line.indexOf(">") - 1);
// Add the tag to the passed tags array
passedTags.add(passedTag);
}
}
}
} catch(IOException e) {
// Handle the exception
e.printStackTrace();
}
}
// If the tag wasn't found, return null
return null;
}