2

春のフレームワークを介してテキストファイルの内容を読み取る必要があるという要件があります。この目的のために、以下のようにサービス実装クラスにメソッドを作成しました-

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 でファイル名をハードコーディングする必要があるため、file パラメーターを使用しないことです。

解決策を見つけるのを手伝ってください。私は春が初めてで、それを試しているので、何かが足りない可能性があります. どんな助けでも大いに役立ちます。

4

2 に答える 2

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 def は次のようになります。

<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

于 2012-04-18T04:59:56.510 に答える
0

私はこのコードが機能することをテストしました.....実装してみてください....schedular.xmlファイルをur proj構成フォルダーにコピーして貼り付ける必要があります(urアプリケーションのapplicationContext.xmlファイルで、contextConfigLocation WEB-である必要があります- web.xml ファイルの INF/config/*.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>
于 2014-02-27T00:46:42.817 に答える