InputStream

4 respostas
jards

Pessoal...

Na minha classe que eu chamo o relatorio, o usuario informa o numero de impressoes.
Estou usando o InputStream para carregar o relatorio, fiz um "FOR" para atender a quantidade de impressoes, porém ao passar por mais de uma vez pelo "FOR" estar lançando uma exeção, segue a minha classe e a exeção.

OBS: o erro só ocorre quendo o numero de impresoes é maior que 1.

minha classe...

public class Relatorios {
    Map parametros = new HashMap();
    JasperPrint jasperPrint;
    idaoRelatorios idaoRelatorios = new idaoRelatorios();

    private final String nomeAplicacao = "CADERNO DE QUESTÕES";
    private final String dirImagem = "C:/Documents and Settings/Administrador/Meus documentos/Minhas imagens/logoTriunfo.jpg";
     InputStream formularioPesquisa = getClass().getResourceAsStream("FormularioPesquisa.jasper");
     public void formularioPesquisa(int codCaderno, int quantImpressoes) {
        try {
            parametros.put("nomeAplicacao", nomeAplicacao);
            parametros.put("codCaderno", codCaderno);
            parametros.put("dirImagem", dirImagem);
                        
            for(int i=0; i < quantImpressoes; i++){
            parametros.remove("numeroFormulario");
            parametros.put("numeroFormulario", idaoRelatorios.getSeguencial());
            jasperPrint = JasperFillManager.fillReport(formularioPesquisa, parametros, ConectaBancodeDados.getConnection());
            }
            
            JOptionPane.showMessageDialog(null, "Impressão Realizada com Sucesso!");
            
        } catch (JRException ex) {
                Logger.getLogger(Relatorios.class.getName()).log(Level.SEVERE, null, ex);
            }
    }
}

Exeção lançada...

SEVERE: null
net.sf.jasperreports.engine.JRException: Error loading object from InputStream
        at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:200)
        at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:361)
        at relatorios.Relatorios.formularioPesquisa(Relatorios.java:45)
        at frames.JInternalFrameImprimirFormularioPesquisa.jButtonImprimirActionPerformed(JInternalFrameImprimirFormularioPesquisa.java:114)
        at frames.JInternalFrameImprimirFormularioPesquisa.access$000(JInternalFrameImprimirFormularioPesquisa.java:21)
        at frames.JInternalFrameImprimirFormularioPesquisa$1.actionPerformed(JInternalFrameImprimirFormularioPesquisa.java:63)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Caused by: java.io.IOException: Stream closed
        at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:308)
        at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2264)
        at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2277)
        at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2748)
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
        at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.<init>(ContextClassLoaderObjectInputStream.java:56)
        at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:195)
        ... 30 more

Alguem poderia ajudar???

4 Respostas

V

Ola…

Como na exception diz Stream closed, tente colocar o InputStream dentro do for.

InputStream formularioPesquisa = getClass().getResourceAsStream("FormularioPesquisa.jasper")
otaviofcs

Cara, que coisa mais maluca, você está gerando o relatório N vezes. O erro deve ocorrer quando você chama JasperFillManager.fillReport de novo. Afinal, o InputStream já foi lido.

Seu conceito é meio estranho. Até porque gerar o relatório várias vezes é jogar o problema para o seu servidor a troco de nada. Abra um pdf ou qualquer coisa desse tipo e o cara escolhe a quantidade de impressões ao mandar imprimir. Uma dúvida, o jasperReports faz impressões diretas? Talvez em versão desktop…

abraços,

otávio

jards

Pessoal vlw por ajudar…

otávio,
Sou novo no mundo JAVA e estou programando para Desktop, não posso mostrar um view pq o parametro seguencial tem que gerar um novo numero a cada impressão.

o erro ocorre exatamente como vc flw…

o meu problema é o seguinte:
Tenho que imprimir um mesmo relatorio uma ou mais vezes, sendo que cada impressão terar que possuir um numero proprio como um identificador. Criei uma tela onde o usuario informa a quantidade ha ser impressa, a minha classe deve mandar o relatorio direto para impressora(essa parte não estar na minha classe, mais sem problema).

teria como me ajudar??

otaviofcs

Não entendi como funciona, mas deve ser algo do próprio cliente jasper que já abre pedindo para imprimir. Como voê tem que gerar o relatório 3 vezes, tenta deixar de fora:

InputStream formularioPesquisa;

e colocar denttro do loop

antes de gerar o relaório (mais ou menos como o vdb falou). Agora, o que eu acho que você está errando é que o relatório deveria ser gerado uma vez, com todos os dados sendo gerados N vezes (um pra cada cópia). Ou seja, ao invés de você passar

quantImpressoes X os registros e assim 1 só relatório apareceria com quantImpressoes páginas.

abraços,

otávio

Criado 16 de abril de 2009
Ultima resposta 16 de abr. de 2009
Respostas 4
Participantes 3