在spring中读取txt文件的方法

时间:2012-04-18 03:46:58

标签: spring file-io

我有一个要求,我需要通过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对文件名进行硬编码,所以没有使用file参数。

请帮助找到解决方案。因为我刚接触春天,并尝试用它,所以我可能会遗漏一些东西。任何帮助都会有很大的帮助。

2 个答案:

答案 0 :(得分: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

调用应用来设置值

答案 1 :(得分:0)

我已经测试了这段代码的工作原理.....     尝试实现....你必须在ur proj配置文件夹中复制paste schedular.xml文件(其中applicationContext.xml文件在你的应用程序中,它必须是             contextConfigLocation的             WEB-INF /配置/ *。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>