2012-06-28 36 views
0

我从大型机应用程序获取数据。该文件是'sample.txt'文件的名称。当我通过'FTP'使用java代码读取数据以将其数据存储到oracle数据库时。它在名称字段中显示一些特殊字符。另外一个信息我们的产品,我们也使用国际化。我们使用葡萄牙语,西班牙语,英语。我使用独立的java程序运行这个。这真的是使用java的FTP代码的原因吗?

例如给定的输入,

DTALRVAQCRAÜL TORRENTS +34 93 8640317 +34 93 8640304 [email protected] 20100511FAO 
DTALRVAQCRAÜL TORRENTS +34 93 8640317 +34 93 8640304 [email protected] 20100511FAO 

输出,

DTALRVAQCRAðL TORRENTS +34 93 8640317 +34 93 8640304 [email protected] 20100511FAO 
DTALRVAQCRAðL TORRENTS +34 93 8640317 +34 93 8640304 [email protected] 20100511FAO 

什么是对我来说,解决这个问题的解决方案。

我的样本Java文件,

public void loadData() throws Exception { 

      emailMsg.setLength(0);   
      BufferedReader br = null;  
      int r12InsCnt = 0; 
      int r12UpdCnt = 0; 
      String strLine = null;   
      int totalrows = 0; int trailerCnt = 0; 
      String rundate = ""; 
      String endDate = ""; 
      Connection conn = null;   
      CallableStatement cs = null; 
      String tmpFilename=""; 
      List regns = new ArrayList(); 
      BufferedOutputStream bos = null; 
      int buffer = 0; 
      InputStream in; 
      FileInputStream fstream1=null; 
      File tempFile = null; 

      String METHOD_NAME = "loadData";    
      try 
      {       
       String DATE_FORMAT = "MMddyyyy"; 
       java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(DATE_FORMAT); 
       Calendar c1 = Calendar.getInstance(); 
       String today = sdf.format(c1.getTime()); //mmddyyyy 

       CommonUtil cu = new CommonUtil(); 
       rundate = cu.getCurrentDtTimestamp("yyyy/MM/dd HH:mm:ss.S");    

       //get NAS server details from DynoProp table 
       PropertyManager propmanager = PropertyManager.getInstance();    
       PropertyGroup vrpgProGroup = propmanager.getGroup("ServerCredentials");  
       String user = vrpgProGroup.getString("id");    
       String password = vrpgProGroup.getString("password"); 
       String serverName = vrpgProGroup.getString("server"); 

       FtpClientAttributes ftpAttribs = new FtpClientAttributes.Builder(serverName,user,password).build(); 
       FtpProxyClient ftp = new FtpProxyClient(ftpAttribs);     
       //ftp.setBinaryMode(); 
       ftp.setAsciiMode(); 
       ftp.changeDirectory("Vrpg"); 

       if(ftp.isFileExists("vrpg.contacts.txt")) 
       { 
        tmpFilename = "vrpg_contacts_Pr_" + today + ".txt"; 
        ftp.renameFile("vrpg.contacts.txt", tmpFilename); 
        in = ftp.getFile(tmpFilename); 

        //String tempDir = "/proj/mingle/was/install/mingle_mingleEAR.ear/mingleWeb.war/vrpg/"; 
        String tempDir = System.getProperty("java.io.tmpdir") + "/";      

        if("DESKTOP".equalsIgnoreCase(System.getProperty("DEPLOYED_ENVIRONMENT"))) { 
         tempDir = "C:/SDPRNG/vrpg/"; 
        } 

        bos = new BufferedOutputStream(new FileOutputStream(tempDir + tmpFilename));           
         while ((buffer = in.read()) != -1) { 
          bos.write(buffer); 
         } 
         bos.flush(); 
         bos.close();      
         ftp.cleanup(); 

         tempFile = new File(tempDir + tmpFilename); 
         fstream1 = new FileInputStream(tempFile); 
         br = new BufferedReader(new InputStreamReader(fstream1,"CP1252")); 

         conn = DBConnection.getmingleConnection(); 
         PreparedStatement pstmt = null; 

         try{ 
          if(conn!=null){ 
          pstmt = conn.prepareStatement(mingleQuery.UPDATER12DELETEFLAG); 
          pstmt.execute(); 
          } 
         }catch(SQLException e){ 
          throw new mingleBusinessException(
            new ruralExceptionAttributes.Builder(
            CLASS_NAME, METHOD_NAME).build(), 
            "Getting exception while updating the delete flag in loadData ", e); 
         } 

         while ((strLine = br.readLine()) != null)      
         { 
          try 
          { 
           //Header:"AA", Trailer:"ZZ", Detail:"DT" record. 
           if(strLine.substring(0,2).equalsIgnoreCase("ZZ")) 
           { trailerCnt = Integer.parseInt(strLine.substring(36,43)); } 

           if(strLine.substring(0,2).equalsIgnoreCase("DT")) 
           {     
            totalrows++; 
            System.out.println("The Values is :"+strLine.length()); 
            //System.out.println("calling SP for:" + strLine.substring(2,7)); 
            //insert to R12 
            try 
            {     
            cs = null; 
            cs = conn.prepareCall("{call createDetailContactRawdata(?,?,?,?,?,?,?,?,?,?,?,?)}");      
            cs.setString(1, strLine.substring(2,7).trim()); //sitecode 
            cs.setString(2, "vrpg"); 
            cs.setString(3, strLine.substring(7,9).trim()); //title      
            cs.setString(4, strLine.substring(160).trim()); //org 
            cs.setString(5, strLine.substring(9,41).trim()); //name 
            cs.setString(6, strLine.substring(41,63).trim()); //phone 
            cs.setString(7, strLine.substring(63,85).trim()); //cell 
            cs.setString(8, strLine.substring(85,107).trim()); //fax 
            cs.setString(9, strLine.substring(107,152).trim()); //email 
            cs.setString(10, strLine.substring(152,160));  //last update date     
            cs.registerOutParameter(11, java.sql.Types.VARCHAR); 
            cs.registerOutParameter(12, java.sql.Types.CHAR); 
            cs.execute();       
            if(!"S".equals(cs.getString(11))){ 
             emailMsg.append(cs.getString(11));           
            } 
            else 
            { 
             if(cs.getString(12).equalsIgnoreCase("I")) r12InsCnt++; 
             if(cs.getString(12).equalsIgnoreCase("U")) r12UpdCnt++; 
            } 
            cs.close();              
            } catch(Exception e) { 
            System.out.println("sp error:" + e.getMessage()); 
            emailMsg.append("Error occured executing SP:" + strLine.substring(2,7)+strLine.substring(7,9).trim()+ strLine.substring(160).trim()+ e.getMessage() + "\n"); 
            } 
           }//end if DT 

          }catch(Exception e){ 
          System.out.println("error inside while" + e.getMessage()); 
          emailMsg.append("Error reading vrpg contacts file:" + strLine.substring(0,25)+ e.getMessage()+ "\n"); 
          log.logp(Level.INFO,CLASS_NAME,"loadData", "error reading vrpg contacts file" + e.getMessage().toString()); 
          } 

         } //end while 

         try{ 
          if(conn!=null){ 
          pstmt = conn.prepareStatement(mingleQuery.DELETER12_DELETEFLAG_Y); 
          pstmt.execute(); 
          } 
         }catch(SQLException e){ 
          throw new mingleBusinessException(
            new ruralExceptionAttributes.Builder(
            CLASS_NAME, METHOD_NAME).build(), 
            "Getting exception while deleting the records with delete flag 'Y' in loadData ", e); 
         } 

         br.close(); 
         conn.close(); 
         if(pstmt != null) pstmt.close(); 

         //System.out.println("Total Rows ** :" + totalrows); 
         //System.out.println("Trailer Count** :" + trailerCnt); 

         if(totalrows < trailerCnt) { emailMsg.append("Total rows processed is less than trailer record count:" + totalrows + "/" + trailerCnt + "\n"); } 

        /*System.out.println("r12InsCnt:" + r12InsCnt);     
         System.out.println("r12UpdCnt:" + r12UpdCnt);*/ 

        endDate = cu.getCurrentDtTimestamp("MM/dd/yyyy HH:mm:ss"); 
        //create log for batch process with number of rows retrieved from vrpg and rows inserted into mingle 
        BatchLogBO batchLogBO = new BatchLogBO(); 
        batchLogBO.setBusnType(busnType);   
        batchLogBO.setRatingRegion(region);    
        batchLogBO.setStartDate(rundate); 
        batchLogBO.setEndDate(endDate); 
        batchLogBO.setRowsReceived(totalrows); 
        batchLogBO.setRowsInserted(r12InsCnt); 
        batchLogBO.setRowsUpdated(r12UpdCnt); 
        batchLogBO.setRowsDeleted(0); 
        batchLogBO.setBatchName("vrpgCONATCTS"); 
        batchLogBO.setBatchType("DAILY"); 
        batchLogBO.setvrpgCode("NONE"); 
        batchLogBO.setLastUpdtPgmCode("BATCH"); 
        try 
        { 
          mingle_BINDING_AS.beginTransaction(); 
          batchLogBO = mingle_BINDING_AS.bindCreateOrUpdate(batchLogBO); 
          mingle_BINDING_AS.commitTransaction(); 
        } catch(Exception e) { 
          emailMsg.append("Error inserting batchLog:" + e.getMessage() + "\n"); 
        }          
        //System.out.println("about to run load instance for all regions"); 
        try 
        { 
         //call loadInstance method to load instance data for each region      
         regns = getRegions(); 
         for(int k=0; k<regns.size(); k++) {       
          loadInstance(cu.getCurrentDtTimestamp("MM/dd/yyyy"),regns.get(k).toString()); 
         } 
        }catch(Exception e) { 
         emailMsg.append("Error getting regions to run loadInstance:" + e.getMessage() + "\n"); 
        } 

       } else {     
        Mailbox.sendMail("[email protected]", "[email protected]", System.getProperty("DEPLOYED_ENVIRONMENT"), "vrpg Contacts file not found on NAS"); 
        return; 
       } 

       if ((emailMsg.toString().length() > 1) && (!emailMsg.toString().equalsIgnoreCase(null)) && (!emailMsg.toString().equalsIgnoreCase("null"))) {  
        Mailbox.sendMail("[email protected]", "[email protected]", System.getProperty("DEPLOYED_ENVIRONMENT")+ ":Load vrpg Contacts Details", emailMsg.toString()); 
       } 

       tempFile.delete(); //delete tmp file from app server 

       ftp = new FtpProxyClient(ftpAttribs); 
       emailMsg.append(cu.deletefile(ftp,today,"vrpg_Contacts_")); //delete old files from NAS 
       ftp.cleanup(); 

      } catch(Exception e) { 
       System.out.println("inside final exception:" + e.getMessage()); 
       if(br != null) br.close();    
       if(conn !=null) conn.close(); 
       emailMsg.append("Error:" + e.getMessage()+ "\n"); 
       Mailbox.sendMail("[email protected]", "[email protected]", System.getProperty("DEPLOYED_ENVIRONMENT")+ ":Load vrpg Contacts Details", emailMsg.toString()); 
       log.logp(Level.INFO,CLASS_NAME,"loadData", "error getting vrpg contacts file from NAS:" + e.getMessage().toString()); 
      } 

    } 

