- 网友的实现:
package com.c2f.hbos.mcc.common.utils;
import com.c2f.hbos.mcc.core.catalog.enums.SHMedicationCatalogDataSourceEnum;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
* @description: Zip包工具
* @author: Yang JianXiong
* @since: 2023/3/6
*/
public class DataPackageServiceImpl {
public void upload(MultipartFile dataPackage) throws IOException {
if (dataPackage == null || dataPackage.getSize() <= 0) {
return;
}
File file = multipartFileToFile(dataPackage);
if (file == null || !file.exists()) {
return;
}
ZipFile zipFile = new ZipFile(file, Charset.forName("GBK"));
Enumeration<? extends ZipEntry> dirEntries = zipFile.entries();
while (dirEntries.hasMoreElements()) {
ZipEntry entry = dirEntries.nextElement();
if (entry.isDirectory()) {
continue;
}
// 获取节点输入流
// InputStream inputStream = zipFile.getInputStream(entry);
// 获取节点元数据
System.out.println(entry.getName());
}
// 回收资源
IOUtils.closeQuietly(zipFile);
file.delete();
}
// MultipartFile 转 File
private File multipartFileToFile(MultipartFile multipartFile) {
File file = null;
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = multipartFile.getInputStream();
file = new File(multipartFile.getOriginalFilename());
outputStream = new FileOutputStream(file);
write(inputStream, outputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
private void write(InputStream inputStream, OutputStream outputStream) {
byte[] buffer = new byte[4096];
try {
int count = inputStream.read(buffer, 0, buffer.length);
while (count != -1) {
outputStream.write(buffer, 0, count);
count = inputStream.read(buffer, 0, buffer.length);
}
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
- 我的实现:
package com.c2f.hbos.mcc.common.utils;
import com.c2f.hbos.mcc.core.catalog.enums.SHMedicationCatalogDataSourceEnum;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
* @description: Zip包工具
* @author: Yang JianXiong
* @since: 2023/3/6
*/
public final class SHMedicationCatalogZippedTxtUtil {
public static void upload(MultipartFile dataPackage) throws IOException {
if (dataPackage == null || dataPackage.getSize() <= 0) {
return;
}
File file = multipartFileToFile(dataPackage);
if (file == null || !file.exists()) {
return;
}
ZipFile zipFile = new ZipFile(file, Charset.forName("GBK"));
Enumeration<? extends ZipEntry> dirEntries = zipFile.entries();
while (dirEntries.hasMoreElements()) {
List list = handleOneFile(zipFile, dirEntries);
}
// 回收资源
IOUtils.closeQuietly(zipFile);
file.delete();
}
public static List handleOneFile(ZipFile zipFile, Enumeration<? extends ZipEntry> dirEntries) throws IOException {
ZipEntry entry = dirEntries.nextElement();
if (entry.isDirectory()) {
return null;
}
String zipEntryName = entry.getName();
System.err.println(zipEntryName);
InputStream in = zipFile.getInputStream(entry);
SHMedicationCatalogDataSourceEnum byFileName = SHMedicationCatalogDataSourceEnum.getByFileName(zipEntryName);
List instanceList = new ArrayList();
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, byFileName.getSourceCharSet()))) {
String line;
while ((line = bufferedReader.readLine()) != null) {
if (StringUtils.isBlank(line)) {
continue;
}
Object o = SHMedicationCatalogTextParser.fromText(line, byFileName.getClazz(), byFileName.getLengthArr(), byFileName.getSourceCharSet(), byFileName.getDestinationCharSet());
instanceList.add(o);
}
}
return instanceList;
}
// MultipartFile 转 File
private static File multipartFileToFile(MultipartFile multipartFile) {
File file = null;
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = multipartFile.getInputStream();
file = new File(multipartFile.getOriginalFilename());
outputStream = new FileOutputStream(file);
write(inputStream, outputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
private static void write(InputStream inputStream, OutputStream outputStream) {
byte[] buffer = new byte[4096];
try {
int count = inputStream.read(buffer, 0, buffer.length);
while (count >= 0) {
outputStream.write(buffer, 0, count);
count = inputStream.read(buffer, 0, buffer.length);
}
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
- 我的终版实现:
package com.c2f.hbos.mcc.common.utils;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
* @description: Zip包工具
* @author: Yang JianXiong
* @since: 2023/3/6
*/
public final class SHMedicationCatalogZippedTxtUtil {
/**
* 从MultipartFile文件获取子文件的输入流
*
* @param dataPackage
* @return
* @throws IOException
*/
public static Map<String, InputStream> getInputOfMultipartFile(MultipartFile dataPackage) throws IOException {
if (dataPackage == null || dataPackage.getSize() <= 0) {
return null;
}
File file = multipartFileToFile(dataPackage);
if (file == null || !file.exists()) {
return null;
}
Map<String, InputStream> inputStreamMap = new HashMap<>(8);
ZipFile zipFile = new ZipFile(file, Charset.forName("GBK")); // ISO-8859-1
Enumeration<? extends ZipEntry> dirEntries = zipFile.entries();
while (dirEntries.hasMoreElements()) {
ZipEntry txtFile = dirEntries.nextElement();
if (txtFile.isDirectory()) {
continue;
}
String txtName = txtFile.getName();
InputStream txtInputStream = zipFile.getInputStream(txtFile);
inputStreamMap.put(txtName, txtInputStream);
}
return inputStreamMap;
}
/**
* MultipartFile 转 File
*
* @param multipartFile
* @return
*/
private static File multipartFileToFile(MultipartFile multipartFile) {
File file = null;
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = multipartFile.getInputStream();
file = new File(multipartFile.getOriginalFilename());
outputStream = new FileOutputStream(file);
write(inputStream, outputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
/**
* 入出转换
*
* @param inputStream
* @param outputStream
*/
private static void write(InputStream inputStream, OutputStream outputStream) {
byte[] buffer = new byte[4096];
try {
int count = inputStream.read(buffer, 0, buffer.length);
while (count >= 0) {
outputStream.write(buffer, 0, count);
count = inputStream.read(buffer, 0, buffer.length);
}
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
学习使我充实,分享给我快乐!