业务背景:由于文书数据直接保存在数据库中,随着业务量的增加,文书数量也随之剧增,导致系统访问速度变慢。所以决定数据库中只保存文书地址信息(我采用保存ID的形式),文书数据保存到本地磁盘中。
- 一、把文件以字节流的方式保存到本地目录文件夹下(为了增加印象,没有copy,手打的代码,异常处理什么的就没写了:-D)
private void save(DefaultMultipartHttpServletRequest mreq){
//从前台获取文书文件体的方法,是为了获得文件体字节流,
//其他方式的文件形式只要获得到字节流即可。
MultipartFile f = mreq.getFile("FileBlody");
//保存到库中的id,通过这个id再到文件夹中取对应流文件。
String docId = UUID.generateUUID();
//定义的.txt文件形式。
String docName = documentID+".txt";
//定义保存的文件夹地址(也可以定义到部署文件下)。
String dir = "D:\\docFile\\";
//获取文件夹信息。
File file = new File(dir);
//判断文件夹是否存在。
if(!file.exists()){
//如果文件夹不存在就创建文件夹。
file.mkdirs();
}
//创建文件输出流。
FileOutputStream os = new FileOutputStream(dir+docName);
//获得文件体字节流。
byte[] fileByte = f.getBytes();
//获得文件体字节流长度。
int fileLen = f.getBytes().length;
//写入文件。
os.write(fileByte,0,filelen);
//记得关门。
os.close();
}
- 二、读取文件获取字节流信息
private void getFile(){
//反正最后拼凑成这样子的地址。(后来我觉得用classPath作为保存路径的话,
//移植性会更好,保不齐来一台没有D盘的服务器。
//再后来又感觉可以把地址写到配置文件中更易维护,
//所以感觉差不多。不过还是想请教一下大家有没有好的建议:-D)。
File docFile =new File("D:/docFile/38324w2k32j4322432324234233k43.txt");
//为了防止读到脏文件。
if(docFile.isFile()){
//定义文件输入流。
FileInputStream fis = null;
//定义文件输入流。
BufferedInputStream bis = null;
//定义了一个内部缓冲区数组。捕获内存缓冲区的数据,转换成字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//定义一个字节型数组作为容器(我最后要的是一个字节型数组)
byte[] content = null;
try{
//创建文件输入流对象
fis = new FileInputStream(docFile);
//创建内部缓存区数组
bis = new BufferedInputStream(fis);
//定义一个长度载体
int len = 0;
//创建一个有长度的数据载体
byte[] buffer = new byte[1024];
//如有数据就写进去
while((len = bis.read(buffer))!=-1){
baos.write(buffer,0,len);
}
//获得文件中的字节流信息(如要其他类型数据再做转换)
content = baos.toByteArray();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
baos.close(); //关门
bis.close(); //关窗
fis.close(); //关裤门
}catch (IOException e){
e.printStackTrace();
}
}
}