把文件保存到数据库的时候,我把保存时间也放入数据库的一个samlldatetime列中。之后,根据需要取出来的时候,想把保存的时间也设置到取出来的文件的时间里,取出来是成功了,但setLastModified却总是false。
代码如下:private static boolean fromDoc2File(String tableName1){
ok=false;
strsql="select docName, saveDate, document from document where tableName='"
+tableName1+"'";
String fileName="";
try{
File dir=new File("WebRoot/WEB-INF/AttFile");
if (dir==null||!dir.isDirectory()){
dir.mkdir();
}
dir=new File("WebRoot/WEB-INF/AttFile/"+tableName1);
if (dir==null||!dir.isDirectory()){ //如果这个目录不存在,就生成一个
dir.mkdir();
}
rs=db.executeQuery(strsql);
int snInTable=0;
String extName="";
java.util.Date saveDate=new java.util.Date();
// String saveDate="";
long saveTime=0;
java.sql.Time saveTime2=null;
InputStream is=null;
String dirName="WebRoot/WEB-INF/AttFile/"+tableName1+"/";
while (rs.next()){
fileName=rs.getString("docName");
saveDate=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(rs.getString("saveDate")); //*2
saveTime=rs.getDate("saveDate").getTime();
saveTime2=rs.getTime("saveDate");
is=rs.getBinaryStream("document");
fileName=dirName+fileName;
java.io.OutputStream os=new FileOutputStream(fileName);
byte[] buffer = new byte[512];
int bytesRead = 0;
//while(doc.getDocument().read(b)!=-1){
while ((bytesRead=is.read(buffer))!=-1) {
os.write(buffer, 0, bytesRead);
}
dir=new java.io.File(fileName);
ok=dir.setLastModified(saveDate); //*1
System.out.println(dir.getName()+", 原始时间:"+saveDate+", time="+saveTime2
+", getTime="+saveDate.getTime()+", saveTime="+saveTime
+", 设置时间:"+ok);
}
ok=true;
}catch(Exception e){
e.printStackTrace();
System.out.println(fileName+"出错!");
}
return ok;
}
*1处总是为false,应该如何修改,才能true?
通过这次编程,我才知道,原来java从数据库中(是sql server 2005)取出时间的函数,分成getDate()和getTime(),分别只取出日期和时间,请问有没有那个函数是可以一次过取出数据列中的日期和时间的?现在我采取的办法是*2的写法。
谢谢。

