2009-03-31 7 views
4

-je utiliser ce test pour convertir txt en pdf:Pourquoi est-ce que j'obtiens une exception NullPointerException en essayant de lire un fichier?

package convert.pdf; 

//getResourceAsStream(String name) : Returns an input stream for reading the specified resource. 
//toByteArray : Get the contents of an InputStream as a byte[]. 

import java.io.FileOutputStream; 
import java.io.IOException; 

import org.apache.commons.io.IOUtils; 

import convert.pdf.txt.TextConversion; 

public class TestConversion { 

    private static byte[] readFilesInBytes(String file) throws IOException { 
     return IOUtils.toByteArray(TestConversion.class.getResourceAsStream(file)); 
    } 

    private static void writeFilesInBytes(byte[] file, String name) throws IOException { 
     IOUtils.write(file, new FileOutputStream(name)); 
    } 

    //just change the extensions and test conversions 
    public static void main(String args[]) throws IOException { 
     ConversionToPDF algorithm = new TextConversion(); 
     byte[] file = readFilesInBytes("/convert/pdf/text.txt"); 
     byte[] pdf = algorithm.convertDocument(file); 
     writeFilesInBytes(pdf, "text.pdf"); 
    } 

} 

Problème:

 
Exception in thread "main" java.lang.NullPointerException 
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1025) 
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:999) 
    at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:218) 
    at convert.pdf.TestConversion.readFilesInBytes(TestConversion.java:17) 
    at convert.pdf.TestConversion.main(TestConversion.java:28) 

J'utilise le débogueur, et le problème semble se situer ici:

private static byte[] readFilesInBytes(String file) throws IOException { 
     return IOUtils.toByteArray(TestConversion.class.getResourceAsStream(file)); 
    } 

Qu'est-ce que est mon problème?

Répondre

1

Vérifiez-vous si le fichier existe avant de le transmettre à readFilesInBytes()? Notez que Class.getResourceAsStream() renvoie null si le fichier est introuvable. Vous voulez sans doute faire:

private static byte[] readFilesInBytes(String file) throws IOException { 
    File testFile = new File(file); 
    if (!testFile.exists()) { 
     throw new FileNotFoundException("File " + file + " does not exist"); 
    } 
    return IOUtils.toByteArray(TestConversion.class.getResourceAsStream(file)); 
} 

ou mieux encore:

private static byte[] readFilesInBytes(String file) throws IOException { 
    InputStream stream = TestConversion.class.getResourceAsStream(file); 
    if (stream == null) { 
     throw new FileNotFoundException("readFilesInBytes: File " + file 
             + " does not exist"); 
    } 
    return IOUtils.toByteArray(stream); 
} 
17

sons comme la ressource n'existe probablement pas avec ce nom.

Savez-vous que Class.getResourceAsStream() trouve une ressource par rapport à l'ensemble de cette classe, alors que ClassLoader.getResourceAsStream() ne fonctionne pas? Vous pouvez utiliser une barre oblique dans Class.getResourceAsStream() pour mimer cela, si

Foo.class.getResourceAsStream("/bar.png") 

est à peu près équivalent à

Foo.class.getClassLoader().getResourceAsStream("bar.png") 

Est-ce fait un fichier (par exemple un fichier spécifique sur le système de fichiers normal) que vous essayez de charger? Si oui, l'utilisation de FileInputStream serait un meilleur pari. Utilisez Class.getResourceAsStream() s'il s'agit d'une ressource regroupée dans un fichier jar ou dans le classpath d'une autre manière; utilisez s'il s'agit d'un fichier arbitraire pouvant se trouver n'importe où dans le système de fichiers.

EDIT: Une autre chose à faire attention, qui m'a causé des problèmes auparavant - si cela a fonctionné sur votre boîte de dev qui se trouve être Windows, et échoue maintenant sur un serveur de production qui se trouve être Unix, vérifiez le cas du nom de fichier. Le fait que différents systèmes de fichiers traitent différemment la casse peut être pénible ...

0

Cette classe lit un fichier TXT dans le classpath et utilise TextConversion pour convertir en PDF, puis enregistre le pdf dans le système de fichiers.

Ici Code TextConversion:

package convert.pdf.txt; 
//Conversion to PDF from text using iText. 
import java.io.BufferedReader; 
import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import convert.pdf.ConversionToPDF; 
import convert.pdf.ConvertDocumentException; 

import com.lowagie.text.Document; 
import com.lowagie.text.DocumentException; 
import com.lowagie.text.Font; 
import com.lowagie.text.Paragraph; 
import com.lowagie.text.pdf.PdfWriter; 

public class TextConversion implements ConversionToPDF { 

    public byte[] convertDocument(byte[] documents) throws ConvertDocumentException { 
     try { 
      return this.convertInternal(documents); 
     } catch (DocumentException e) { 
      throw new ConvertDocumentException(e); 
     } catch (IOException e) { 
      throw new ConvertDocumentException(e); 
     } 
    } 

    private byte[] convertInternal(byte[] documents) throws DocumentException, IOException { 
     Document document = new Document(); 

     ByteArrayOutputStream pdfResultBytes = new ByteArrayOutputStream(); 
     PdfWriter.getInstance(document, pdfResultBytes); 

     document.open(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(documents))); 

     String line = ""; 
     while ((line = reader.readLine()) != null) { 
      if ("".equals(line.trim())) { 
       line = "\n"; //white line 
      } 
      Font fonteDefault = new Font(Font.COURIER, 10); 
      Paragraph paragraph = new Paragraph(line, fonteDefault); 
      document.add(paragraph); 
     } 

     reader.close(); 

     document.close(); 

     return pdfResultBytes.toByteArray(); 
    } 
} 

Et voici le code à ConversionToPDF:

package convert.pdf; 
// Interface implemented by the conversion algorithms. 
public interface ConversionToPDF { 

    public byte[] convertDocument(byte[] documentToConvert) throws ConvertDocumentException; 
    } 

Je pense venir le problème de mon système de fichiers (devbox sur Windows et Unix serveur). Je vais essayer de modifier mon classpath.

0

Ce problème peut être provoqué par l'appel de méthodes sur test.txt, qui peut être un raccourci de dossier. En d'autres termes, vous appelez une méthode sur un fichier qui n'existe pas, aboutissant à NullPointerException.

Questions connexes