文件上传 根据编码读取txt文件内容重新写入UTF-8编码Txt文件

nginx转发地址为 fileUploadUrl

package com.cncbox.saoye.test;

import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author : zhang sq
 * @date : 2019/12/25 9:38
 **/
@Component
@Log4j2
public class FileUtils {

    //nginx转发请配置此地址    /=C:/ftp/root/
    @Value("${file.update.url}")
    private String fileUploadUrl; //yml 配置文件上传地址  例: C:/ftp/root/

    @Value("${server.url}")
    private String serverName;  //服务名    saoye

    //文件上传根路径
    public static String filePath;
    //文件上传服务名
    private static String serverPath;

    @PostConstruct  //启动时候直接赋值
    public void init() {
        filePath = this.fileUploadUrl;
        serverPath = this.serverName;
        log.error("===============filePath参数赋值{}=============", filePath);
        log.error("===============serverPath参数赋值{}=============", serverPath);
    }

    /**
     * 批量上传
     * @param namePath 上传地址  格式例:  /新西游记/大闹天宫/斗法二郎神/
     */
    public static List<String> uploadFile(List<MultipartFile> files, String namePath) {
        if (null == files || files.size() == 0) {
            log.error("===============files集合文件为空=============");
            return null;
        }
        List<String> fileList = new ArrayList<>();
        for (MultipartFile file : files) {
            String uploadFile = uploadFile(file, namePath);
            if (null == uploadFile) {
                log.error("===============files集合文件有内容为空或错误=============");
                return null;
            }
            fileList.add(uploadFile);
        }
        return fileList;
    }