回答

4

这是你的问题,最有可能的:

br = new BufferedReader(new InputStreamReader(fstream1,"CP1252")); 

你假设他们正在使用的转换文件成字符的字节CP1252编码。

如果文件的实际编码是而不是 CP1252,那么字节将映射到错误的字符。 (几乎每种编码对“ASCII字符”都使用相同的值,因此只会看到“特殊”字符的错误。)是什么让您决定使用CP1252进行解码,您确定这是正确的吗?

要解决您的问题,请找出这些文件使用的实际编码,然后将其传递到InputStreamReader构造函数中。

+0

我该如何恢复问题。 –

+0

**补充:**此外,如果文本文件实际上在CP1252中,则它将不能包含来自不同语言的字符。在这种情况下,最好切换到UTF-8。 – bezmax

+3

@KallarMannargudi找出您的文本文件的实际编码。当你这样做时 - 在该行代码中指定它。 – bezmax

0

与大型机通信时需要小心。这取决于您如何通过FTP传输文件,因为它可能在传输中自动转换为ASCII。

通常情况下,二进制传输将为您提供本地EBCDIC,您需要将其转换为ASCII。如果您的文件包含二进制数字(如COMP3),则可能不希望转换数据流中的数据。

美国EBCDIC代码页通常是Cp1047,这里是一个将字符串转换为ASCII的代码示例。您可以将任何代码页文本(美国为“Cp1047”)传递到您文件的例程:

// Convert Binary EBCDIC Data to String 
public static String toASCII(byte[] arr, int offset, int len, String codepage){ 
    try { 
     return new String(arr, offset, len, codepage); 
    } catch (UnsupportedEncodingException e) { 
     System.out.println("Error Occurred translating EBCDIC data to String"); 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

对不起,我使用asciicode而不是二进制代码 –

+0

你知道你的FTP服务器使用什么代码页来转换文件? – Mike

+0

感谢您的回复 –

相关问题