ankit rai
ankit rai

Reputation: 334

method in spring to read txt file

I am having a requirement wherein I need to read the contents of a text file through spring framework. For this purpose I made a method in my service implementation class as below-

public String readFile(File file)

This method will take the file name as input and read the file.

I was writing the code in XML for spring as below-

<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>

Following code goes in my method-

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;
}

But here the issue is that i need to hardcode the file name in XML, so there is no use of file parameter.

Kindly help in finding the solution. As I am new to spring and trying my hands with it so it may be possible that I am missing something. Any help would be of great help.

Upvotes: 3

Views: 26297

Answers (2)

Ramchandar T
Ramchandar T

Reputation: 1

I have tested this code its working..... Try to implement....you have to copy paste schedular.xml file in ur proj configuration folder(where applicationContext.xml file in ur application and it has to be contextConfigLocation WEB-INF/config/*.xml in ur web.xml file).

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>

Upvotes: 0

Greg Case
Greg Case

Reputation: 3240

Don't inject the streams and readers, that's not really how Spring is intended to be used. I'd inject the file itself:

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;
    }

}

Then your bean def looks like this:

<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>

All that is left is to create your app.properties file with the correct info. You can also set the value by invoking the app with a -DfilePath=/foo/bar/whatever.txt

Upvotes: 4

Related Questions