2012-04-18 35 views
2

我有一個需求,我需要通過spring框架閱讀文本文件的內容。爲此我在服務實現類生成的方法如下─在春天閱讀txt文件的方法

public String readFile(File file) 

此方法將文件名作爲輸入和讀取文件。

我在寫代碼的XML春爲如下─

<bean id="fstream" class="java.io.FileInputStream"> 
    <constructor-arg value="C:/text.txt" /> 
</bean> 
<bean id="in" class="java.io.DataInputStream"> 
    <constructor-arg ref="fstream"/> 
</bean> 
<bean id="isr" class="java.io.InputStreamReader"> 
    <constructor-arg ref="in"/> 
</bean> 
<bean id="br" class="java.io.BufferedReader"> 
    <constructor-arg ref="isr"/> 
</bean> 

以下代碼放在我的方法 -

public String readFile(File file) 
{ 
    String line = null; 
    String content = ""; 

    try 
    { 
     ApplicationContext context = new ClassPathXmlApplicationContext("FileDBJob.xml"); 

     BufferedReader br = (BufferedReader) context.getBean("br"); 

     while((line = br.readLine())!=null) 
      content = content.concat(line); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return content; 
} 

但這裏的問題是,我需要硬編碼的文件名在XML中,所以沒有使用文件參數。

請幫忙尋找解決方案。因爲我對春天很陌生,所以我可能會錯過一些東西。任何幫助都會有很大的幫助。

+0

看看SpringStructure的PropertyResolver或AbstractEnvironment。 – andih 2012-04-18 03:55:59

回答

4

不要注入流和讀者,這不是Spring如何使用。我會注入文件本身:

public class MyFileReader { 

    private File file; 

    public String readFile() { 
     StringBuilder builder = new StringBuilder(); 
     BufferedReader reader = null; 
     try { 
      reader = new BufferedReader(new FileReader(getFile())); 
      String line = null; 
      while ((line = reader.readLine()) != null) 
       builder.append(line); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      closeQuietly(reader); 
     } 
     return builder.toString(); 
    } 

    private void closeQuietly(Closeable c) { 
     if (c != null) { 
      try { 
       c.close(); 
      } catch (IOException ignored) {} 
     } 
    } 

    public File getFile() { 
     return file; 
    } 

    public void setFile(File file) { 
     this.file = file; 
    } 

} 

然後你的bean高清看起來是這樣的:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:app.properties"/> 
</bean> 

<bean class="com.myapp.MyFileReader"> 
    <property name="file" value="${filePath}" /> 
</bean> 

所有剩下是創建app.properties用正確的信息文件。您還可以通過與-DfilePath=/foo/bar/whatever.txt

+1

感謝您的輸入。下面的代碼解決了我的問題 - FileSystemResource res = new FileSystemResource(file.getName()); BufferedReader br = new BufferedReader(new InputStreamReader(res.getInputStream())); while((line = br.readLine())!= null)content = content.concat(line); – 2012-04-18 05:58:28

+0

我在哪裏放置bean定義文件? 'application-context.xml'或'spring-servlet.xml'? – 2014-02-13 09:55:22

0

調用應用程序設置的值我已經測試此代碼它的工作..... 試圖實現....你必須複製粘貼schedular.xml文件烏爾凸出配置文件夾(其中應用程序中的applicationContext.xml文件必須是 contextConfigLocation WEB-INF/config/*。xml 在您的web.xml文件中)。

Then configure SvhedularTask bean in ur service classes xml file....it will trigger for every minute. 

////SCHEDULARTASK.JAVA////// 

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.Date; 

import javax.servlet.ServletContext; 

import org.springframework.web.context.ServletContextAware; 


/** 
* The Class SchedulerTask. 
*/ 
public class SchedulerTask implements ServletContextAware{ 

    private ServletContext servletContext; 

    @Override 
    public void setServletContext(ServletContext arg0) { 
     // TODO Auto-generated method stub 
     this.servletContext = arg0; 
    } 

    public void unZipProcess() throws IOException{ 
     System.out.println(servletContext); 
     File folder = new File("C:/Users/rerrabelli/Desktop/test"); 
     File[] listOfFiles = folder.listFiles(); 
     if (listOfFiles != null){ 
      for (int i = 0; i < listOfFiles.length; i++) { 
       if (listOfFiles[i].isFile()) { 
        if (listOfFiles[i].getName().endsWith(".txt")) { 
         File file = new File("C:/Users/rerrabelli/Desktop/test" + File.separator 
           + listOfFiles[i].getName()); 
         long millisec = file.lastModified(); 
         Date dt = new Date(millisec); 
         long difference = new Date().getTime()-dt.getTime(); 
         System.out.println((difference/1000)/60); 
         if(((difference/1000)/60)<1){ 
          FileInputStream fin = new FileInputStream(
            file); 
          ByteArrayOutputStream tmp = new ByteArrayOutputStream(); 
          byte b; 
          while ((b = (byte) fin.read()) != -1) { 
           tmp.write(b); 
          } 
          byte[] customerData = tmp.toByteArray(); 
          String data = new String(customerData); 
          System.out.println(data); 
          servletContext.setAttribute(file.getName(), data); 
         } 
        } 
       } 
      } 
     } 
     System.out.println(servletContext.getAttribute("test.txt")); 
    } 

} 

//////APPLICATION CONTEXT.xml///////// 

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 



    <bean id="schedulerTask" class="com.altimetrik.simreg.service.impl.SchedulerTask"> 

    </bean> 
</beans> 

====================== 
SCHEDULAR.XML 
=========== 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd" > 
<beans> 

    <import resource="applicationContext.xml"/> 

    <bean id="schedulerTask1" 
     class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
     <property name="targetObject"> <ref bean="schedulerTask" /> </property> 
     <property name="targetMethod"> <value>unZipProcess</value> </property> 
     <property name="concurrent"> <value>false</value> </property> 
    </bean> 

    <bean id="UnzipTrigger" 
     class="org.springframework.scheduling.quartz.CronTriggerBean"> 
     <property name="jobDetail"> <ref bean="schedulerTask1" /> </property> 
     <property name="cronExpression"> <value>0 0/1 * * * ?</value> </property> 
    </bean> 

    <bean 
     class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
     <property name="triggers"> 
      <list> 
       <!-- Add triggers here--> 
       <ref bean="UnzipTrigger" /> 
      </list> 
     </property> 
    </bean> 
</beans>