解决方案 »

  1.   

    发问的帖子,有些地方有错,*1处应该是:
    ok=dir.setLastModified(saveDate.getTime);        //*1
    *2行太长了,已经超出了显示范围,代码是:
    saveDate=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(rs.getString("saveDate"));        //*2
    1楼的大侠,先谢谢你的帮忙。
    我立刻改了代码,把变量saveDate的类型改为java.sql.Timestamp的,然后取出语句也改为saveDate=rs.getTimestamp("saveDate");
    但结果仍然是false。谢谢。
      

  2.   

    setLastModified(long time) time是长整型。
      

  3.   

    我知道啊!!!!
    代码我已经改为ok=dir.setLastModified(saveDate.getTime());了
      

  4.   

    saveDate是Date类型,Date的getTime()方法得到从1970年1月1日到现在经历的毫秒数
    dir.setLastModified(saveDate); 
    改为       
    dir.setLastModified(saveDate.getTime()); 
      

  5.   

    复5楼,我已经改了啊!!在前面的帖子里面写了。
    我又在main函数里面测试了一下,直接用文件名来测试,立刻就成功了。代码如下:public static void main(String ar []){
    System.out.println(fromDoc2File("expense"));
    File file=new File("WebRoot/WEB-INF/AttFile/expense/expense771.rar");
    if (file.isFile()){
    System.out.println(file.setLastModified((new java.util.Date()).getTime()-(long)(60*60*24*1000*13)));
    }else
    System.out.println("不是一个文件。");
    }结果却是true,是看了很久,除了上面用了变量,实在看不出什么区别。
      

  6.   


    private static boolean fromDoc2File(String tableName1){
    ok=false;
    strsql="select docName, snInTable, saveDate, document from document where tableName='"+tableName1+"'";
    String fileName="";
    try{
    File dir=new File("WebRoot/WEB-INF/AttFile");
    if (dir==null||!dir.isDirectory()){
    dir.mkdir();
    }
    dir=new File("WebRoot/WEB-INF/AttFile/"+tableName1);
    if (dir==null||!dir.isDirectory()){ //如果这个目录不存在,就生成一个
    dir.mkdir();
    }
    rs=db.executeQuery(strsql,message);
    int snInTable=0;
    String extName="";
    java.util.Date saveDate=new java.util.Date();
    InputStream is=null;
    String dirName="WebRoot/WEB-INF/AttFile/"+tableName1+"/";
    java.util.ArrayList<String> al=new ArrayList<String>();
    while (rs.next()){
    fileName=rs.getString("docName");
    snInTable=fileName.lastIndexOf(".");
    extName=fileName.substring(snInTable);
    snInTable=rs.getInt("snInTable");
    fileName=dirName+tableName1+snInTable+extName;
    al.add(fileName+"|"+rs.getString("saveDate"));
    is=rs.getBinaryStream("document");
    java.io.OutputStream os=new FileOutputStream(fileName);
    byte[] buffer = new byte[512];
    int bytesRead = 0;
    while ((bytesRead=is.read(buffer))!=-1) {
    os.write(buffer, 0, bytesRead);
    }
    }
    for (int i=0;i<al.size();i++){
    fileName=al.get(i);
    snInTable=fileName.lastIndexOf("|");
    saveDate=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(fileName.substring(snInTable+1));
    dir=new File(fileName.substring(0, snInTable));
    ok=dir.setLastModified(saveDate.getTime());
    System.out.println(dir+", isFile()="+dir.isFile()+", 原始时间:"+saveDate+", getTime="+saveDate.getTime()+", 设置时间:"+ok);
    }
    ok=true;
    }catch(Exception e){
    e.printStackTrace();
    System.out.println(fileName+"出错!");
    }
    return ok;
    }public static void main(String ar []){

    System.out.println(fromDoc2File("expense"));
    File file=new File("WebRoot/WEB-INF/AttFile/expense/expense771.rar");
    if (file.isFile()){
    System.out.println(file.setLastModified((new java.util.Date()).getTime()-(long)(60*60*24*1000*13)));
    }else
    System.out.println("不是一个文件。");
    }就是把文件从数据库取出之后,不立刻设置时间,而是把所有文件都保存到硬盘上,并且把文件和和时间保存入arrayList里面,然后再用循环来设置文件的最后修改时间。
    结果大为改观,因为有56个文件从数据库取出放到硬盘上,有51个文件可以把时间设置为保存入数据库的时间,但仍然有5个为false。
    这里就产生两个问题:
    1、是不是在硬盘上生成的文件不能立刻设置时间?
    2、为何仍然有若干个文件设置失败?
    我在提问的帖子中问到的,用什么函数可以同时取出日期和时间,我自己也根据1楼的建议进行测试,原来用Timestamp就可以了。
      

  7.   

    目前测试成功的、可以全部设置lastModified为true的办法。
    经过我用了若干十种方法测试之后,终于可以在循环执行setLastModified()的时候,全部为true了。
    经过多次测试,我发现setLastModified这个方法,在生成硬盘文件之后,立刻执行的话,会不知何时、不知何因地出现false的情况。
    现在我采取的办法是:先用一个方法(fromDoc2File)在硬盘上生成所有需要生成的文件,然后用另一个方法(setLastModifiedTime)再把刚才生成的所有文件的最后修改时间设置为保存入数据库的时间。
    我把这两个方法放在main方法里面执行的时候还发现,必须单独先执行fromDoc2File,然后把fromDoc2File去掉或者屏蔽掉,然后再执行setLastModifiedTime方法,才能保证全部文件在执行setLastModified()时为true,否则,还是会有些文件在执行setLastModified()时为fasle。
      

  8.   

    不是这个原因,主要原因是你的os没有close.