当前位置: 首页 > 面试题库 >

从文件中读取文本后的java,打印开始时将为“ null”

颜均
2023-03-14
问题内容

我已经从.txt文件中读取了以下内容:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>

但是在阅读并输出后,我得到了:

null<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>

开头为null,这是方法:

public class Filer {

    private static String str;
    public static String read(String file) {

        BufferedReader br = null;
        try {

            String sCurrentLine;

            br = new BufferedReader(new FileReader(file));

            while ((sCurrentLine = br.readLine()) != null) {

                str += sCurrentLine;
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        return str;

    }
}

返回的字符串由其输出 System.out.println

我尝试按str.indexOf("null");或检查该字符串,str.indexOf("\0");但得到-1

有想法该怎么解决这个吗?


问题答案:

考虑循环的第一次迭代。的值str是空的,价值sCurrentLine就是"<?xml version="1.0"?>"

在字符串连接中,空引用将转换为字符串“空”。例如:

String x = null;
String y = "a";
String z = x + y; // "nulla"

因此,在您的第一次迭代中,当您执行时:

str += sCurrentLine;

的价值str将是"null<?xml version="1.0"?>"

可以将其 初始化str""…但我不会。

无论如何,没有理由为什么它应该是静态变量-即使再次调用该方法,您是否真的想保持旧值不变?那将是非常奇怪的。它应该是一个 局部 变量。

另外,您不应该在这样的循环中使用字符串连接-在性能方面太糟糕了,因为它需要不断复制旧数据。请StringBuilder改用。

我也不会捕获这样的异常-您是否真的希望呼叫者不知道发生任何错误?只需声明您的方法可以抛出IOException

此外,我不会用FileReader自己的语言-它使您无法控制用于读取文件的编码-
它将始终使用平台默认编码,这可能是不合适的。我会用一个FileInputStream包装在InputStreamReader。然后,您可以使用try- with-resourcesJava 7中的语句来FileInputStream自动关闭。

因此,经过所有这些更改,您的代码将变成这样:

public static String read(String file) throws IOException {
    StringBuilder builder = new StringBuilder();
    try (InputStream input = new FileInputStream(file)) {
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(input, "UTF-8"));
        String line;
        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }
    }
    return builder.toString();
}

请注意,这会将多行文件转换为 单行 文本-
builder.append("\n")如果您要保留行数(请不要在意行分隔符),请在循环中使用或类似的方法。如果要保留确切的行尾,请不要使用readLine-只需将字符读入缓冲区即可。

另外,考虑使用第三方库(例如Guava)来代替所有这些操作-
例如,您可以使用Files.toString()



 类似资料:
  • 我必须写一个程序: 提示用户输入输入文件的名称, 从输入文件中读取数据,并将有关汽车的信息存储在汽车对象数组列表中, 将数组列表中未排序的数据打印到屏幕上,如下所示: 我想不出前三步该怎么做。 我也有两个类,与这个项目,并将添加他们,如果需要/需要。因此,基本上只需要帮助了解如何从用户那里读取文本文件,将文本文件的内容添加到ArrayList中,并以格式化的方式打印出ArrayList的内容(我的

  • 我的项目中有这样一段代码: 没有错误,应用程序运行正常,但是变量中从来没有任何文本,我确信txt文件中有文本! 我已经尝试过不同的方法来读取文本文件(使用BufferedReader、Scanner、FileInputStream和FileReader),但都不起作用。 另外,我几乎可以肯定问题不在变量中,因为我尝试通过代码(使用运行时)打开文件,它正常打开了正确的文件。 好的,我尝试添加,但是仍

  • 问题内容: 我正在尝试在Android Studio的res \ raw文件中保留一个.txt文件,并读取/解析该文件。我在“ res”目录(未创建)中创建的名为“ raw”的文件夹中有一个文件“ my_file.txt”。 我认为我的主要问题是:创建File对象(与Scanner对象一起使用)时,应该为文本文件传递什么路径? 这是我的代码: 问题答案: 认为您正在寻找符合以下条件的东西 其中ct

  • 问题内容: 我有一个类QuoteBank,需要使用扫描仪读取txt文件,但是它 给了我一个文件未找到异常 Java文件位于app / src / main / java / nate.marxBros / QuoteBank.java中 txt文件位于app / src / main / assets / Quotes.txt 该代码是 应该像其他任何Java程序一样工作吗?但是它给文件 找不到异

  • 问题内容: 我可以用来从图像(JPEG,PNG)文件中提取文本的最佳开源Java库是什么? 问题答案: 有GOCR和tesseract,但我不确定它们的当前版本如何堆叠-尝试同时尝试您需要处理的一些典型输入并通过此试验进行选择吗?

  • 问题内容: 我有一个文本文件。我想从一行到另一行检索内容。例如,文件可以是200K行。我想从第78行到第2735行读取内容。由于文件可能很大,所以我不想将整个内容读取到内存中。 问题答案: 这是一个可能的解决方案的开始: