从void方法写入文件

时间:2016-03-29 03:17:33

标签: java return void printwriter

我正在开发一个使用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) {

        }

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

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()打印出我想要的正确值。我正在努力寻找存储它们的方法。有没有一种简单的方法可以将其写入我正在忽略的文本文件中,而无需返回并编辑我的所有方法以使它们无效?谢谢!

2 个答案:

答案 0 :(得分:1)

根据您当前的使用情况,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) {
}

答案 1 :(得分:1)

有一种方法可以通过重定向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();
}
  1. System.out重定向到ByteArrayOutputStream
  2. 开始打印
  3. System.out重置为FileDescriptor
  4. 最后,真的没有建议去做,它是脏代码,重要的是不是线程安全的,而且令人困惑。关于如何处理这个问题有一个建议:

    • 创建格式化graph.get(end)并返回正确的String类型路径
    • 的方法