1

我编写了一段 Java 代码,通过 Socket 将 PDF 转换的 postscript 脚本发送到网络打印机。

这些文件以完美的形状打印,但每个作业都带有一到两页额外的页面,其中包含类似ps: stack underflowerror undefined offending command.

一开始我认为 PDF2PS 过程有问题,所以我尝试了来自这个PS Files的 2 个 PS 文件。但问题仍然存在。

我还用 GhostView 验证了 ps 文件。现在我认为代码可能有问题。该代码不会引发任何异常。

Toshiba e-studion 5005AC 打印机支持 PS3 和 PCL6。

    File file = new File("/path/to/my.ps");

    Socket socket = null;
    DataOutputStream out = null;
    FileInputStream inputStream = null;
    try {
        socket = new Socket(printerIP, printerPort);
        out = new DataOutputStream(socket.getOutputStream());
        DataInputStream input = new DataInputStream(socket.getInputStream());
        inputStream = new FileInputStream(file);
        byte[] buffer = new byte[8000];

        while (inputStream.read(buffer) != -1) {
            out.write(buffer);

        }

        out.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
4

1 回答 1

1

无论有多少实际内容,您都将整个缓冲区写入输出流。这意味着当您最后一次写入缓冲区时,它很可能会在缓冲区末尾有一堆来自上一次迭代的内容。

例子

例如,假设您有以下文件,并且使用大小为 10 的缓冲区:

 1234567890ABCDEF

第一次inputStream.read()调用后,它将返回10并在缓冲区中您将拥有:

 1234567890

第二次inputStream.read()调用后,它将返回6并在缓冲区中您将拥有:

 ABCDEF7890

第三次inputStream.read()调用后,它将返回-1,您将停止阅读。

打印机套接字最终将接收这些数据:

1234567890ABCDEF7890

这里最后一个7890是打印机不理解的额外位,但它可以成功解释第一个1234567890ABCDEF

使固定

您应该考虑返回的长度inputStream.read()

        byte[] buffer = new byte[8000];
        for (int length; (length = inputStream.read(buffer)) != -1; ){
            out.write(buffer, 0, length);
        }

还可以考虑使用try-with-resources来避免未关闭流的问题。

于 2018-02-13T19:49:38.250 回答