请用JAVA 实现以下功能: 读取压缩包zip(报销类型)查询报销文件是否齐全,缺少、不是必须的文件则提示给用户。 以下为7个报销类型所必需文件: 结婚慰问:报销明细、发票、发票查验、支付证明、结婚证生育慰问:报销明细、发票、发票查验、支付证明、出生证住院慰问:报销明细、诊断证明慰唁慰问:报销明细、死亡证明 荣退慰问:报销明细、发票、发票查验、支付证明 团队文体活动:费用报销单、发票、发票查验、邮件、签到表、照片 中心项目报销:费用销单、发票、票查验、邮件、签表、照片 报销文件必须满足以下校验规则: 1、每个报销类型下的文件是必传的 2、除了:报销明细、结婚证、出生证、诊断证明、死亡证明、费用报销单、签到表只能上传一份,其他文件支持上传多份,且发票不能超过2张 3、根据上传文件的文件名来校验当前文件,文件名不正确则视为当前文件缺失,忽略其后缀名称,如报销明细文件名写成:报销明细表;
时间: 2023-09-12 15:13:09 浏览: 127
JAVA实现把指定文件夹下的所有文件压缩成zip包.rar_CKD_EHZ_live8y7_paid44l
以下是一个Java程序,可以实现您所描述的功能。请注意,这只是一个简单的示例,实际情况可能需要根据具体需求进行修改和完善。
```java
import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipFileChecker {
private static final String[] REQUIRED_FILES = {
"报销明细", "发票", "发票查验", "支付证明", "结婚证", "出生证", "诊断证明", "死亡证明", "费用报销单", "签到表"
};
private static final String[] ALLOWED_MULTIPLE_FILES = {
"发票"
};
private static final int MAX_ALLOWED_INVOICES = 2;
private static final String[] REQUIRED_FILE_EXTENSIONS = {
".doc", ".docx", ".pdf"
};
private Map<String, Integer> fileCounts = new HashMap<>();
public void checkZipFile(String filename) throws Exception {
resetFileCounts();
try (ZipInputStream zipStream = new ZipInputStream(new FileInputStream(filename))) {
ZipEntry entry;
while ((entry = zipStream.getNextEntry()) != null) {
String nameWithoutExtension = stripFileExtension(entry.getName());
String extension = getFileExtension(entry.getName());
if (isAllowedFile(nameWithoutExtension, extension)) {
if (!fileCounts.containsKey(nameWithoutExtension)) {
fileCounts.put(nameWithoutExtension, 0);
}
if (isAllowedMultipleFiles(nameWithoutExtension) || fileCounts.get(nameWithoutExtension) == 0) {
fileCounts.put(nameWithoutExtension, fileCounts.get(nameWithoutExtension) + 1);
}
}
}
}
for (String requiredFile : REQUIRED_FILES) {
if (!fileCounts.containsKey(requiredFile) || fileCounts.get(requiredFile) == 0) {
System.out.println("缺少必须的文件: " + requiredFile);
}
}
for (String nameWithoutExtension : fileCounts.keySet()) {
if (fileCounts.get(nameWithoutExtension) > getMaxAllowedFiles(nameWithoutExtension)) {
System.out.println("文件数量超出限制: " + nameWithoutExtension);
}
}
}
private void resetFileCounts() {
fileCounts.clear();
}
private boolean isAllowedFile(String nameWithoutExtension, String extension) {
if (extension == null) {
return false;
}
for (String requiredFile : REQUIRED_FILES) {
if (nameWithoutExtension.equals(requiredFile)) {
for (String requiredExtension : REQUIRED_FILE_EXTENSIONS) {
if (extension.equals(requiredExtension)) {
return true;
}
}
}
}
for (String allowedFile : ALLOWED_MULTIPLE_FILES) {
if (nameWithoutExtension.equals(allowedFile)) {
for (String requiredExtension : REQUIRED_FILE_EXTENSIONS) {
if (extension.equals(requiredExtension)) {
return true;
}
}
}
}
return false;
}
private boolean isAllowedMultipleFiles(String nameWithoutExtension) {
for (String allowedFile : ALLOWED_MULTIPLE_FILES) {
if (nameWithoutExtension.equals(allowedFile)) {
return true;
}
}
return false;
}
private int getMaxAllowedFiles(String nameWithoutExtension) {
for (String allowedFile : ALLOWED_MULTIPLE_FILES) {
if (nameWithoutExtension.equals(allowedFile)) {
return MAX_ALLOWED_INVOICES;
}
}
return 1;
}
private String getFileExtension(String filename) {
int lastDotIndex = filename.lastIndexOf(".");
if (lastDotIndex >= 0) {
return filename.substring(lastDotIndex);
} else {
return null;
}
}
private String stripFileExtension(String filename) {
int lastDotIndex = filename.lastIndexOf(".");
if (lastDotIndex >= 0) {
return filename.substring(0, lastDotIndex);
} else {
return filename;
}
}
}
```
这个程序使用了一个 `ZipFileChecker` 类,它有一个 `checkZipFile` 方法,用于检查一个指定的 ZIP 文件。这个方法按照您所描述的规则来检查 ZIP 文件,如果发现缺少必需文件或文件数量超出限制,就会输出提示信息。在使用这个方法之前,您需要先设置 `REQUIRED_FILES`、`ALLOWED_MULTIPLE_FILES` 和 `MAX_ALLOWED_INVOICES` 常量,以及 `REQUIRED_FILE_EXTENSIONS` 数组,来指定必需文件、允许多个文件的文件名,以及文件扩展名。
阅读全文