Java 从void方法写入文件

Java 从void方法写入文件,java,return,void,printwriter,Java,Return,Void,Printwriter,我正在开发一个使用Dijkstra算法的程序,并将结果记录到一个文本文件中。写入文件的代码位如下所示: try (PrintWriter pr = new PrintWriter(filename + "Out.txt")) { pr.println("Adjacency Matrix: " + (endTime - startTime) + " ms "); pr.println("Min-Heap: ");

我正在开发一个使用Dijkstra算法的程序,并将结果记录到一个文本文件中。写入文件的代码位如下所示:

try (PrintWriter pr = new PrintWriter(filename + "Out.txt")) {
                pr.println("Adjacency Matrix: " + (endTime - startTime) + " ms ");
                pr.println("Min-Heap: ");
                pr.println("Fibonnaci Heap:");
                pr.println("Dijkstra Adjacency Matrix");
                pr.println(g.printPath(END));
    }
        } catch (Exception e) {

        }
public void printPath(String end) {
    if (!graph.containsKey(end)) {
        System.err.printf("End vertex is not contained within graph \"%s\"\n", end);
        return;
    }

    graph.get(end).printPath();
    System.out.println();

}
除了g.printPath(END)行之外,我对这段代码没有任何问题。我收到的错误是“此处不允许空白类型”。我完全理解这意味着什么。发生这种情况是因为printPath方法无效。看起来是这样的:

try (PrintWriter pr = new PrintWriter(filename + "Out.txt")) {
                pr.println("Adjacency Matrix: " + (endTime - startTime) + " ms ");
                pr.println("Min-Heap: ");
                pr.println("Fibonnaci Heap:");
                pr.println("Dijkstra Adjacency Matrix");
                pr.println(g.printPath(END));
    }
        } catch (Exception e) {

        }
public void printPath(String end) {
    if (!graph.containsKey(end)) {
        System.err.printf("End vertex is not contained within graph \"%s\"\n", end);
        return;
    }

    graph.get(end).printPath();
    System.out.println();

}
因为我需要访问它将打印的变量,所以我尝试修改它,使其具有可以写入文本文件的返回类型。我想到的是:

public String printPath(String end) {
    if (!graph.containsKey(end)) {
        System.err.printf("End vertex is not contained within graph \"%s\"\n", end);
        return null;
    }

    graph.get(end).printPath();
    System.out.println();
    return graph.get(end).printPath();

}

这也有错误,因为该方法是string类型,但graph.get(end).printPath()是void(get方法也是void)。我尝试返回其他变量,如graph和graph.get(end),但它们不返回图中的实际变量。我知道graph.get(end).printPath()打印出我想要的正确值。我只是在努力寻找一种储存它们的方法。有没有一种简单的方法可以将其写入我忽略的文本文件,而不必返回并编辑我的所有方法以使它们不无效?谢谢

按照您当前的用法,
printPath
不应该打印任何内容:也许您甚至可以将其重命名为
getPath
。您需要构建一个具有正确值的字符串并将其返回,以便将返回的值传递给
println

public String printPath(String end) {
    if (!graph.containsKey(end)) {
        return "End vertex is not contained within graph \"%s\"\n", end);
    }

    // Also rework this to return a string instead of printlning stuff.    
    return graph.get(end).printPath();
}
或者,不要将值传递给
println
,只需调用
g.printPath(END)直接

try (PrintWriter pr = new PrintWriter(filename + "Out.txt")) {
     pr.println("Adjacency Matrix: " + (endTime - startTime) + " ms ");
     pr.println("Min-Heap: ");
     pr.println("Fibonnaci Heap:");
     pr.println("Dijkstra Adjacency Matrix");
     g.printPath(END);
} catch (Exception e) {
}

按照您当前的用法,
printPath
不应该打印任何内容:甚至可以将其重命名为
getPath
。您需要构建一个具有正确值的字符串并将其返回,以便将返回的值传递给
println

public String printPath(String end) {
    if (!graph.containsKey(end)) {
        return "End vertex is not contained within graph \"%s\"\n", end);
    }

    // Also rework this to return a string instead of printlning stuff.    
    return graph.get(end).printPath();
}
或者,不要将值传递给
println
,只需调用
g.printPath(END)直接

try (PrintWriter pr = new PrintWriter(filename + "Out.txt")) {
     pr.println("Adjacency Matrix: " + (endTime - startTime) + " ms ");
     pr.println("Min-Heap: ");
     pr.println("Fibonnaci Heap:");
     pr.println("Dijkstra Adjacency Matrix");
     g.printPath(END);
} catch (Exception e) {
}

有一种方法可以通过重定向
System.out.print

public String printPath(Graph graph, String end) {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    PrintStream printStream = new PrintStream(bos);
    //set output stream to bos to capture output
    System.setOut(printStream);

    graph.get(end).printPath(); //your output
    System.out.println();

    //reset output stream to file descriptor
    System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
    return bos.toString();
}
  • 通过tearrayoutputstream将
    系统输出重定向到
  • 开始打印
  • 系统输出
    重置为
    文件描述符
  • 最后,真的不要这么做,这是肮脏的代码,重要的是它不是线程安全的,而且很混乱。关于如何处理这一问题,有一个建议:

    • 创建一个格式化
      图形的方法。获取(end)
      并返回正确的
      String
      类型路径

      • 有一种方法可以通过重定向
        System.out.print来实现:

        public String printPath(Graph graph, String end) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            PrintStream printStream = new PrintStream(bos);
            //set output stream to bos to capture output
            System.setOut(printStream);
        
            graph.get(end).printPath(); //your output
            System.out.println();
        
            //reset output stream to file descriptor
            System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
            return bos.toString();
        }
        
      • 通过tearrayoutputstream将
        系统输出重定向到
      • 开始打印
      • 系统输出
        重置为
        文件描述符
      • 最后,真的不要这么做,这是肮脏的代码,重要的是它不是线程安全的,而且很混乱。关于如何处理这一问题,有一个建议:

        • 创建一个格式化
          图形的方法。获取(end)
          并返回正确的
          String
          类型路径

        graph.get(end)的返回实例是什么?get()是Map.java和graph中的一个方法。get(end)不打印任何值,我相信该方法只获取从开始到结束节点的路径中的值。graph.get(end)的返回实例是什么?get()是Map.java和graph中的一个方法。get(end)不打印任何值,该方法,我相信,只获取从开始到结束节点的路径中的值。也许我误解了您的意思,但是在第一种情况下,如果该方法保持为空,那么它会产生错误,因为第二个返回值是意外的。如果将其设置为类型(例如String),它还会产生错误,因为return语句仍然是void类型。在另一种情况下,g.printPath(END)不会写入文件,它只是将其输出到系统中。很抱歉,我没有将返回类型更改为String,现已修复。正如我的代码片段中的注释所述,您还需要更改printPath以返回字符串,而不是直接输出到PrintStream(System.out)。也许我误解了您的意思,但是在第一种情况下,如果该方法保持为空,那么它会产生错误,因为第二个返回值是意外的。如果将其设置为类型(例如String),它还会产生错误,因为return语句仍然是void类型。在另一种情况下,g.printPath(END)不会写入文件,它只是将其输出到系统中。很抱歉,我没有将返回类型更改为String,现已修复。正如我的代码片段中的注释所说,您还需要更改printPath以返回字符串,而不是直接输出到PrintStream(System.out)