在文件中搜索标记的自定义函数始终返回null

时间:2014-12-03 16:36:58

标签: android null file-read

我已经创建了一个自定义函数,它应该在文件中搜索指定的标记,并返回它的值,如下所示:

函数调用:

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对象,其中包含我想要读取的文件的路径。它在同一个班级宣布。

名为fileReaderbufferedReader的对象听起来就像是这样。一个FileReader和一个BufferedReader,声明如下(也在同一个类中):

private FileReader fileReader;
private BufferedReader bufferedReader;

在类的构造函数中:

fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);

问题是这个函数总是返回null,所以当我调用它时,上面关于我希望它如何工作的演示将看起来像这样:

函数调用:

getSingleLineValue("tagname");

在文件中找到行:

未知(也许这就是问题?)

返回字符串:

null

问题可能出在线上,因为当我打印它时,我在控制台中没有收到任何消息,但我真的不知道它有什么问题,如果这是问题。

非常感谢所有帮助!

1 个答案:

答案 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;
}