确定“.prn文件”是否完全用java编写

时间:2014-02-02 00:10:42

标签: java file

我正在尝试确定是否已完成将打印作业或.prn文件写入计算机。 创建步骤:单击文件上的打印 - >并选择(打印到文件) 将尝试将文件保存在计算机上的某个位置,并打开一个窗口以输入文件名并保存该位置。 输入文件名,然后单击“保存”。

然后,该文件将作为.prn文件开始写入指定的文件夹。 我正在尝试确定此写作是否已完成以及文件是否可用于进一步处理。如何在java中识别文件是否完整并准备就绪? 我尝试了文件锁(nio)以及随机文件访问。后者在尝试从计算机上的一个位置保存/移动/复制到另一个位置时工作,但是当我尝试使用.prn保存时,这失败了。

请建议识别java中的.prn文件是否完整。

下面是我试图找到.prn文件是否已完成写入文件夹的代码。 I have tried this, from this link here.

public void uploadFiles(final File folder) {
    if (folder.list().length > 0) {
         upload.setEnabled(true);
        for (final File fileEntry : folder.listFiles()) {
            try {
                if(isFileCompletelyWritten(fileEntry)){
                if (onSendData(fileEntry.getAbsolutePath())) {
                    deleteFile(fileEntry);
                }
            }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    } else {
             upload.setEnabled(false);
    }
}

private boolean isFileCompletelyWritten(File file) {
    RandomAccessFile stream = null;
    try {
        stream = new RandomAccessFile(file, "rwd");  
        return true;
    } catch (Exception e) {
       System.out.println("Skipping file " + file.getName() + " for this iteration as it's not completely written");
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                 System.out.println("Exception during closing file " + file.getName());
            }
        }
    }
    return false;
}

isFileCompletelyWritten(文件文件)

方法是我添加的方法,用于查找文件写入是否完整。当我试图保存打印文件时,这不起作用,但它在复制,移动,将文件从计算机上的一个文件夹保存到另一个文件夹时确实有效。 当字节流进入时,我的程序可以使用.prn文件.RandomfileAccess不能跳过文件,而是无法检测写入是否完成。当字节流按块顺序写入文件时,我的程序继续进行下一步,认为文件是完整且可用的。当我在将本地文件从一个位置复制到另一个位置时运行相同的代码时,Randomfileaccess能够检查并查看正在写入更多数据,并且我的程序能够跳过该迭代的过程。这就是我的程序失败的原因。

3 个答案:

答案 0 :(得分:0)

我在等你更新你的问题时,对你尝试的内容以及失败的方式做出了不错的解释......

AFAIK唯一保证可靠且可移植的方法涉及正在编写打印文件告诉其他程序的程序。

  • 如果您控制正在编写打印文件的程序,您可以修改它以在完成后执行操作。

  • 如果程序是(或可能)通过包装器启动的,您可以修改包装器。

  • 如果它是来自Java的exec的外部程序,您可以使用Process.waitFor()来测试它何时退出。

涉及锁定和检查文件更新时间戳的解决方案会遇到各种可移植性和可靠性问题。


Re:你当前的解决方案。您的“完全编写”测试实际上正在测试您是否可以打开该文件。

  • 如果文件不存在(因为打印尚未开始!),这将创建一个空文件并说它已完成。错误!

  • 如果文件存在,则打开尝试可能尝试锁定文件,但这是特定于操作系统的。 (在Linux上,除非所涉及的所有程序都明确使用锁定,否则不会发生锁定。)

基本上,这根本不适用于Linux。 (在Windows上,只要你在创建文件之前没有对文件进行测试,它就可以工作......这是一个“竞争条件”,使解决方案不可靠,至少在理论上是这样。)


那么其他选择是什么?

  • 您可以轮询该文件的上次修改日期或大小,以查看它/它们何时停止更改。在适当的(启发式!)不活动期后,假设文件已完成。

  • 您可以使用FileWatcherService实现上述功能。 (完成启发式非活动期,等等)

  • 您可以尝试使用Lock ...除了可能是编写文件的程序没有使用锁(在Linux上)。 (Lock API用于自主锁定,它依赖于所有涉及使用锁定的应用程序,无论是隐式还是显式。在Linux / Unix上,锁定不会隐式或默认发生。 )

我应该再次强调,这些替代方案中的任何一种都不是便携式的,而且完全可靠。

答案 1 :(得分:0)

显然,我最终选择了Java中的print API,我尝试了以下代码: this link to see if the print job is complete. 该示例会启动打印作业并监视报告是否完成。 但是,这不适合我的要求,因为我不希望程序创建打印作业。而是监视用户启动的打印,该打印当前在打印机上。 在Java Print API中我似乎没有遇到过可以完成此任务的解决方法。任何进一步的意见,建议或解决方案都非常感谢。

答案 2 :(得分:0)

根据您的打印机驱动程序正在编写的页面描述语言(PDL),您可以检查文件中是否有作业结束标记。

如果是PCL,那么你会寻找“\ x1b%-12345X @ PJL EOJ \ n%-12345X”。

对于Postscript,要么查找“%% EOF”或“\ x04”(ascii文本末尾,也可能在作业开始时出现)。