今天做的时候遇到了一个问题,如何从一个 .txt文本 中读取每一行 然后去数据库中进行比对。
刚开始 说真的脑子很乱,就是不知从哪下手。如何读取.txt特别是获取每一行 然后去数据库进行比对。由于没接触过,心里不禁的哆嗦起来,但是我知道自己能解决。下面讲一下我的解决
过程:
首先:我的项目是由SSH 前台的框架是Struts2.0
刚开始的时候我从网上查找一些关于Struts的资料。很的多网友提到了actionForm去做。
说真的可能我是没有很好的理解Struts1.x与Struts2.x之间的区别,自己对于Struts可以说也是刚接触,很多东西还是处于入门级别。
捕获输入(摘):
Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。动态Bean(DynaBeans)可以作
为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。
Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。
可以看出Struts2.0不需要actionForm 并可以直接把页面的属性值传到对应的action中,当然传的值和属性要匹对。这样并可以了!
例如的我的jsp页面:violateRecord.jsp
<div id="main">
<s:form id="uploadform" name="uploadform" namespace="/membership" action="fileUpload" enctype="multipart/form-data" method="post">
选择要上传的文件 <input type="file" name="myFile" id="myFile" /> <input type="submit" value="上传" /> //enctype="multipart/form-data" 必不可少,少了会报错
</s:form>
</div>
我的action类的:FileUploadAction.java
部分代码:
private File myFile;
public String execute() {
InputStream in=null;
try{
if(myFile!=null){
in = new FileInputStream(myFile);//myFile的属性对应了violateRecord.jsp控件的
// <input type="file" name="myFile" id="myFile" />
String memberId=null;
ViolateRecordDto dto=new ViolateRecordDto();
BufferedReader br=new BufferedReader(new InputStreamReader(in)); //把上传的文件流转化成BufferedReader用来读取文本
String c=br.readLine(); //BufferedReader 类 BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取分行文本很适合, BufferedReader是针对Reader的,不直接针对文件,也不是只针对文件读取
//while循环读取每一行文本
while(c!=null){
memberId=carService.IsExistCarNo(c);
if( memberId!=null){
dto.setImportDate(new Date());
dto.setCarNo(c);
dto.setMemberId(Integer.valueOf(memberId));
violateRecordService.addViolateRecord(dto);
}
c = br.readLine();
}
}
setGoingToURL("/membership/violateRecord.do");//这是我提交完后页面跳转的路径 相应的配置在struts2.0也要配置
}catch(Exception e){
e.printStackTrace();
}finally{
}
return SUCCESS;
}
配置文件省略。。其实现在看起来 大体上就这样,也不是很难,就像有时候人就困在某地方,急了乱了,冷静下来,会发现事情没有自己想象的那么难。
下面是在对应的Struts2.0中实现文件上传。
public String execute() {
String error="";
String msg = "";
int height=0,width=0;
try{
imageFileName = new Date().getTime() + getExtention(fileName).toLowerCase();//先从getExtention()文件的后扩展名 比如:.txt 新的文件名是以日期为开头的名字
String result ="";
File imageFile = new File(ServletActionContext.getServletContext().getRealPath( "/upload/temp" ) + "/" + imageFileName);//我的理解是初始化一个要保存的文件的路径 属性为 File
//同时注意 在struts的propertites中要设置struts.multipart.saveDir=/temp 不然会找到上面的路径的
copy(myFile, imageFile);//下面是把myFile文件流真正的转化成原本的属性 .txt文本(记住myFile的value值是.temp的结尾说明他不是.txt需要转化成)
}catch(Exception e){
e.printStackTrace();
}finally{
try{
response.setContentType("text/html");
response.getWriter().flush();
//response.getWriter().print(imageFileName);
response.getWriter().write("{ error:'" + error + "',"
+"height:'" + String.valueOf(height) + "',"
+"width:'" + String.valueOf(width) + "',"
+"fileName:'" + imageFileName + "'}");
response.getWriter().close();
}catch(Exception e){e.printStackTrace();}
}
return Action.SUCCESS;
}
private static String getExtention(String fileName) {
int pos = fileName.lastIndexOf( "." );
return fileName.substring(pos);
}
private static void copy(File src, File dst) {
try {
InputStream in = null ;
OutputStream out = null ;
try {
in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);
out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);
byte [] buffer = new byte [BUFFER_SIZE];
while (in.read(buffer) > 0 ) {
out.write(buffer);//把in的流的内容相当于写进了out中 即要保存的相应的路径下东东
}
}catch(Exception e) {
throw e;
}finally {
if ( null != in) {
in.close();
}
if ( null != out) {
out.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}