2

我有一个要求,我需要通过 spring 框架读取文本文件的内容。为此,我在我的服务实现类中创建了一个方法,如下所示 -

public String readFile(File file)

此方法将文件名作为输入并读取文件。

我正在为 Spring 编写 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 中硬编码文件名,所以没有使用文件参数。

请帮助找到解决方案。因为我是春天的新手,所以我可能会错过一些东西。任何帮助都会有很大帮助。

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 文件(你的应用程序中的 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 回答