JDK 7:现有文件在新文件上变为空(“path / to / file.html”);

时间:2015-02-17 10:01:36

标签: java file-io java-7

我正在使用JDK 7.我有一个类,其方法是使用PrintStream创建一个html文件。同一个类中的另一个方法应该使用创建的文件并使用它做一些事情。问题是,一旦我使用新文件(“path / to / file.html),文件长度减少到0.我的代码:

public class CreatePDFServiceImpl {

private final PrintStream printStream;

public CreatePDFServiceImpl() throws IOException {
    printStream = new PrintStream("/mnt/test.html", "UTF-8");
}

public void createHtmlFile() throws IncorporationException {
    try {
        StringBuilder html = new StringBuilder();
        HtmlFragments htmlFragments = new HtmlFragments();
        html.append(htmlFragments.getHtmlTop())
 .append(htmlFragments.getHeading())
 .append(htmlFragments.buildBody())
 .append(htmlFragments.buildFooter());
        printStream.print(html.toString());
    }  finally {
        if(printStream != null) {
            printStream.close();
        }
    }
}

下一个方法应该使用在“createHtmlFile()”中创建的html文件:

 public void convertHtmlToPdf() {
    PrintStream out = null;
    try {
        File file = new File("/mnt/test.html");
        /** this code added just for debug **/
        if (file.createNewFile()){
            System.out.println("File is created!");
        } else {
            System.out.println("File already exists. size: " + file.length());
        }

        /* PDF generation commented out. */
        //out = new PrintStream("/mnt/testfs.pdf", "UTF-8");
        //defaultFileWriter.writeFile(file, out, iTextRenderer);

    } catch (IOException e) {
        throw new IncorporationException("Could not save pdf file", e);
    } finally {
        if(out != null) {
            out.close();
        }
    }

我的junit集成测试类:

@Category(IntegrationTest.class)
public class CreatePDFServiceIntegrationTest {

private static CreatePDFServiceImpl createPDFService;

@BeforeClass
public static void init() throws IOException {
    createPDFService = new CreatePDFServiceImpl();
}

@Test
public void testCreateHtmlFile() throws IncorporationException {
    createPDFService.createHtmlFile();
    File createdFile = new File("/mnt/test.html");
    System.out.println("createdFile.length() = " + createdFile.length());
    Assert.assertTrue(createdFile.length() > 1);
}

@Test
public void testCreatePDF() throws Exception {
    File fileThatShouldExist = new File("/mnt/testfs.pdf");
    createPDFService.convertHtml2Pdf();

    Assert.assertTrue(fileThatShouldExist.exists());
}
}

第一次测试通过,输出:

 "createdFile.length() = 3440".

我检查了文件系统,有文件。大小3,44kb。

第二次测试失败,从CreatePDFServiceImpl输出:

"File already exists. size: 0"

查看文件系统,该文件现在实际上是0字节。

我很难过。新文件(“路径”)应该只创建对该文件的引用而不是清空它?

1 个答案:

答案 0 :(得分:3)

我怀疑File.createNewFile()中有错误。我还没有完全掌握你运行代码的顺序,但是你知道这会将文件大小设置为零吗?

out = new PrintStream("/mnt/testfs.pdf", "UTF-8");

来自PrintStream(File file) Javadoc:

  

file - 要用作此打印流的目标的文件。如果   文件存在,然后它将被截断为零大小;否则,一个新的   文件将被创建。输出将被写入文件并且是   缓冲。

我认为这是罪魁祸首 - 但在你的代码中,该行被注释掉了。我是对的,你已经用评论的那条线进行了测试吗?