将文本文件读取为字符串总是会导致字符串为空吗?

时间:2018-07-18 15:50:34

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

出于记录,我知道将文本文件读取为字符串不会总是导致字符串为空,但是在我的情况下,我无法使其执行任何其他操作。

我当前正在尝试编写一个程序,该程序从.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();
    }

我也尝试过其他人。缓冲的读取器,扫描器等。我尝试过重新编译项目,尝试过第三方库。仍然只是得到一个空字符串。我认为这一定是某种配置问题,但我很困惑。

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

2 个答案:

答案 0 :(得分:0)

即使您的第一个代码段都可以读取文件,但实际上它并不将文件内容存储在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();
}

答案 1 :(得分:0)

我的建议是创建一种方法,用于将文件读取为字符串,每当发现意外状态时,该字符串都会引发带有描述性消息的异常。这是此想法的可能实现:

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. 文件仅包含空格