【问题标题】:Reading a text file to a string ALWAYS results in empty string?将文本文件读取到字符串总是会导致空字符串?
【发布时间】:2018-07-19 00:23:10
【问题描述】:

为了记录,我知道将文本文件读取到字符串并不总是导致空字符串,但在我的情况下,我不能让它做任何其他事情。

我目前正在尝试编写一个程序,该程序从 .txt 文件中读取文本,根据某些参数对其进行操作,然后将文本保存回文档中。无论我尝试了多少不同的方法,我似乎都无法真正从 .txt 文件中获取文本。该字符串只是作为一个空字符串返回。

例如,我传入参数“-c 3 file1.txt”并解析文件的参数(文件总是最后传入)。我得到的文件是:

            File inputFile = new File(args[args.length - 1]);

当我调试代码时,它似乎将文件识别为 file1.txt,如果我传入不同文件的名称,该文件不存在,则会引发错误。所以它正确地识别了这个文件。从这里开始,我尝试了我可以在网上找到的所有类型的文件文本解析,从旧的 Java 版本技术到 Java 8 技术。没有一个工作过。我尝试过的一些是:

String fileText = "";
        try {
            Scanner input = new Scanner(inputFile);
            while (input.hasNextLine()) {
                fileText = input.nextLine();
                System.out.println(fileText);
            }
            input.close();
        } catch (FileNotFoundException e) {
            usage();
        }

String fileText = null;
    try {
        fileText = new String(Files.readAllBytes(Paths.get(filename)), StandardCharsets.UTF_8);
    } catch (IOException e) {
        e.printStackTrace();
    }

我也尝试过其他人。缓冲阅读器、扫描仪等。我尝试过重新编译项目,尝试过第 3 方库。仍然只是得到一个空字符串。我想这一定是某种配置问题,但我很难过。

对于任何想知道的人来说,文件似乎位于正确的位置,当我引用错误的位置时会引发异常。该文件实际上确实包含文本。我已经检查了四次。

【问题讨论】:

  • 我已经复制并粘贴了您的确切代码,并提供了我桌面上名为 file1.txt 的文件的绝对路径,我可以很好地读取文件并输出文件的每一行。您的 file1.txt 上有哪些信息?尝试做同样的事情,在桌面上创建一个文件,向其中添加一些随机信息,然后在创建文件对象时使用绝对路径而不是使用 args,作为功能的基本测试。
  • 当您说fileText = input.nextLine(); 时,输出将是您输入的最后一行。而不是它,你应该使用例如StringBuilder#append
  • 所以当我读取绝对路径时,它似乎可以工作。我将文件的文件夹移动到不同的位置(我将它与我正在运行的 Main.java 类放在同一个文件夹中,但读到它应该在 src 文件夹之外的项目文件夹中),它将从命令中读取行,但只是一个看似随机的字符串。每次都不一样:jmpixbx ycyjqnk lorkzdz

标签: java text-files command-line-arguments


【解决方案1】:

尽管您的第一个代码 sn-p 可能会读取文件,但实际上它不会将文件的内容存储在您的 fileText 变量中,而是文件的最后一行。 与

fileText = input.nextLine();

您将fileText 设置为当前行 的内容,从而覆盖fileText 的先前值。您需要存储文件中的所有行。例如。试试

static String read( String path ) throws IOException {
  StringBuilder sb = new StringBuilder();
  try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    for (String line = br.readLine(); line != null; line = br.readLine()) {
      sb.append(line).append('\n');
    }
  }
  return sb.toString();
}

【讨论】:

    【解决方案2】:

    我的建议是创建一种将文件读入字符串的方法,该方法在发现意外状态时会抛出带有描述性消息的异常。这是这个想法的可能实现:

    public static String readFile(Path path) {
        String fileText;
        try {
            if(Files.size(path) == 0) {
                throw new RuntimeException("File has zero bytes");
            }
            fileText = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
            if(fileText.trim().isEmpty()) {
                throw new RuntimeException("File contains only whitespace");
            }
            return fileText;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    

    此方法检查 3 个异常:

    1. 找不到文件
    2. 文件为空
    3. 文件只包含空格

    【讨论】:

      猜你喜欢
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2018-03-22
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      相关资源
      最近更新 更多