Почему я получаю исключение NullPointerException при попытке прочитать файл? - PullRequest
6 голосов
/ 01 апреля 2009

Я использую этот тест для преобразования текста в формат 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));
  }

В чем моя проблема?

Ответы [ 4 ]

19 голосов
/ 01 апреля 2009

Звучит так, как будто ресурса с таким именем не существует.

Знаете ли вы, что Class.getResourceAsStream() находит ресурс относительно пакета этого класса, а ClassLoader.getResourceAsStream() - нет? Вы можете использовать переднюю косую черту в Class.getResourceAsStream(), чтобы имитировать это, поэтому

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

примерно эквивалентно

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

Является ли этот на самом деле файлом (то есть определенным файлом в нормальной файловой системе), который вы пытаетесь загрузить? Если это так, лучше использовать FileInputStream. Используйте Class.getResourceAsStream(), если это ресурс, связанный каким-либо другим способом в jar-файле или в пути к классам; используйте FileInputStream, если это произвольный файл, который может находиться где угодно в файловой системе.

РЕДАКТИРОВАТЬ: Еще одна вещь, о которой следует помнить, которая вызывала у меня проблемы до сих пор - если это сработало на вашем устройстве разработки, которое, как оказалось, Windows, и теперь происходит сбой на рабочем сервере, который, как оказалось, Unix, проверьте регистр имени файла. Тот факт, что разные файловые системы по-разному обрабатывают чувствительность к регистру, может быть болезненным ...

1 голос
/ 01 апреля 2009

Проверяете ли вы, существует ли файл, прежде чем передать его в 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);
}
0 голосов
/ 02 августа 2012

Эта проблема может быть вызвана вызовом методов на test.txt, который может быть ярлыком папки. Другими словами, вы вызываете метод для файла, который не существует, в результате чего NullPointerException.

0 голосов
/ 01 апреля 2009

Этот класс читает 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;
    }

Я думаю, что проблема связана с моей файловой системой (devbox на Windows и сервере Unix). Я попытаюсь изменить мой путь к классам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...