我使用此测试将txt转换为pdf:
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");
}
}
问题:
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)
我使用调试器,问题似乎就在这里:
private static byte[] readFilesInBytes(String file) throws IOException {
return IOUtils.toByteArray(TestConversion.class.getResourceAsStream(file));
}
我的问题是什么?
答案 0 :(得分:19)
听起来资源可能不存在该名称。
您是否知道Class.getResourceAsStream()
找到了与该类包相关的资源,而ClassLoader.getResourceAsStream()
却没有?你可以在Class.getResourceAsStream()
中使用前导斜杠来模仿这个,所以
Foo.class.getResourceAsStream("/bar.png")
大致相当于
Foo.class.getClassLoader().getResourceAsStream("bar.png")
这个实际上是您正在尝试加载的文件(即普通文件系统上的特定文件)吗?如果是这样,使用FileInputStream
将是一个更好的选择。如果它是捆绑在jar文件中的资源或者以其他方式捆绑在类路径中,请使用Class.getResourceAsStream()
;如果它是一个可以在文件系统中的任意位置的任意文件,请使用FileInputStream
。
答案 1 :(得分:1)
在将文件传递给readFilesInBytes()
之前,您是否检查该文件是否存在?请注意,如果找不到该文件,Class.getResourceAsStream()
将返回null
。你可能想这样做:
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));
}
或更好:
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);
}
答案 2 :(得分:0)
该类读取类路径中的TXT文件,并使用TextConversion转换为PDF,然后将pdf保存在文件系统中。
这里是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();
}
}
这里是ConversionToPDF的代码:
package convert.pdf;
// Interface implemented by the conversion algorithms.
public interface ConversionToPDF {
public byte[] convertDocument(byte[] documentToConvert) throws ConvertDocumentException;
}
我认为问题来自我的文件系统(windows和服务器上的devbox是Unix)。 我将尝试修改我的类路径。
答案 3 :(得分:0)
此问题可能是由test.txt
上的方法调用引起的,该方法可以是文件夹快捷方式。换句话说,您正在调用不存在的文件上的方法,从而产生NullPointerException
。