package com.dahan.wd.tools;
/**********************************
*本类为文件工具类
*
*
*
* wd
* 2005-9-7
**********************************/
import java.io.*;
import java.lang.*;
public class FileTools {
//类方法 解析一个文件名的后缀 不包含"."
//retuen 后缀名 返回""表示没有后缀
public static String ExtractFileExt(String AFileName)
{
int i;
String s;
try
{
i=AFileName.lastIndexOf(".");
}
catch (NullPointerException e)
{
i=-1;
}
if (i==-1)
{
return "";
}
else
{
s=AFileName.substring(i+1);
if (s==null) s="";
return s;
}
}
//类方法 解析一个文件名的路径部分
//return 路径包含\ 返回""表示没有路径
//注意只能在win32下正确作用
public static String ExtractFilePath(String AFileName)
{
File f=new File(AFileName);
String s;
s=f.getParentFile().getPath();
if (s==null) s="";
return s;
}
//解析得到一个文件名
public static String ExtractFileName(String AFileName)
{
int k;
k=AFileName.lastIndexOf(File.separator);
if(k==-1)
{
//不含路径 直接返回
return AFileName;
}
else
{
return AFileName.substring(k+1);
}
}
//类方法 分卷分割一个文件 保存在指定目录
//AFileName 源文件完整路径+文件名
//VolumeSize 分卷大小
//ASavePath 保存路径
//bDelSrcFile 是否删除源文件
public static void SplitFile(String AFileName,int VolumeSize,String ASavePath,boolean bDelSrcFile) throws Exception
{
File fsrc;//源文件
File fout;//目的文件
FileInputStream reader;
FileOutputStream writer;
byte[] buf;
int i,n;
String s;
if (VolumeSize<=0) VolumeSize=1048576;
//MyLog.LogDebugInfo("FileTools","splitFile","VolumeSize="+String.valueOf(VolumeSize));
fsrc=new File(AFileName);
if (fsrc.exists()==false) return;
reader=new FileInputStream(fsrc);
//读取VolumeSize个到buf之中
n=1;//读出长度
i=0;//i为文件名后缀指示变量
try
{
while (n>-1)
{
buf=null;
buf=new byte[VolumeSize];
n=reader.read(buf);
if (n>0)
{
//放入out文件流中
//定义文件名称
//MyLog.LogDebugInfo("FileTools","splitFile","n="+String.valueOf(n));
s=fsrc.getName()+".s"+String.valueOf(i);
fout=new File(ASavePath,s);
writer=new FileOutputStream(fout);
try
{
writer.write(buf,0,n);
}
finally
{
writer.close();
writer=null;
fout=null;
}
i++;
}
}
}
finally
{
reader.close();
reader=null;
}
if (bDelSrcFile)
{
fsrc.delete();
}
}
//类方法 组合分卷文件形成单一文件
//根据AFileList顺序合并文件
//文件名pkgname必须一致
//APath为AfileList内部文件所在的目录 当该值为null or ""时候 AFileList必须包含完整路径信息
//返回组合完毕的二进制流
public static byte[] CombinFile(String APath, String[] AFileList) throws Exception
{
int i,j,len;
String s,s0,path;//s 文件名 s0不包含拓展名的文件名称
File fin;
FileInputStream finstm;
ByteArrayOutputStream foutstm;
byte[] buf;
len=AFileList.length;
if (len==0) return null;
//得到不包含文件拓展名的文件名称 和路径 以供组合
fin=new File(AFileList[0]);
s0=fin.getName();
if (APath!=null && APath.equals("")==false)
{
path=APath;
}
else
{
path=fin.getParent();
}
i=s0.lastIndexOf(".");
if (i!=-1) //i=-1 说明没有拓展名
{
s=s0.substring(0,i);
s0=s;
}
foutstm=new ByteArrayOutputStream();
try
{
for (i=0;i {
//得到一块文件的名字
//s=s0+".s"+String.valueOf(i);
s=AFileList[i];
fin=new File(path,s);
//MyLog.LogDebugInfo("FileTools","CombinFile","path="+path);
//MyLog.LogDebugInfo("FileTools","CombinFile","filename="+s);
if (fin.exists()==false)
{
throw new Exception("文件"+s+"不存在!!!!");
}
finstm=new FileInputStream(fin);
buf=new byte[(int)fin.length()];
try
{
finstm.read(buf);
foutstm.write(buf);
buf=null;
}
finally
{
finstm.close();
finstm=null;
}
}
//返回二进制流
return foutstm.toByteArray();
}
finally
{
foutstm.close();//释放资源是美德
foutstm=null;
}
}
////类方法 组合分卷文件形成单一文件
//根据AFileList顺序合并文件
//文件名pkgname必须一致
//APath为AfileList内部文件所在的目录 当该值为null or ""时候 AFileList必须包含完整路径信息
//OutFileName假如为null 或者为 "" 使用AFileList抽取的文件名称
public static void CombinFile(String APath, String[] AFileList,String OutFileName) throws Exception
{
File fin,fout;
FileOutputStream foutstm;
int len,i;
byte[] buf;
String s0,s;
len=AFileList.length;
if (len==0) return ;
//得到不包含文件拓展名的文件名称 和路径 以供组合
fin=new File(AFileList[0]);
s0=fin.getName();
i=s0.lastIndexOf(".");
if (i!=-1) //i=-1 说明没有拓展名
{
s=s0.substring(0,i);
s0=s;
}
//s0之中包含有不含拓展名的文件名称
if (OutFileName==null || OutFileName.equals(""))
{
OutFileName=s0;
}
buf=FileTools.CombinFile(APath,AFileList);
fout=new File(OutFileName);
foutstm=new FileOutputStream(fout);
try
{
foutstm.write(buf);
}
finally
{
foutstm.close();
foutstm=null;
}
}
//读取文件获得二进制信息
public static byte[] ReadFile(String AFileName) throws Exception
{
File f;
f=new File(AFileName);
if (f.exists()==false) return null;
return FileTools.ReadFile(f);
}
public static byte[] ReadFile(String APath,String AFileName) throws Exception
{
File f;
f=new File(APath,AFileName) ;
if (f.exists()==false) return null;
return FileTools.ReadFile(f);
}
public static byte[] ReadFile(File AFile) throws Exception
{
byte[] buf;
FileInputStream finstm;
finstm=new FileInputStream(AFile);
buf=new byte[(int)AFile.length()];
try
{
finstm.read(buf);
return buf;
}
finally
{
finstm.close();
finstm=null;
}
}
//写2进制流入文件
public static void WriteFile(String AFileName,byte[] buf) throws Exception
{
File f;
f=new File(AFileName);
FileTools.WriteFile(f,buf);
}
//写2进制流入文件
public static void WriteFile(File AFile,byte[] buf) throws Exception
{
FileOutputStream foutstm;
foutstm=new FileOutputStream(AFile);
try
{
foutstm.write(buf);
}
finally
{
foutstm.flush();
foutstm.close();
foutstm=null;
}
}
//删除文件
public static boolean DeleteFile(String FileName )
{
File f;
f=new File(FileName);
return f.delete();
}
//单元测试用main
public static void main(String[] args)
{
int i;
String s="g:\\mdos71bd.zip";
File f;
System.out.println(FileTools.ExtractFileName("E:\\javacode\\JCMS 网络发布项目"));
System.out.println(FileTools.ExtractFileExt(s));
System.out.println(FileTools.ExtractFilePath(s));
//splitfile
try
{
//System.out.println("开始分割到E:\\javacode\\JCMS 网络发布项目");
//FileTools.SplitFile(s,4096,"E:\\javacode\\JCMS 网络发布项目);
//System.out.println("分割完成");
//System.out.println("开始合并");
//f=new File("E:\\javacode\\JCMS 网络发布项目");
//FileTools.CombinFile("E:\\javacode\\JCMS 网络发布项目 网络发布项目");
//System.out.println("合并完成");
//System.out.println("测试完成 累死鸟。。。");
}
catch(Exception e)
{
e.printStackTrace();
}
}
//添加str到文件末尾
public static void AppendFile(String APathName,String AFileName,String str) throws Exception
{
File f;
FileOutputStream fs;
f=new File(APathName,AFileName);
fs=new FileOutputStream(f,true);
try
{
fs.write(str.getBytes());
}
finally
{
fs.close();
fs=null;
}
}
}
阅读(835) | 评论(0) | 转发(0) |