2013-08-27 2 views
-1

Я получаю файл XML от клиента. У меня есть еще один файл, содержащий Base-64 закодированные данные, которые я вставляю в один из элементов в XML-файле. После выполнения всего этого слияния мне нужно вернуть содержимое файла либо как string, либо объект DOM, возвращающийся как InputStream не будет работать.Как удалить нулевой символ из содержимого файла в java

Но полученный объединенный файл имеет null character в конце, который вызывает проблемы при обработке файла как XML. Как я могу избавиться от него. Вот как я объединяю свои файлы.

public Object merge(List<File> files) throws Exception { 
    System.out.println("merge with arguments is called"); 

    if(files == null || files.isEmpty() || files.size()<2){ 
     throw new IllegalArgumentException("File list cannot be null/empty and minimum 2 files are expected"); 
    } 

    File imageFile = getImageFile(files); 
    File indexFile = getIndexFile(files); 

    File inProcessFile = new File("temp/" + indexFile.getName().replaceFirst("[.][^.]+$", "") + ".xml"); 
    File base64EncodedFile = toBase64(imageFile); 

    /* Write from index file everything till attachment data to inProcess file*/ 
    Scanner scanner = new Scanner(indexFile).useDelimiter("\\s*<AttachmentData>\\s*");  
    FileWriter writer = new FileWriter(inProcessFile); 
    writer.append(scanner.next()); 

    /* Write <AttachmentData> element into inProcess file */ 
    writer.append("<AttachmentData>"); 

    /* Write base64 encoded image data into inProcess file */ 
    IOUtils.copy(new FileInputStream(base64EncodedFile), writer); 

    /* Write all data from </AttachmentData> element from index file into inProcess file */ 
    String fileAsString = IOUtils.toString(new BufferedInputStream(new FileInputStream(indexFile))); 
    String afterAttachmentData = fileAsString.substring(fileAsString.indexOf("</AttachmentData>")); 

    InputStream input = IOUtils.toInputStream(afterAttachmentData); 
    IOUtils.copy(input, writer); 

    /* Flush the file, processing completed */ 
    writer.flush(); 
    writer.close(); 
    System.out.println("Process completed"); 
} 


private File getIndexFile(List<File> files) { 
     for(File file:files){ 
      String extension = FilenameUtils.getExtension(file.getName()); 
      if(extension.equalsIgnoreCase(IDX_FILE_EXT)) 
       return file; 
     } 

     throw new IllegalArgumentException("Index file doesn't exist or cannot be read."); 

    } 


    private File getImageFile(List<File> files) { 
     for(File file:files){ 
      String extension = FilenameUtils.getExtension(file.getName()); 
      if(extension.equalsIgnoreCase(IMG_FILE_EXT)) 
       return file; 
     } 

     throw new IllegalArgumentException("Image file doesn't exist or cannot be read."); 

    } 


    private File toBase64(File imageFile) throws Exception { 
     System.out.println("toBase64 is called"); 
     Base64InputStream in = new Base64InputStream(new FileInputStream(imageFile), true); 
     File f = new File("/temp/" + imageFile.getName().replaceFirst("[.][^.]+$", "") + ".txt"); 
     Writer out = new FileWriter(f); 
     IOUtils.copy(in, out); 
     return f; 
    } 

Пожалуйста, помогите мне понять, как я могу исправить мой код, который производит нулевой символ

ответ

3

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

  1. Является ли нулевой символ уже присутствующим в исходном XML-файле, полученном от клиента?
  2. В каком месте документа XML появляется элемент, содержащий данные базы-64?
  3. В каком месте документа XML появляется нулевой символ?
  4. Вы декодируете файл base-64 в любой форме?
  5. Имеет ли файл base-64 нулевой символ?
  6. Если да, то почему?
  7. Какой метод используется для «слияния» данных с базовым 64-символом в документе XML?

Согласно информации, полученной позднее ОП, и если файл всегда содержит нулевой символ, самое простое решение для замены строки:

String afterAttachmentData = fileAsString.substring(fileAsString.indexOf("</AttachmentData>")); 

с

String afterAttachmentData = fileAsString.substring(fileAsString.indexOf("</AttachmentData>"),fileAsString.length()-1); 

Тем не менее, в конечном счете, гораздо лучше проверить с клиентом, если нулевой символ генерируется на их конце вещей, и если да, предложите им исправить код, который его генерирует o Документ XML действителен.

+1

+1, * Удалить/исправить * было бы лучше. –

+0

Пожалуйста, уточните мой вопрос. Я добавил код –

+0

@MartijnCourteaux Спасибо за предложение. –