2013-08-27 86 views
-1

我收到來自客戶端的XML文件。我有另一個文件,其中包含Base-64編碼的數據,我將其嵌入到XML文件中的一個元素中。完成所有這些合併後,我需要將文件的內容返回爲stringDOM對象,返回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文檔的哪個位置,包含base-64數據的元素出現?
  3. XML文檔在什麼位置顯示空字符?
  4. 您是否以任何形式解碼base-64文件?
  5. base-64文件是否包含空字符?
  6. 如果是,爲什麼?
  7. 使用什麼方法將base-64編碼的數據「合併」到XML文檔中?

按照後來由OP產生的信息,並且如果該文件總是包含空字符,最簡單的解決辦法是更換線:

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

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

然而,從長遠來看,最好是檢查客戶端是否在其末尾生成了空字符,如果是,則建議他們糾正生成它的代碼o XML文檔是有效的。

+1

+1,*刪除/修復*會更好。 –

+0

請參閱我的問題的更新。我添加了代碼 –

+0

@MartijnCourteaux感謝您的建議。 –

相關問題