    /**
     * 文件上传
     * @param namePath   格式例:  /新西游记/大闹天宫/斗法二郎神/
     * @param file 文件
     * @return 上传地址   返回为null  证明参数有问题
     */
    public static String uploadFile(MultipartFile file, String namePath) {
        log.info("=====file值为:{}=====namePath值为:{}",file,namePath);
        //文件为空
        if (null == file || StringUtils.isBlank(file.getOriginalFilename())) {
            log.error("===============文件为空=============");
            return null;
        }
        String fileName = file.getOriginalFilename();//文件名  abc.png
        //文件名为空 或者格式错误
        if (!fileName.contains(".") || StringUtils.isEmpty(fileName)) {
            log.error("===============文件格式错误,文件全名为{}=============", fileName);
            return null;
        }
        //将字符全部小写截取文件后缀  txt   png  img
        String fileType = fileName.toLowerCase().substring(fileName.lastIndexOf(".") + 1);
        try {
            StringBuffer ssb = new StringBuffer(); //上传地址
            long timeMillis = System.currentTimeMillis();
            int random = (int) (Math.random() * (100) + 100);
            StringBuffer sb = new StringBuffer();  //返回地址
            //创建文件夹  saoye/史记/史记四十七/txt/12345632.txt
            sb=sb.append(serverPath.toLowerCase())
                    .append(namePath).append(fileType).append("/").append(String.valueOf(timeMillis))
                    .append(String.valueOf(random)).append(".").append(fileType);
            //  c:/ftp/root/saoye/史记/史记四十七/txt/12345632.txt
            String fileDir = ssb.append(filePath.toLowerCase()).append(sb).toString();

            File dirFile = new File(fileDir);
            if (!dirFile.exists()) {
                dirFile.mkdirs();
            }
            file.transferTo(dirFile);
            log.info("===========上传真实地址为: {}",dirFile);
            log.info("============上传返回地址为 {}=====",sb);
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 删除图片 1->删除成功  0->删除失败
     * @param fileUrl 文件路径
     */
    public static int deleteFileByUrl(String fileUrl) {
        log.info("============传入删除文件地址为 {}=====",fileUrl);
        StringBuffer sb=new StringBuffer();
        fileUrl=sb.append(filePath.toLowerCase()).append(fileUrl).toString();
        log.info("============文件真实删除地址为 {}=====",fileUrl);
        File file = new File(fileUrl);
        int result = 0;
        if (file.exists()) {
            file.delete();
            log.info("=================={}:文件已删除", fileUrl);
            return 1;
        }
        return result;
    }

    /**
     * 读取txt文件内容
     * @param fileEncod  文件编码格式 UTF-8/GBK
     * @param txtPath 文件路径
     */
    public static String readTxtFile(String txtPath,String fileEncod) {
        log.info("=======传入文件路径为:{}  , 文件编码格式为:{}",txtPath,fileEncod);
        StringBuffer sb=new StringBuffer();
        txtPath=sb.append(filePath.toLowerCase()).append(txtPath).toString();
        log.info("================读取文件真实路径为{}", txtPath);
        if (StringUtils.isEmpty(txtPath)) {
            log.error("================传入路径错误为null:{}", txtPath);
            return null;
        }
        String fileType = txtPath.toLowerCase().substring(txtPath.lastIndexOf(".") + 1);
        if (!fileType.equals("txt")) {
            log.error("================传入文件格式错误,不是txt文件 :{}", txtPath);
            return null;
        }
        File dirFile = new File(txtPath);
        if (!dirFile.exists()) {
            log.error("================传入文件路径错误,文件不存在 :{}", txtPath);
            return null;
        }
        String fileContent = "";
        try {
            InputStreamReader read = new InputStreamReader(new FileInputStream(txtPath), fileEncod);
            BufferedReader reader = new BufferedReader(read);
            String line;
            while ((line = reader.readLine()) != null) {
                fileContent += line;
            }
            read.close();
        } catch (Exception e) {
            e.printStackTrace();
            log.error("=========文件读取错误==========");
            throw new RuntimeException();
        }
        return fileContent;
    }

    /**
     * @param filePostfix    写入文件地址  格式      /西游记/三打白骨精/第四章/
     * @param fileContent 写入文件内容
     * @return 写入文件地址
     */
    public static String writeTxtFile(String filePostfix, String fileContent) {
        StringBuffer sb=new StringBuffer(); //返回地址
        int random = (int) (Math.random() * (100) + 100); //113
        sb=sb.append(serverPath.toLowerCase()).append(filePostfix); //
        StringBuffer fileName=new StringBuffer(); //文件名称
        fileName=fileName.append(System.currentTimeMillis()).append(String.valueOf(random)).append(".txt");
        StringBuffer ssb=new StringBuffer(); //写入地址
        String fileUrl=ssb.append(filePath.toLowerCase()).append(sb).toString();
        String filUrlpath=filePath.toLowerCase()+sb+fileName; //文件最终存储真实地址
        try {
            File dir = new File(fileUrl);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            File file = new File(filUrlpath);
            file.createNewFile();
            log.info("===============新的写入地址为:{}",filUrlpath);
            OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
            BufferedWriter writer = new BufferedWriter(write);
            writer.write(fileContent);
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
            log.error("===============文件写入错误:文件地址:{}   文件内容: {}",filUrlpath, fileContent);
            deleteFileByUrl(sb.append(fileName).toString()); //删除错误文件
            throw new RuntimeException(e);
        }
       return sb.append(fileName).toString();
    }

    //判断txt文件编码格式方法
    public static  String getFilecharset(File sourceFile) {
        String charset = "GBK";
        byte[] first3Bytes = new byte[3];
        try {
            boolean checked = false;
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));
            bis.mark(0);
            int read = bis.read(first3Bytes, 0, 3);
            if (read == -1) {
                return charset; //文件编码为 ANSI
            } else if (first3Bytes[0] == (byte) 0xFF
                    && first3Bytes[1] == (byte) 0xFE) {
                charset = "UTF-16LE"; //文件编码为 Unicode
                checked = true;
            } else if (first3Bytes[0] == (byte) 0xFE
                    && first3Bytes[1] == (byte) 0xFF) {
                charset = "UTF-16BE"; //文件编码为 Unicode big endian
                checked = true;
            } else if (first3Bytes[0] == (byte) 0xEF
                    && first3Bytes[1] == (byte) 0xBB
                    && first3Bytes[2] == (byte) 0xBF) {
                charset = "UTF-8"; //文件编码为 UTF-8
                checked = true;
            }
            bis.reset();
            if (!checked) {
                int loc = 0;
                while ((read = bis.read()) != -1) {
                    loc++;
                    if (read >= 0xF0)
                        break;
                    if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
                        break;
                    if (0xC0 <= read && read <= 0xDF) {
                        read = bis.read();
                        if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)
                            // (0x80
                            // - 0xBF),也可能在GB编码内
                            continue;
                        else
                            break;
                    } else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小
                        read = bis.read();
                        if (0x80 <= read && read <= 0xBF) {
                            read = bis.read();
                            if (0x80 <= read && read <= 0xBF) {
                                charset = "UTF-8";
                                break;
                            } else
                                break;
                        } else
                            break;
                    }
                }
            }
            bis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("===============文件编码格式为: {}",charset);
        return charset;
    }

    public static void main(String[] args) {
        String filepath="C:\\ftp\\root\\saoye\\李白\\诗仙\\第六页\\1576639675444135.txt";
        String file = writeTxtFile("/西游记/三打白骨精/第四章/", "文件编码格式为");
        System.out.println(file);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值