Java Apache FileUtils проблемы readFileToString и writeStringToFile - PullRequest
4 голосов
/ 21 сентября 2011

Мне нужно проанализировать файл Java (на самом деле .pdf) в строку и вернуться к файлу.В промежутке между этими процессами я наложу некоторые исправления на данную строку, но в данном случае это не важноЯ разработал следующий тестовый пример JUnit:

    String f1String=FileUtils.readFileToString(f1);
    File temp=File.createTempFile("deleteme", "deleteme");
    FileUtils.writeStringToFile(temp, f1String);
    assertTrue(FileUtils.contentEquals(f1, temp));

Этот тест преобразует файл в строку и записывает его обратно.Однако тест не пройден.Я думаю, что это может быть из-за кодировок, но в FileUtils нет подробной информации об этом.Кто-нибудь может помочь?Спасибо!

Добавлено для дальнейшего понимания: зачем мне это?У меня есть очень большие PDF-файлы на одной машине, которые копируются на другой.Первый отвечает за создание этих PDF-файлов.Из-за низкого уровня подключения второй машины и большого размера файлов PDF я не хочу синхронизировать файлы PDF целиком, а только внесенные изменения.Для создания патчей / их применения я использую библиотеку Google DiffMatchPatch.Эта библиотека создает патчи между двумя строками.Поэтому мне нужно загрузить pdf в строку, применить сгенерированный патч и вернуть его обратно в файл.

Ответы [ 4 ]

4 голосов
/ 21 сентября 2011

PDF не является текстовым файлом. Декодирование (в символы Java) и перекодирование двоичных файлов, которые не являются закодированным текстом, является асимметричным. Например, если входной поток данных недопустим для текущей кодировки, вы можете быть уверены, что он не будет правильно перекодирован. Короче - не делай этого. Вместо этого используйте readFileToByteArray и writeByteArrayToFile .

0 голосов
/ 12 июня 2012

Попробуйте этот код ...

  public static String fetchBase64binaryEncodedString(String path) {
        File inboundDoc = new File(path);
        byte[] pdfData;
        try {
            pdfData = FileUtils.readFileToByteArray(inboundDoc);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        byte[] encodedPdfData = Base64.encodeBase64(pdfData);
        String attachment = new String(encodedPdfData);
        return attachment;
    }

//How to decode it
public void testConversionPDFtoBase64() throws IOException
{
   String path = "C:/Documents and Settings/kantab/Desktop/GTR_SDR/MSDOC.pdf";
   File origFile = new File(path);
   String encodedString = CreditOneMLParserUtil.fetchBase64binaryEncodedString(path);

  //now decode it
  byte[] decodeData  = Base64.decodeBase64(encodedString.getBytes());
  String decodedString = new String(decodeData);
  //or actually give the path to pdf file.
  File decodedfile = File.createTempFile("DECODED", ".pdf");
  FileUtils.writeByteArrayToFile(decodedfile,decodeData);
  Assert.assertTrue(FileUtils.contentEquals(origFile, decodedfile));

 // Frame frame = new Frame("PDF Viewer");

 // frame.setLayout(new BorderLayout());

}
0 голосов
/ 22 сентября 2011

Эд Стауб замечает, почему мое решение не работает, и предложил использовать байты вместо строк.В моем случае мне нужна строка, поэтому я нашел следующее окончательное рабочее решение:

@Test
public void testFileRWAsArray() throws IOException{
    String f1String="";
    byte[] bytes=FileUtils.readFileToByteArray(f1);
    for(byte b:bytes){
        f1String=f1String+((char)b);
    }
    File temp=File.createTempFile("deleteme", "deleteme");
    byte[] newBytes=new byte[f1String.length()];
    for(int i=0; i<f1String.length(); ++i){
        char c=f1String.charAt(i);
        newBytes[i]= (byte)c;
    }
    FileUtils.writeByteArrayToFile(temp, newBytes);
    assertTrue(FileUtils.contentEquals(f1, temp));
}

Используя преобразование между byte-char, я получаю симметрию при преобразовании.Спасибо всем!

0 голосов
/ 21 сентября 2011

Несколько мыслей:

  1. На самом деле в одном из файлов может быть несколько байтов BOM (метка порядка байтов), которые либо удаляются при чтении, либо добавляются во время записи.Есть ли разница в размере файла (если это спецификация, разница должна составлять 2 или 3 байта)?

  2. Разрывы строк могут не совпадать, в зависимости от того, в какой системе создаются файлыто есть один может иметь CR LF, а другой - только LF или CR.(Разница в 1 байт на разрыв строки)

  3. В соответствии с JavaDoc оба метода должны использовать кодировку JVM по умолчанию, которая должна быть одинаковой для обеих операций.Однако попробуйте выполнить тестирование с явно установленной кодировкой (кодировка JVM по умолчанию будет запрашиваться с использованием System.getProperty("file.encoding")).

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