简体   繁体   English

Java:PrintWriter不在文件中写入

[英]Java: PrintWriter not writing in file

I ran over some problem with PrintWriter . 我遇到了PrintWriter一些问题。 I wrote some code that simply takes some input from a file and outputs it to another one. 我编写了一些代码,这些代码仅从文件中获取一些输入并将其输出到另一个文件。

Though a file is created, the file remains empty. 尽管已创建文件,但该文件仍为空。 The wanted input can be easily printed out in the console, which means the FileInputStream is working correctly. 所需的输入可以轻松地在控制台中打印出来,这意味着FileInputStream可以正常工作。

Why is PrintWriter not printing anything? 为什么PrintWriter不打印任何内容?

public static void writeInFile(File in, File out) throws FileNotFoundException {
    PrintWriter outputStream = null
    Scanner scanner = new Scanner(new FileInputStream(in));
    outputStream = new PrintWriter(new FileOutputStream(out));
    outputStream.print("test");
    while(scanner.hasNext()) {
    outputStream.print(scanner.nextLine() + "\n");
    }
    scanner.close();
}

Make sure you always close your OutputStreams : 确保您始终关闭OutputStreams

        while(scanner.hasNext()) {
            String s = scanner.nextLine();
            outputStream.print(s+"\n");
            System.out.println("Test "+s); //d.h. das Problem liegt am outputstream
        }
        outputStream.close();
        scanner.close();

Edit: When you close the outputStream it calls flush automatically, which writes the buffer to the file. 编辑: close outputStream时,它将自动调用flush ,这会将缓冲区写入文件。 Without closing it the buffer may never be emptied/written to the file, as was the case here. 如果不关闭它,缓冲区可能永远不会清空/写入文件,就像这里的情况。

Also see this answer . 另请参阅此答案

When dealing with IO which requires cleanup, I prefer to use auto resource cleanup. 在处理需要清理的IO时,我更喜欢使用自动资源清理。 This is all you need at the most basic level: 这是最基本的需求:

public static void writeInToOut(InputStream in, OutputStream out) {
    try(PrintWriter outputStream = new PrintWriter(out);
        Scanner scanner = new Scanner(in)) {
        while(scanner.hasNext()) {
            outputStream.print(scanner.nextLine()+"\n");
        }
    }
}

You can now overload this function in several ways: 您现在可以通过几种方式重载此函数:

public static void writeInToOut(File file, OutputStream out) {
    try (InputStream in = new FileInputStream(file)) {
        writeInToOut(in, out);
    } catch (IOException e) {
        Logger.getAnonymousLogger().log(Level.WARNING, "IOError", e);
    }
}

public static void writeInToOut(File inFile, File outFile) {
    try (InputStream in = new FileInputStream(inFile);
         OutputStream out = new FileOutputStream(outFile)) {
        writeInToOut(in, out);
    } catch (IOException e) {
        Logger.getAnonymousLogger().log(Level.WARNING, "IOError", e);
    }
}

public static void writeStdInToFile(File file) {
    try (OutputStream out = new FileOutputStream(file)) {
        writeInToOut(System.in, out);
    } catch (IOException e) {
        Logger.getAnonymousLogger().log(Level.WARNING, "IOError", e);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM