精华内容
下载资源
问答
  • 具体过程如下:1、一个zip文件的压缩和解压工具类压缩和解压工具类来自https://www.iteye.com/blog/songfeng-123-2243016,但是原文代码因为用的是java自带的java.util.zip,有中文乱码的bug,所以...

    有个需求,从某个接口下载的一个zip压缩包,往里面添加一个说明文件。搜索了一下,没有找到往zip直接添加文件的方法,最终解决方法是先解压、再压缩。

    具体过程如下:

    1、一个zip文件的压缩和解压工具类

    压缩和解压工具类来自https://www.iteye.com/blog/songfeng-123-2243016,但是原文代码因为用的是java自带的java.util.zip,有中文乱码的bug,所以需要修改部分代码,并且修改为引用org.apache.tools.zip.*,pom.xml加入依赖包,如下:

    org.apache.ant

    ant

    1.10.7

    工具类代码:

    package com.example.demo;

    import java.io.*;

    import java.util.arraylist;

    import java.util.enumeration;

    import java.util.list;

    import java.util.zip.zipexception;

    import org.apache.tools.zip.*;

    public class ziputil {

    private static int buffersize = 1024;

    /**

    * 压缩

    *

    * @param paths

    * @param filename

    */

    public static void zip(list paths, string filename) {

    zipoutputstream zos = null;

    try {

    zos = new zipoutputstream(new fileoutputstream(filename));

    for (string filepath : paths) {

    // 递归压缩文件

    file file = new file(filepath);

    string relativepath = file.getname();

    if (file.isdirectory()) {

    relativepath += file.separator;

    }

    zipfile(file, relativepath, zos);

    }

    } catch (ioexception e) {

    e.printstacktrace();

    } finally {

    try {

    if (zos != null) {

    zos.close();

    }

    } catch (ioexception e) {

    e.printstacktrace();

    }

    }

    }

    public static void zipfile(file file, string relativepath, zipoutputstream zos) {

    inputstream is = null;

    try {

    if (!file.isdirectory()) {

    zipentry zp = new zipentry(relativepath);

    zos.putnextentry(zp);

    is = new fileinputstream(file);

    byte[] buffer = new byte[buffersize];

    int length = 0;

    while ((length = is.read(buffer)) >= 0) {

    zos.write(buffer, 0, length);

    }

    zos.setencoding("gbk");//解决文件名中文乱码

    zos.flush();

    zos.closeentry();

    } else {

    string temppath = null;

    for (file f : file.listfiles()) {

    temppath = relativepath + f.getname();

    if (f.isdirectory()) {

    temppath += file.separator;

    }

    zipfile(f, temppath, zos);

    }

    }

    } catch (ioexception e) {

    e.printstacktrace();

    } finally {

    try {

    if (is != null) {

    is.close();

    }

    } catch (ioexception e) {

    e.printstacktrace();

    }

    }

    }

    /**

    * 解压缩

    *

    * @param filename

    * @param path

    */

    public static list unzip(string filename, string path) {

    fileoutputstream fos = null;

    inputstream is = null;

    list filepaths = new arraylist();

    try {

    zipfile zf = new zipfile(new file(filename));

    enumeration en = zf.getentries();

    while (en.hasmoreelements()) {

    zipentry zn = (zipentry) en.nextelement();

    if (!zn.isdirectory()) {

    is = zf.getinputstream(zn);

    file f = new file(path + zn.getname());

    file file = f.getparentfile();

    file.mkdirs();

    fos = new fileoutputstream(path + zn.getname());

    int len = 0;

    byte bufer[] = new byte[buffersize];

    while (-1 != (len = is.read(bufer))) {

    fos.write(bufer, 0, len);

    }

    fos.close();

    filepaths.add(path + zn.getname());

    }

    }

    } catch (zipexception e) {

    e.printstacktrace();

    } catch (ioexception e) {

    e.printstacktrace();

    } finally {

    try {

    if (null != is) {

    is.close();

    }

    if (null != fos) {

    fos.close();

    }

    } catch (ioexception e) {

    e.printstacktrace();

    }

    }

    return filepaths;

    }

    }

    2、测试

    有如下目录结构:

    d:\测试\文档.zip

    d:\测试\说明.pdf

    把“说明.pdf”添加到“文档.zip”里面,生成一个新压缩包“文档(新).zip”。

    package com.example.demo;

    import java.io.file;

    import java.util.list;

    public class ziputiltest {

    public static void main(string[] args) {

    //解压

    list files = ziputil.unzip("d:/测试/文档.zip", "d:/测试/");

    //集合添加文件

    files.add("d:/测试/说明.pdf");

    //压缩

    ziputil.zip(files,"d:/测试/文档(新).zip");

    //保留说明.pdf

    files.remove(files.size()-1);

    //删除上面解压出来的文件

    for(string f : files){

    file file = new file(f);

    if(file.exists()){

    file.delete();

    }

    }

    }

    }

    如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

    展开全文
  • 一下代码是从前台到后台重点代码,希望可以帮到有需要的人,如果有问题,希望可以指出来 HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx 一...

    现在很多系统都有导出excel的功能,总结一下自己之前写的,希望能帮到其他人,这里我用的是XSSFWorkbook,我们项目在winsang 用的Tomcat,LInux上用的weblogic服务器,刚开始win开发完各种导出都没有问题,但到了linux上就不行了,后面才只知道weblogic会给response写入一些内容,需要response.reset();或者response.resetBuffer();一下代码是从前台到后台重点代码,希望可以帮到有需要的人,如果有问题,希望可以指出来

    HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls

    XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx

    一、前端部分:

    1、html:

    导出

    2、javaScript:

    $("#export").click(function (e) {

    var startDt = $("#startDd").val();//统计开始时间

    var endDt = $("#endDt").val();//统计结束时间

    //模拟form提交,如果有参数 可以参照这种方式提交

    var export_form = $("

    " +

    "" +

    "

    ");

    export_form.attr("action", "localhost:8080/export/exportExcel");//给form表单添加action

    $(document.body).append(export_form);//追加form表单

    export_form.submit();//提交form

    })

    二、后台代码

    1、xxxDaoMapper.xml代码

    SELECT * FROM DUAL

    SELECT * FROM DUAL

    2、xxxDao.java、xxxService.java、xxxserviceImpl.java部分代码根据业务场景而定,这里就不写了

    3、Controller代码:

    @Controller

    @RequestMapping(value = "export")

    public class ExportExcelController {

    /**

    * @Description 导出表格

    * @Date 2019\8\20

    * @return void

    */

    @RequestMapping(value = "exportExcel")

    public void exportExcel(HttpServletRequest request, HttpServletResponse response, SelectModel selectModel){

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");

    //获取第一个表格数据

    List> dataList1 = excelService.selectDataList1(selectModel);

    //获取第二个表格数据

    List> dataList2 = excelService.selectDataList1(selectModel);

    String sheetName1 = "普通表格";

    String sheetName2 = "复杂表格";

    //第一个表格列名

    String[] heads1 = new String[]{"序号", "部门", "姓名", "电话", "年龄"};

    //第二个表格 第一行列名

    String[] heads2a = new String[]{"序号", "部门", "姓名", "电话", "事件"};

    //第二个表格 第二行列名

    String[] heads2b = new String[]{"事件数", "未完成", "已完成", "完成率"};

    //第一个表格 列宽数组

    Integer[] colWidths1 = new Integer[]{3000, 4000, 4000, 4500, 3000};

    //第二个表格列宽数组

    Integer[] colWidths2 = new Integer[]{3000, 4000, 4000, 4500, 3000, 3000, 3000, 3000};

    //第二个表格 需要合并的单元格数组 {"开始行下标, 结束行下标, 开始列下标, 结束列下标",……}

    String[] headNums = new String[]{"2,3,0,0", "2,3,1,", "2,3,2,2", "2,3,3,3", "2,2,4,7"};

    String fileName = "导出文件测试";

    //统计日期范围

    String date = sdf.format(sdf.format(selectModel.getStartDd()) + "-" + sdf.format(selectModel.getEndDd()));

    try {

    HaiExcelUtils.exportExcelXlsx(request, response, dataList1, dataList2, sheetName1, sheetName2, heads1, heads2a, heads2b, colWidths1, colWidths2, headNums, fileName, date);

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

    4、ExcelUtils类:

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import java.math.BigDecimal;

    import java.text.DecimalFormat;

    import java.text.SimpleDateFormat;

    import java.util.Map;

    import java.util.Map.Entry;

    import java.io.ByteArrayInputStream;

    import java.io.ByteArrayOutputStream;

    import java.io.OutputStream;

    import java.util.List;

    import java.util.regex.Pattern;

    import org.apache.poi.ss.util.CellRangeAddress;

    import org.apache.poi.util.IOUtils;

    import org.apache.poi.xssf.usermodel.*;

    /**

    * @Description 导出excle工具类

    * @Author Bert

    * @Date 2019\8\20

    */

    public class HaiExcelUtils {

    /**

    * @Description 导出多个表格,sheet1 为普通表格,sheet2为复杂表格

    * @Date 2019\8\20

    * @param request

    * @param response

    * @param dataList1 sheet1 数据集合

    * @param dataList2 sheet2 数据集合

    * @param sheetName1 sheet1 名称

    * @param sheetName2 sheet2 名称

    * @param colWidths1 sheet1 列宽数组

    * @param colWidths2 sheet2 列宽数组

    * @param heads1 sheet1 表格列名数组

    * @param heads2a sheet2 表格第一行列明数组

    * @param heads2b sheet2 表格第二行列明数组

    * @param headNums sheet2 表格列需要合并的单元格数组

    * @param fileName sheet1 导出文件名称

    * @param date 时间 格式为: xx年xx月xx日-xx年xx月xx日

    * @return void

    */

    public static void exportExcelXlsx(HttpServletRequest request, HttpServletResponse response,

    List> dataList1, List> dataList2,

    String sheetName1, String sheetName2,

    String[] heads1, String[] heads2a,String[] heads2b,

    Integer[] colWidths1, Integer[] colWidths2,

    String[] headNums, String fileName,String date) throws Exception {

    ByteArrayInputStream bais = null;

    OutputStream os = null;

    try {

    XSSFWorkbook workbook = new XSSFWorkbook();

    XSSFSheet sheet1 = workbook.createSheet(sheetName1);// 创建一个 普通表格

    XSSFSheet sheet2 = workbook.createSheet(sheetName2);// 创建一个 多行表头的表格

    // 表头 标题样式

    XSSFFont titleFont = workbook.createFont();

    titleFont.setFontName("微软雅黑");//字体

    titleFont.setFontHeightInPoints((short) 15);// 字体大小

    XSSFCellStyle titleStyle = workbook.createCellStyle();

    titleStyle.setFont(titleFont);

    titleStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 左右居中

    titleStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中

    titleStyle.setLocked(true);

    // 表头 时间样式

    XSSFFont dateFont = workbook.createFont();

    dateFont.setFontName("宋体");//字体

    dateFont.setFontHeightInPoints((short) 11);// 字体大小

    XSSFCellStyle dateStyle = workbook.createCellStyle();

    dateStyle.setFont(dateFont);

    dateStyle.setAlignment(XSSFCellStyle.ALIGN_LEFT);// 左右 居左

    dateStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中

    dateStyle.setLocked(true);

    // 列名样式

    XSSFFont headFont = workbook.createFont();

    headFont.setFontName("宋体");//字体

    headFont.setFontHeightInPoints((short) 11);// 字体大小

    XSSFCellStyle headSsyle = workbook.createCellStyle();

    headSsyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框

    headSsyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框

    headSsyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框

    headSsyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框

    headSsyle.setFont(headFont);

    headSsyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 左右居中

    headSsyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中

    headSsyle.setLocked(true);

    //普通单元格样式

    XSSFFont nalFont = workbook.createFont();

    nalFont.setFontName("宋体");

    nalFont.setFontHeightInPoints((short) 11);

    XSSFCellStyle nalStyle = workbook.createCellStyle();

    nalStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框

    nalStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框

    nalStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框

    nalStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框

    nalStyle.setFont(nalFont);

    nalStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 左右居中

    nalStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中

    nalStyle.setWrapText(true); // 设置自动换行

    nalStyle.setLocked(true);

    // sheet1 设置列宽 (第几列,宽度)

    for (int i = 0; i < colWidths1.length; i++) {

    sheet1.setColumnWidth(i, colWidths1[i]);// 下标 , 宽度

    }

    sheet1.setDefaultRowHeight((short) 12);//设置行高

    // sheet2 设置列宽 (第几列,宽度)

    for (int i = 0; i < colWidths2.length; i++) {

    sheet2.setColumnWidth(i, colWidths2[i]);// 下标 , 宽度

    }

    sheet2.setDefaultRowHeight((short) 12);//设置行高

    // sheet1 第一行 为 表头标题 (开始行下标, 结束行下标, 开始列下标, 结束列下标(下标从零开始计算,so 表格列长度 -1))

    sheet1.addMergedRegion(new CellRangeAddress(0, 0, 0, heads1.length - 1));

    XSSFRow row1 = sheet1.createRow(0);//创建一行表格

    row1.setHeight((short) 0x349);//设置高度

    XSSFCell cell1 = row1.createCell(0);//创建单元格

    cell1.setCellStyle(titleStyle);//设置样式

    saveCellValue(cell1, sheetName1);//设置标题

    // sheet2 第一行 为 表头标题 (开始行下标, 结束行下标, 开始列下标, 结束列下标(下标从零开始计算,so 表格列长度 -1 - 重叠长度))

    sheet2.addMergedRegion(new CellRangeAddress(0, 0, 0, (heads2a.length + heads2b.length) - 3));

    XSSFRow row2 = sheet1.createRow(0);//创建一行表格

    row2.setHeight((short) 0x349);//设置高度

    XSSFCell cell2 = row1.createCell(0);//创建单元格

    cell2.setCellStyle(titleStyle);//设置样式

    saveCellValue(cell2, sheetName2);//设置标题

    // sheet1 第二行 统计时间 (开始行下标, 结束行下标, 开始列下标, 结束列下标(下标从零开始计算,so 表格列长度 -1))

    sheet1.addMergedRegion(new CellRangeAddress(1, 1, 0, heads1.length - 1));

    row1 = sheet1.createRow(1);//创建第二行

    row1.setHeight((short) 12);//设置高度

    cell1 = row1.createCell(0);//创建单元格

    cell1.setCellStyle(dateStyle);//设置样式

    saveCellValue(cell1, "统计日期:" + date);//设置时间

    // sheet2 第二行 统计时间 (开始行下标, 结束行下标, 开始列下标, 结束列下标(下标从零开始计算,so 表格列长度 -1 - 重叠长度))

    sheet2.addMergedRegion(new CellRangeAddress(1, 1, 0, (heads2a.length + heads2b.length) - 3));

    row2 = sheet2.createRow(1);//创建第二行

    row2.setHeight((short) 12);//设置高度

    cell2 = row1.createCell(0);//创建单元格

    cell2.setCellStyle(dateStyle);//设置样式

    saveCellValue(cell2, "统计日期:" + date);//设置时间

    // sheet1 第三行 表头列名

    row1 = sheet1.createRow(2);//创建第三行

    for (int i = 0; i < heads1.length; i++) {

    cell1 = row1.createCell(i);

    saveCellValue(cell1, heads1[i]);

    cell1.setCellStyle(headSsyle);

    }

    // sheet2 第三行 表头列名

    row2 = sheet2.createRow(2);//创建第三行

    for (int i = 0; i < heads2a.length; i++) {

    cell2 = row2.createCell(i);

    saveCellValue(cell2, heads2a[i]);

    cell2.setCellStyle(headSsyle);

    }

    //sheet2 复杂表头 动态合并单元格

    for (int i = 0; i < headNums.length; i++) {

    String[] temp = headNums[i].split(",");

    Integer firstRow = Integer.parseInt(temp[0]);//开始行

    Integer lastRow = Integer.parseInt(temp[1]);// 结束行

    Integer firstCol = Integer.parseInt(temp[2]);//开始列

    Integer lastCol = Integer.parseInt(temp[3]);//结束列

    sheet2.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));

    }

    //设置合并单元格的参数并初始化带边框的表头(这样做可以避免因为合并单元格后有的单元格的边框显示不出来)

    row2 = sheet2.createRow(3); //因为下标从0开始,所以这里表示的是excel中的第四行

    for (int i = 0; i < heads2a.length; i++) {

    cell2 = row2.createCell(i);

    cell2.setCellStyle(headSsyle); //设置excel中第四行的边框

    if (i > 3 && i < 3) {

    for (int k = 0; k < heads2b.length; k++) {

    cell2 = row2.createCell(k + 4);//k + 4 是因为 0-3 前面四个取自heads2a的数组中

    saveCellValue(cell2, heads2b[k]); //给excel中第四行的4 …… 7 列赋值

    cell2.setCellStyle(headSsyle); //设置excel中第四行的4 …… 7 列的边框

    }

    }

    }

    // sheeet1 普通表格写入数据 从第三行开始

    int rownum1 = 3;

    if (dataList1 != null && dataList1.size() > 0) {

    // 遍历数据生成成功数据Execl

    for (Map map : dataList1) {

    row1 = sheet1.createRow(rownum1);

    int cellnum1 = 0;

    for (Entry entry : map.entrySet()) {

    cell1 = row1.createCell(cellnum1);

    saveCellValue(cell1, String.valueOf(entry.getValue()));

    cellnum1++;

    }

    rownum1++;

    }

    }

    // sheeet2 多行表头表格 写入数据 从第四行开始

    int rownum2 = 4;

    if (dataList2 != null && dataList2.size() > 0) {

    // 遍历数据生成成功数据Execl

    for (Map map : dataList2) {

    row2 = sheet2.createRow(rownum2);

    int cellnum2 = 0;

    for (Entry entry : map.entrySet()) {

    cell2 = row2.createCell(cellnum2);

    saveCellValue(cell2, String.valueOf(entry.getValue()));

    cellnum2++;

    }

    rownum2++;

    }

    }

    // rownum1 = 4;

    // if (countList != null && countList.size() > 0) {

    // // 遍历数据生成成功数据Execl

    // for (Map map : countList) {

    // row1 = sheet1.createRow(rownum1);

    // int cellnum1 = 0;

    // for (Entry entry : map.entrySet()) {

    // cell1 = row1.createCell(cellnum1);

    // saveCellValue(cell1, String.valueOf(entry.getValue()));

    // cellnum1++;

    // }

    // rownum1++;

    // }

    // }

    //如果项目部署在weblogic 上面,需要增加以下 response.reset(); 因为weblogic会向response写东西,不重置文件会报错

    response.reset();//tomcat 部署项目可以不用加这行代码

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    workbook.write(baos);

    response.setContentType("application/x-download;charset=utf-8");

    String excelName = new String(( fileName + "(" + date + ")").getBytes("GB2312"), "ISO8859-1") + ".xlsx";//防止中文文件名乱码

    response.addHeader("Content-Disposition", "attachment;filename=" + excelName);

    os = response.getOutputStream();

    bais = new ByteArrayInputStream(baos.toByteArray());

    byte[] b = new byte[1024];

    while ((bais.read(b)) > 0) {

    os.write(b);

    }

    bais.close();

    os.flush();

    os.close();

    } catch (Exception e) {

    e.printStackTrace();

    } finally {

    if (null != bais) {

    IOUtils.closeQuietly(bais);

    }

    if (null != os) {

    IOUtils.closeQuietly(os);

    }

    }

    }

    /**

    * @param xssfCell

    * @return void

    * @Description 将单元格内容转为字符串

    * @Date 2019\8\20

    */

    public static String cellToString(XSSFCell xssfCell) {

    if (null == xssfCell) {

    return "";

    }

    switch (xssfCell.getCellType()) {

    case XSSFCell.CELL_TYPE_NUMERIC: // 数字

    return String.valueOf(xssfCell.getNumericCellValue()).trim();

    case XSSFCell.CELL_TYPE_STRING: // 字符串

    return String.valueOf(xssfCell.getStringCellValue()).trim();

    case XSSFCell.CELL_TYPE_BOOLEAN: // Boolean

    return String.valueOf(xssfCell.getBooleanCellValue()).trim();

    case XSSFCell.CELL_TYPE_FORMULA: // 公式

    return String.valueOf(xssfCell.getCellFormula()).trim();

    case XSSFCell.CELL_TYPE_BLANK: // 空值

    return "";

    case XSSFCell.CELL_TYPE_ERROR: // 故障

    return "";

    default:

    return "";

    }

    }

    private static void saveCellValue(XSSFCell xssfCell, Object object) {

    if (object == null) {

    xssfCell.setCellValue("");

    } else {

    saveCellValue(xssfCell, object, null);

    }

    }

    /**

    * @param xssfCell 1

    * @return java.lang.String

    * @Description 避免cell.setCellValue(checkOrderQmSave.getSellOrderNo ())中参数为空就会报错

    * @Date 2019\8\20 0020

    */

    private static void saveCellValue(XSSFCell xssfCell, Object object, String format) {

    if (null == xssfCell) {

    xssfCell.setCellValue("");

    } else {

    if (object instanceof String) {

    xssfCell.setCellValue(String.valueOf(object));

    } else if (object instanceof Long) {

    xssfCell.setCellValue(formatNumber((Long) object, "#0"));

    } else if (object instanceof Double) {

    xssfCell.setCellValue(formatNumber((Double) object, "#0.00"));

    } else if (object instanceof Float) {

    xssfCell.setCellValue(formatNumber((Float) object, "#0.00"));

    } else if (object instanceof Integer) {

    xssfCell.setCellValue(formatNumber((Integer) object, "#0"));

    } else if (object instanceof BigDecimal) {

    xssfCell.setCellValue(formatNumber((BigDecimal) object, "#0.00"));

    } else if (object instanceof java.sql.Date) {

    xssfCell.setCellValue(new SimpleDateFormat(format).format(object));

    } else if (object instanceof java.util.Date) {

    xssfCell.setCellValue(new SimpleDateFormat(format).format(object));

    } else {

    xssfCell.setCellValue("");

    }

    }

    }

    /**

    * @Description number格式化

    * @Date 2019\8\20

    * @param number 数字

    * @param forMat 格式,可带#,也可不带#

    * #0 或者 0

    * #0.0 或者 0.0

    * #0.00 或者 0.00

    * @return java.lang.String

    */

    private static String formatNumber(Number number, String forMat) {

    if (null == number)

    //当传入的number 为Null 返回不带 #号的格式

    return forMat.replace("#", "").replace(".+", ".");

    else

    //number格式化 替换多个#为 一个# ,替换 多个. 为一个.

    return new DecimalFormat(("#" + forMat).replace("#+", "#").replace(".+", ".")).format(number.doubleValue());

    }

    //判断EXCEL表格高度用 row.setHeight((short) CellUtil.getExcelCellAutoHeight(TAR_VAL_ALL_STRING, 280, 30));

    public static float getExcelCellAutoHeight(String str, float defaultRowHeight, int fontCountInline) {

    int defaultCount = 0;

    for (int i = 0; i < str.length(); i++) {

    int ff = getregex(str.substring(i, i + 1));

    defaultCount = defaultCount + ff;

    }

    if (defaultCount > fontCountInline) {

    return ((int) (defaultCount / fontCountInline) + 1) * defaultRowHeight;//计算

    } else {

    return defaultRowHeight;

    }

    }

    public static int getregex(String charStr) {

    if ("".equals(charStr) || charStr == null) {

    return 1;

    }

    // 判断是否为字母或字符

    if (Pattern.compile("^[A-Za-z0-9]+$").matcher(charStr).matches()) {

    return 1;

    }

    // 判断是否为全角

    if (Pattern.compile("[\u4e00-\u9fa5]+$").matcher(charStr).matches()) {

    return 2;

    }

    //全角符号 及中文

    if (Pattern.compile("[^x00-xff]").matcher(charStr).matches()) {

    return 2;

    }

    return 1;

    }

    }

    展开全文
  • public static void addFilesToExistingZip(File zipFile,File[] files) throws IOException {// get a temp fileFile tempFile = File.createTempFile(zipFile.getName(), null);// delete it, otherwise you canno...

    public static void addFilesToExistingZip(File zipFile,

    File[] files) throws IOException {

    // get a temp file

    File tempFile = File.createTempFile(zipFile.getName(), null);

    // delete it, otherwise you cannot rename your existing zip to it.

    tempFile.delete();

    boolean renameOk=zipFile.renameTo(tempFile);

    if (!renameOk)

    {

    throw new RuntimeException("could not rename the file "+zipFile.getAbsolutePath()+" to "+tempFile.getAbsolutePath());

    }

    byte[] buf = new byte[1024];

    ZipInputStream zin = new ZipInputStream(new FileInputStream(tempFile));

    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile));

    ZipEntry entry = zin.getNextEntry();

    while (entry != null) {

    String name = entry.getName();

    boolean notInFiles = true;

    for (File f : files) {

    if (f.getName().equals(name)) {

    notInFiles = false;

    break;

    }

    }

    if (notInFiles) {

    // Add ZIP entry to output stream.

    out.putNextEntry(new ZipEntry(name));

    // Transfer bytes from the ZIP file to the output file

    int len;

    while ((len = zin.read(buf)) > 0) {

    out.write(buf, 0, len);

    }

    }

    entry = zin.getNextEntry();

    }

    // Close the streams

    zin.close();

    // Compress the files

    for (int i = 0; i < files.length; i++) {

    InputStream in = new FileInputStream(files[i]);

    // Add ZIP entry to output stream.

    out.putNextEntry(new ZipEntry(files[i].getName()));

    // Transfer bytes from the file to the ZIP file

    int len;

    while ((len = in.read(buf)) > 0) {

    out.write(buf, 0, len);

    }

    // Complete the entry

    out.closeEntry();

    in.close();

    }

    // Complete the ZIP file

    out.close();

    tempFile.delete();

    }

    展开全文
  • JAVA 操作写入文件,未完成时使用.tmp,写完后更改为.log(即.tmp到正式文件);

    JAVA 操作写入文件,未完成时使用.tmp,写完后更改为.log(即.tmp到正式文件);

    上代码;

    package com.example.demo.test;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    
    /**
     * @program: demo
     * @description
     * @author: Young
     * @create: 2020-10-28 17:10
     **/
    public class TestJave {
    
        public static void main(String[] args) {
            writeData2File("你好,二狗\r\n你好,小猫","E:/test00","20210223-4GZM");
        }
    
        /**
         * @author Young
         * @description 将字符写入文件,未写完时.tmp文件,写完后更改为正式文件
         * @date 12:03 2021/2/23
         * @param data	 文件内容
         * @param path	 文件路径
         * @param fileName	 文件名称
         * @return void
         **/
        public static void writeData2File(String data,String path,String fileName){
            File dirFile = new File(path);
            if (!dirFile.exists()){
                dirFile.mkdirs();
            }
            try(
                    FileWriter fileWriter = new FileWriter(path+"/"+fileName+".tmp");
                    BufferedWriter bw = new BufferedWriter(fileWriter)
                    ){
                File fileTmp = new File(path,fileName+".tmp");
                if (!fileTmp.exists()){
                    fileTmp.createNewFile();
                }
                bw.write(data);
                bw.flush();
                fileWriter.flush();
    
            }catch (Exception e){
                e.printStackTrace();
            }
            //  try中有流式操作,try结束,关流
            //  重命名
            File tmp = new File(path + "/"+fileName+".tmp");
            File file = new File(path+"/"+fileName+".log");
            if (file.exists()){
                boolean delete = file.delete();
                System.out.println("目标文件存在,删除目标文件状态"+delete);
            }
            boolean b = tmp.renameTo(file);
            System.out.println("重命名状态"+b);
        }
    
    }
    

    renameTo流关闭后,命名不同后缀的文件;成功

    流未关闭时,renameTo不同后缀的文件;失败

    其实在这里是有一个误区.

    .我看了一篇文章,他的意思是renameTo方法只能对相同后缀的文件进行重命名....(感觉是不对的...但是我现在好像都复现不了他的问题了.....)

     

    当然

    我这是在windows端测试的.....大佬和我赌一顿饭,说在linux下,即使操作流未关闭,依旧可以renameTo成功的..我有点儿不信...想试试..验证下,明天给结果...

     

    展开全文
  • import java.io.File;import java.io.FileWriter;import java.io.IOException;public class Test {public static void main(String[] args) {//文件路径File file=new File("d:\\alphabet.txt");//如果文件存在就...
  • 假设源文件为Foo.txt.我希望目标文件的名称为Foo(Copy).txt.我希望保留源文件.我该如何完成这项工作?/** Returns a copy of the specified source file** @param sourceFile the specified source file* @throws ...
  • Java文件上传文件名重复自动加(1)

    千次阅读 2021-01-30 16:28:48
    Java文件上传文件名重复自动加(1) 写了一个如果文件名重复 自动对文件名加(序号)的功能,总感觉哪里不太对,如果有更好的方法,希望能留言告诉我Thanks♪(・ω・)ノ。 makeQueryStringAllRegExp()方法在是从网上...
  • 展开全部JAVA文件上传组件文件上传的方法多种多样,但62616964757a686964616fe78988e69d8331333238636662个人偏爱三方包实现文件上传,因为使用三方包能使代码更简单,可读性更高,文件上传的三方包通常我们使用...
  • java文件操作

    2021-03-05 19:33:34
    例一:从一个文件读入数据,然后写入另外一个文件package lipika;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java....
  • Java文件操作

    2021-03-08 08:08:45
    文件的建立、检查与删除String path=request.getRealPath("");//out.println(path);File f=new File(path,"File.txt");//out.println(f);//out.println(f.exists());if(f.exists()){//检查File.txt是否存在f.delete...
  • Java操作属性文件,支持新增或更新多个属性一、更新或新增单个属性的方法/*** 写入properties信息* @param filePath 绝对路径(包括文件名和后缀名)* @param parameterName 名称* @param parameterValue 值*/public ...
  • 转别人的合并的链接//https://www.cnblogs.com/chenhuan001/p/6575053.html//https://blog.csdn.net/lovoo/article/details/77899627第一个链接找不到了作者看见了说一下我给...import java.io.BufferedInputStream...
  • 本文准备编写一个实际的例子——演示修改zip内的txt文件,在后面追加文本。二、封装zip内文件处理的函数因为替换zip内文件是一个比较常用的功能,于是考虑将zip压缩流的处理封装为一个函数。这就实现了解耦,使zip内...
  • import java.io.*;import java.util.*;import java.util.concurrent.*;/*** 文件处理辅助类**@authoryjmyzz@126.com*@version0.2*@since2014-11-17**/public classFileUtil {/*** 当前目录路径*/public...
  • char ch,infile[10],outfile[10通过一个简单的示例进行讲解(此示例用文本文件进行演示): #include #include #include #define FILE_NAME "demo.txt" // 文件名称 int main() { FILE* fp = NULL; // 文件指针 ch...
  • 文章目录java输入输出及文件的详细解析File类(重点)基本概念常用的方法IO 流IO流的概念基本分类体系结构相关流的详解下面类的思维导图FileWriter类(重点)FileReader类(重点)FileOutputStream类(重点)...
  • 但是在Android里面要实现多文件上传,还要夹着普通表单字段上传,这下可能就有点费劲了,今天花时间整理了一个工具类,主要是借助于HttpClient,其实也很简单,看一下代码就非常清楚了HttpClient工具类:HttpClient...
  • 运行java的class文件方法详解

    千次阅读 2021-01-17 09:47:02
    一、运行class文件执行带main方法的class文件,命令行为:java 注意:CLASS文件名不要带文件后缀.class例如:java Test如果执行的class文件是带包的,即在类文件中使用了:package 那应该在包的基路径下执行,命令...
  • 数字编号的M3U8文件集合并为一个视频介绍代码使用遇见的问题 介绍 文件本身其实使用播放器就可以播放,所以,目标就是将这些文件合并成一个文件。对文件进行排序拼接即可 代码 import java.io.BufferedInputStream; ...
  • 展开全部通过一个简单的示例进行62616964757a686964616fe78988e69d8331333433633438讲解(此示例用文本文件进行演示):#include #include #include #define FILE_NAME "demo.txt" // 文件名称int main(){FILE* fp = ...
  • 7 文件的复制需要四个参数:1,路径或文件),2路径或文件,3,是否覆盖,4,是否追加,8 多文件复制还需要加时间参数(毫秒).9 * 以及File类实例的简单创建,10 *11 *@version212 *@authorJXLYS13 */14 public class Fi...
  • java文件处理io流

    2021-03-30 22:27:11
    java文件处理io流 File 文件操作 方法 简介 boolean exists() 判断文件和目录是否存在 boolean isFile() 判断是否是文件 boolean isDirectory() 判断是否是目录 String getPath() 返回当前路径 ...
  • 以·tar.gz为后缀的文件是一种压缩文件,在Linux和macOS下常见,也可以使用后缀名.tgz表示。 那么Java如何实现将多个文件打进tar包,然后再gzip压缩呢? 打tar包我借助了apache的commons-compress依赖,而gzip...
  • 概要Files: 操作文件的工具类,Java7加入,封装了用户机器上处理文件系统所需所有功能。包含了文件创建、复制、写入、读出、删除,获取文件信息,快捷访问、遍历目录等功能。使用较File更方便,由于结合了Path/...
  • 运行java的class文件方法详解一、运行class文件执行带main方法的class文件,命令行为:java 注意:CLASS文件名不要带文件后缀.class例如:java Test如果执行的class文件是带包的,即在类文件中使用了:package 那...
  • java 识别 big5编码文本文件[2021-02-02 17:15:35]简介:分析:(推荐教程:java课程)通过题目的意思我们可以知道如下内容:ArrayList集合里存储的是字符串遍历ArrayList集合,把数据获取然后存储到文本文件中文本文...
  • java操作文件FileUtil文件相关的工具类常用方法static boolean appendLine(java.io.File file, java.lang.String str)在文件末尾追加一行static boolean cleanFile(java.io.File file)快速清空一个超大的文件static ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,955
精华内容 15,182
关键字:

java追加文件扩展名

java 订阅