package com;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Main {
public static void main(String[] args) {
long start = System.currentTimeMillis();
File file = new File("D:\\Downloads\\好好國際物流股份有限公司-台湾.pdf");
String fileName = file.getName();
String name = fileName.substring(0, fileName.lastIndexOf("."));
String path = file.getAbsolutePath();
path = path.substring(0, path.lastIndexOf("\\") + 1);
//将文件转换为base64字符串
String contentString = convertFileToBase64(file.getAbsolutePath());
//将base64字符串内容写入txt文件
writeToFile(path + name + ".txt", contentString);
//读取文件里的base64字符串内存
contentString = readFile(path +name +".txt");
//将base64字符串转换为正常文件
generateBase64StringToFile(contentString, path + "new\\" + fileName);
long end = System.currentTimeMillis();
System.out.println("转换过程耗时:" + (end - start) + " ms");
}
/**
* 读取文件数据
* @param strFile
*/
public static String readFile(String strFile){
String contentString = "";
InputStream is = null;
try{
is = new FileInputStream(strFile);
int iAvail = is.available();
byte[] bytes = new byte[iAvail];
is.read(bytes);
is.close();
contentString = new String(bytes, StandardCharsets.UTF_8);
}catch(Exception e){
e.printStackTrace();
}
finally {
try {
if (null != is) {
is.close();
}
} catch (Exception e2) {
// TODO: handle exception
}
}
return contentString;
}
/**
* 写入文件
*
* @param fileName
* @param content
* @throws IOException
*/
public static void writeToFile(String fileName, String content){
File f1 = new File(fileName);
OutputStream out = null;
BufferedWriter bw = null;
try {
if (!f1.exists()) {
mkdirParents(f1);
if (!f1.createNewFile()) {
System.out.println("文件不存在,创建文件失败!");
return;
} else {
System.out.println("文件不存在,创建文件成功!");
}
}
System.out.println("待写入Base64字符串的文件为:" + f1.getAbsolutePath());
System.out.println("待写入Base64字符串的文件大小(字节):" + content.getBytes(StandardCharsets.UTF_8).length);
out = new FileOutputStream(f1);
bw = new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8));
bw.write(content);
bw.flush();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
try {
if (null != out) {
out.close();
}
if (null != bw) {
bw.close();
}
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
}
/**
* 将文件转换为base64字符串
* @param imgPath
* @return
*/
public static String convertFileToBase64(String filePath) {
byte[] data = null;
InputStream in = null;
// 读取文件字节数组
try {
in = new FileInputStream(filePath);
System.out.println("待进行Base64转换文件为:" + new File(filePath).getAbsolutePath());
System.out.println("待进行Base64转换文件大小(字节):" + in.available());
data = new byte[in.available()];
in.read(data);
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
if (null != in) {
in.close();
}
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
// 对字节数组进行Base64编码,得到Base64编码的字符串
Base64.Encoder encoder = Base64.getEncoder();
String base64Str = encoder.encodeToString(data);
return base64Str;
}
/**
* 对字节数组字符串进行Base64解码并生成文件
*
* @param fileStr 文件base64位数据
* @param fileFilePath 保存文件全路径地址
* @return
*/
public static boolean generateBase64StringToFile(String fileStr, String fileFilePath) {
OutputStream out = null;
boolean flag = true;
if (fileStr == null) // 文件base64位数据为空
return false;
try {
File file = new File(fileFilePath);
if (!file.exists()) {
mkdirParents(file);
if (!file.createNewFile()) {
System.out.println("文件不存在,创建文件失败!");
return false;
} else {
System.out.println("文件不存在,创建文件成功!");
}
}
Base64.Decoder decoder = Base64.getDecoder();
// Base64解码
byte[] b = decoder.decode(fileStr);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {// 调整异常数据
b[i] += 256;
}
}
out = new FileOutputStream(fileFilePath);
out.write(b);
out.flush();
} catch (Exception e) {
flag = false;
e.printStackTrace();
} finally {
try {
if (null != out) {
out.close();
}
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
return flag;
}
/**
* 判断文件的父级目录是否存在,不存在则创建
* @param file 文件
* @return true 父级目录存在或创建父级目录成功, false创建父级目录失败
*/
private static boolean mkdirParents(File file){
if (!file.getParentFile().exists()) {
return file.getParentFile().mkdirs();
}
else {
return true;
}
}
}