首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Java中以zip方式添加非ASCII文件名

在Java中,如果要将非ASCII文件名以zip方式添加,你需要确保在文件名中正确处理字符集和大小写。以下是一个使用Java Standard Edition (SE) 和Java Platform, Enterprise Edition (JEE) 中的java.util.zip操作的示例:

  1. 导入需要的类 你需要导入相关的类,例如java.util.zipjava.io.File
代码语言:java
复制
import java.util.zip.*;
import java.io.File;
  1. 使用File对象加载文件流 在Java中,你可以使用File 对象和InputStream接口来读取文件流。
代码语言:java
复制
// File 对象表示要压缩的文件
File fileToZip = new File("/path/to/file.txt");

// 假设 inputStream 是要压缩的文件的 FileInputStream
InputStream inputStream = new FileInputStream(fileToZip);
  1. 创建ZIPOutputStream对象并进行压缩 然后,使用java.util.zip.ZipOutputStream创建一个ZIPOutputStream,将文件流添加到输出中,并用指定的文件名创建ZIPEntry对象。
代码语言:java
复制
// ZIPOutputStream 用于存储压缩输出
ZipOutputStream zipOutputStream = new ZipOutputStream(System.out);

// 遍历目录中的所有文件,并将其添加到 ZIP 输出
File[] filesToZip = fileToZip.listFiles();

for (File file : filesToZip) {
    try {
        // 将文件名转换为小写以处理非 ASCII 文件名
        String filenameLowerCase = file.getName().toLowerCase();

        // 创建ZIPEntry对象并将文件流添加到输出
        ZipEntry zipEntry = new ZipEntry(filenameLowerCase);
        zipOutputStream.putNextEntry(zipEntry);

        byte[] buffer = new byte[1024];
        int len;

        FileInputStream fileInputStream = new FileInputStream(file);

        while ((len = fileInputStream.read(buffer)) > 0) {
            zipOutputStream.write(buffer, 0, len);
        }

        fileInputStream.close();
        zipOutputStream.flush();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

// 关闭ZIPOutputStream以关闭zip流
zipOutputStream.close();
  1. 在Java SE和JEE中处理非ASCII文件名

在Java SE中,你可以使用PathFileNameGenerator来获取与字符集相关的文件名。首先,使用java.nio.file.Path转换文件名,将其转换为java.nio.Files,然后使用java.nio.charset.StandardCharsets将字符转换为与字节序无关的字符集。

在JEE中,使用StringEncoderCharsetEncoder将字符转换为字节,并将字节映射到CharacterEncoder以生成非ASCII文件名。然后使用ZipEntry 将生成的文件名添加到 ZIP 输出。

以下是在Java JEE中处理非ASCII文件名的示例:

代码语言:java
复制

// 引入需要的依赖包

import java.io.*;

import java.nio.*;

import java.nio.charset.*;

import java.nio.file.*;

import java.nio.charset.spi.*;

import java.util.*;

import java.util.zip.*;

// UTF-8 编码器

Charset UTF8 = Charset.forName("UTF-8");

// 将字符集编码的字符串转换回字节数组

byte[] utf8ByteArray(String str) {

代码语言:txt
复制
return str.getBytes(UTF8);

}

// 将字节数组转换回字符集编码的字符串

String utf8String(byte[] bytes) {

代码语言:txt
复制
return new String(bytes, UTF8);

}

public class UnicodeFilenameEncoder {

代码语言:txt
复制
private final StringEncoder defaultEncoder = new StringEncoder(UTF8);
代码语言:txt
复制
private final CharacterEncoder nonDefaultEncoder = new UnicodeFilenameEncoder.NonDefaultCharacterEncoder();
代码语言:txt
复制
private final Map<String, CharacterEncoder> stringEncoders = new HashMap<>();
代码语言:txt
复制
UnicodeFilenameEncoder() {
代码语言:txt
复制
    stringEncoders.put("UTF-8", UTF8);
代码语言:txt
复制
}
代码语言:txt
复制
public static Path normalizeAndEncodeToFileSystemSafeName(Path file, CharsetEncoder encoder) {
代码语言:txt
复制
    return normalizeAndEncodeToFileSystemSafeName(file, encoder, (String)null);
代码语言:txt
复制
}
代码语言:txt
复制
public static Path normalizeAndEncodeToFileSystemSafeName(Path file, CharsetEncoder encoder, String fileExt) {
代码语言:txt
复制
    return normalizeAndEncodeToFileSystemSafeName(file.toFile(), encoder, fileExt);
代码语言:txt
复制
}
代码语言:txt
复制
public static Path normalizeAndEncodeToFileSystemSafeName(File file, CharsetEncoder encoder) {
代码语言:txt
复制
    return normalizeAndEncodeToFileSystemSafeName(file, encoder, (String)null);
代码语言:txt
复制
}
代码语言:txt
复制
public static Path normalizeAndEncodeToFileSystemSafeName(File file, CharsetEncoder encoder, String fileSuffix) {
代码语言:txt
复制
    String fileName = file.getName();
代码语言:txt
复制
    String name = file.getParent().getName();
代码语言:txt
复制
    String nameWithoutExtension = file.getName().substring(0, file.getName().lastIndexOf('.'));
代码语言:txt
复制
    fileName = utf8String(nonDefaultEncoder.encodeToString(utf8ByteArray((name.isEmpty() ? nameWithoutExtension : name).concat(fileName).concat(fileSuffix))))// 创建非默认的文件名
代码语言:txt
复制
            .replace('/','-');
代码语言:txt
复制
    return Paths.get(file.getPath()).toAbsolutePath()
代码语言:txt
复制
            .normalize()
代码语言:txt
复制
            .getRoot()
代码语言:txt
复制
            .getFileName()
代码语言:txt
复制
            .resolve(fileName);
代码语言:txt
复制
}
代码语言:txt
复制
public static class NonDefaultCharacterEncoder extends CharacterEncoderAdapter {
代码语言:txt
复制
    private Map<String, byte[]> encodingCache = new ConcurrentHashMap<>();
代码语言:txt
复制
    private CharsetEncoder fallbackEncoder = UTF8;
代码语言:txt
复制
    private Charset fallbackCharset;
代码语言:txt
复制
    private boolean cacheCharsetForThisPath;
代码语言:txt
复制
    public NonDefaultCharacterEncoder() {
代码语言:txt
复制
        fallbackCharset = new UTF8();
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public int encodeToChar(byte[] bytes, int off, int len, char[] chars, int charOff) {
代码语言:txt
复制
        return fallbackEncoder.encode(bytes, off, len, createChars(chars, charOff, len), 0, chars.length);
代码语言:txt
复制
    }
代码语言:txt
复制
    private byte[][] createChars(char[] chars, int off, int len) {
代码语言:txt
复制
        if (cacheCharsetForThisPath) {
代码语言:txt
复制
            getChars(chars, off, len);
代码语言:txt
复制
        }
代码语言:txt
复制
        byte[][] bytes = encodingCache.get(fileName);
代码语言:txt
复制
        if (bytes == null) {
代码语言:txt
复制
            bytes = new byte[chars.length][];
代码语言:txt
复制
            getChars(chars, off, len, bytes);
代码语言:txt
复制
            encodingCache.put(fileName, bytes);
代码语言:txt
复制
            if (cacheCharsetForThisPath) {
代码语言:txt
复制
                getChars(chars, off, len);
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
        return bytes;
代码语言:txt
复制
    }
代码语言:txt
复制
    private void getChars(char[] chars, int off, int len, byte[][] bytes) {
代码语言:txt
复制
        // 省略实现细节,将字符转换成字节,并根据指定的UTF-8编码进行转换
代码语言:txt
复制
    }
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Ant打包安卓apk(4)-多渠道(配置)打包方案

|这九种字符 我查询Java的Unicode编码, 想用对应字符替代 用166¦替代: 用643ʃ替代/ 但是从文件名安卓上读取的字符想扑克牌的方片,识别不了, 此路不走罢 试试URL编码...(不推荐) 该种方式利用了APK本身是一种zip包的特点,zip的注释字段添加渠道信息,并提供了gradle插件。...其中数据格式定义如下: 而添加的渠道信息如下所示: 该种方式较前两种方式实现相对麻烦些,特别是渠道信息的获取需要读取整个APK,解析注解,获取渠道信息,另外就是兼容性不是很好。...AndroidManifest.xml添加渠道信息 (推荐) 渠道信息将被添加到application结点下的子结点meta-data,如下: <application android...命令行下,运行:java -jar makechannels.jar 查看版本号与使用方法: image.png 配置的channels.txt(|分割, 第一个是配置value, 第二个是配置key

1.2K10

第二十章 : 正则表达式

这个命令会列出,位于目录 /usr/bin 文件名包含子字符串“zip”的所有文件。...任意字符的区域都能按照这种方式表达,包括多个区域,比如下面这个表达式就匹配了所有字母和数字开头的文件名: [me@linuxbox ~]$ grep -h '^[A-Za-z0-9]' dirlist...在那次讨论,我们说过某种程度上,那个字符区域被使用的方式几乎与正则表达式的用法一样,但是有一个问题: [me@linuxbox ~]$ ls /usr/sbin/[ABCDEFGHIJKLMNOPQRSTUVWXYZ... ASCII ,它包含33到126的字符。 [:lower:] 小写字母。 [:punct:] 标点符号字符。 ASCII ,等价于: [:print:] 可打印的字符。...会变成匹配任意“bz”开头,或包含“gz”,或包含“zip”的文件名

36110

Linux 命令(103)—— unzip 命令

类似于 -p 选项,但是 -c 会输出文件名 -f 更新现有的文件,即只提取那些已经存在于磁盘上且比磁盘副本更新的文件 -l 只显示压缩文件内所包含的文件不解压 -p 与 -c 选项类似,二进制模式解压文件...默认情况下,unzip 会进行询问是否提取、覆盖或重命名 -o 覆盖现有文件而不提示 -P PASSWORD 使用密码解密 zip 文件 -q 执行时不显示任何信息 -s 将文件名的空白字符转换为下划线...当 UNICODE_SUPPORT 可用时,选项 -U 强制 unzip 将 UTF-8 编码的文件名的所有 ASCII 字符转义为 #uxxx(对于UCS-2字符,或者对于需要 3 个字节的 UNICODE...此选项主要用于怀疑提取 UTF-8 编码文件名时会失败而进行的调试行为 -W 修改通配符 ?(单字符统配符)与 *(多字符通配符) 的匹配行为,使得 ? 与 * 不能匹配目录的分隔符 /。...文件,同时使用 -z 选项为 zip 文件添加注释说明。

4.8K10

CentOS 6.4下定时通过ftp获取数据库服务器上的文件

2,root用户下添加系统定时任务 # crontab -e 20 23 * * * getfromftp.sh 附录: FTP的命令行格式为: ftp -v -d -i -n -g [主机名] ,其中...4.append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。 5.ascii:使用ascii类型传输方式。...7.bin:使用二进制文件传输方式。 8.bye:退出ftp会话过程。 9.case:使用mget时,将远程主机文件名的大写转为小写字母。 10.cd remote-dir:进入远程主机目录。...32.mkdir dir-name:远程主机建一目录。 33.mls remote-file local-file:同nlist,但可指定多个文件名。...44.proxy ftp-cmd:在次要控制连接,执行一条ftp命令, 该命令允许连接两个ftp服务器,两个服务器间传输文件。第一条ftp命令必须为open,首先建立两个服务器间的连接。

1.5K30

深入PHP FTP类的详解

FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是Active,主动方式),一种是 Passive (也就是PASV,被动方式)。...; //下载文件:PHP所提供的函数是ftp_get(),它也需要一个服务器上文件名,下载后的文件名,以及传输类型作为参数,例如:服务器端文件为his.zip,你想下载至本地机,并命名为hers.zip...,命令如下: ftp_get($conn, “hers . zip”, “his . zip”, FTP_BINARY); //PHP提供两种方法:一种是简单列示文件名和目录,另一种就是详细的列示文件的大小...$this->_isconn()) {             return FALSE;         }         //只有PHP5才定义了修改权限的函数(ftp)         if...ftp_no_connection");             }             return FALSE;         }         return TRUE;     }     /**      * 从文件名获取后缀扩展

2.3K80

windows下使用curl命令

curl是利用URL语法命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版,并且有DOS和Win32、Win64下的移植版本。...其中我下载的zip文件。 另外CAB文件也是压缩文件,这是微软出品,不太好用,建议使用zip压缩文件。...使用ASCII /文本传输 -c/–cookie-jar 操作结束后把cookie写入到这个文件 -C/–continue-at 断点续转 -d/–data HTTP POST方式传送数据...–data-ascii ascii方式post数据 –data-binary 二进制的方式post数据 –negotiate 使用HTTP身份验证 –digest 使用数字身份验证 –disable-eprt...-O/–remote-name 把输出写到该文件,保留远程文件的文件名 -p/–proxytunnel 使用HTTP代理 –proxy-anyauth 选择任一代理身份验证方法 –proxy-basic

2.5K20

FTP命令大全

FTP使用的内部命令如下(括号表示可选项): 1)[crud[args)1:本地机执行交互shell,exit回到FTP环境, 列如:!...4)append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远系统文件名,则使用本地文件名。 5)aSCii:使用ascII型传输方式。...6)bell:每个命令执行完毕后计算机响铃—次 7)bin:使用二进制文件传输方式 8)bye..退出FTP会话过程— 9)case:使用mget时,将远程主文件名的大写字母转为小写字母 10)cdremote...,使得文件传输时,文件的某些字符相互转换,如:nmapSl.S2.S3[,][,],则传输文件a1.a2.a3时,文件名变为a1,a20该命令特别适用于远程主机为UNIX机的情况o 40)ntrans...44)proxy FTP-cmd:在次要控制连接,执行一条FTP命令,该命令允许连接两个FTP服务器,两个服务器间传输文件。第一条FTP命令必须为open,首先建立两个服务器间的连接。

2.3K30

(64) 常见文件类型处理: 属性文件CSVEXCELHTML压缩文件 计算机程序的思维逻辑

日常编程,我们还经常会需要处理一些具体类型的文件,如CSV, Excel, HTML,直接使用前面几节介绍的方式来处理一般是很不方便的,往往有一些第三方的类库,基于之前介绍的技术,提供了更为方便易用的接口...开头的行会被视为注释,进行忽略 不过,使用Properties也有限制,它不能直接处理中文,配置文件,所有ASCII字符需要使用Unicode编码,比如,不能在配置文件中直接这么写: name=老马...压缩文件 压缩文件有多种格式,Java SDK支持两种:gzip和zip,gzip只能压缩一个文件,而zip文件可以包含多个文件。.../ 先来看gzip,有两个主要的类: java.util.zip.GZIPOutputStream java.util.zip.GZIPInputStream 它们分别是OutputStream和InputStream...= null) { in.close(); } } } zip文件支持一个压缩文件包含多个文件,Java SDK主要的类是: java.util.zip.ZipOutputStream

1.8K80

FTP协议的数据传输模型和相关命令说明

流模式其实就是简单的将要传输的数据比特以一种连续的结构化的方式TCP协议的帮助下发送给对方,这里它就是一段数据,不存在包头或字段这类有关数据组织结构的信息。...压缩模式由于实现的复杂性,FTP协议很少使用,除非在特定网络条件下需要尽可能减少数据传输量保证效率和准确性时,该模式才会被采用。...我们在实践只考虑情况一和三,对于情况一,协议要负责把文件结尾的符号根据系统进行修改,情况二的图像文件不仅仅包括图像,像zip文件这类有同一格式的文件都属于图像。...传输ASCII文件时,发送方每读取一行内容后就在后面添加字符CR+LF,接收方读取到这两个字符组合后知道这是一行结束,然后根据当前所在系统修改,如果接收方是Mac系统,那么就将这两个字符改为CR。...由于FTP会对传输数据进行修改,因此传输一定不能把”图像“类型的文件设置成ASCII类型,要不然”图像“类型文件的二进制字符被修改后接收方就无法打开文件。

1.9K11

Python代码解压的中文文件名是乱码,怎么解决?

一、前言 前几天Python白银交流群【fashjon】问了一个Python自动化办公的问题,问题如下: import zipfile def unzip_file(zip_file_path, output_folder_path...过了几分钟,【瑜亮老师】补充道:@fashjon 我查看了一下zipfile的源码,发现是使用了'cp437'编码了文件名才导致的文件名错误。...既然知道了错误的编码,那么方法就很简单了,1修改源码,2自己写代码读取解压缩路径文件名,重新使用'cp437'编码然后用gbk解码,重命名文件名,问题解决。...# 如果文件名包含ASCII字符 true_name = bad_name.encode('cp437').decode(encoding)...代码只不过方便遍历多层文件夹目录,如果都在一个文件夹,还不如右键点选更方便。 如果你也有类似这种Python相关的小问题,欢迎随时来交流群学习交流哦,有问必答!

9110

URL解码之URLEncoder

然而,向服务器发送大量的文本、包含ASCII字符的文本或二进制数据时这种编码方式效率很低。...大多数操作系统不会认为文件名中含有符号“#”会有什么特殊含义;但是一个URL,符号“#”表示该文件名已经结束,后面会紧跟一个 fragment(部分)标识符。...这就明确地回答了为什么java1.4这种方法被抛弃了,转而投向了要求自己指定编码形式的这种方法。...需要注意的是这些代码应该以其他编码形式被保存而不是以ASCII码的形式,还有就是你选择的编码形式应该作为一个参数传给编译器,让编译器能据此对源代码ASCII字符作出正确的解释。...第二种解码方法java1.4和更新的版本中使用。如果你拿不定主意用哪种编码方式,那就选择UTF-8吧。它比其他任何的编码形式更有可能得到正确的结果。

1.8K20

IIS服务命令

-d 使用调试方式。 -n 限制ftp的自动登录,即不使用.netrc文件。 -g 取消全局文件名。 help [命令] 或 ?...pwd 列出当前远端主机目录 put 或 send 本地文件名 [上传到主机上的文件名] 将本地一个文件传送至远端主机 get 或 recv [远程主机文件名] [下载到本地后的文件名] 从远端主机传送至本地主机....如果有本地文件,就将结果写至本地文件 ascii 设定ASCII方式传送文件(缺省值) bin 或 image 设定二进制方式传送文件 bell 每完成一次文件传送,报警提示 cdup 返回上一级目录...] 删除一批文件 mkdir directory-name 远端主机建立目录 rename [from] [to] 改变远端主机文件名 rmdir directory-name 删除远端主机的目录...本地机执行交互shell,exit回到ftp环境,如!ls*.zip

2.7K10

Python文件处理(IO 技术)

mode: 打开文件的模式,常用的模式包括: ‘r’: 只读方式打开文件(默认)。 ‘w’: 写入方式打开文件,会覆盖已存在的文件。...这样就能够实现不同语言、不同文化背景的字符计算机系统的互通和共享。 Unicode采用不同的编码方式来表示这些码点,常见的编码方式有UTF-8、UTF-16和UTF-32等。...对于ASCII码的字符,UTF-8使用1个字节来表示,因此存储英文文本时,UTF-8和ASCII码是兼容的。...这样可以节省存储空间,并且方便了Unicode字符不同系统之间的传输和处理。 兼容ASCII码:对于ASCII码的字符,UTF-8使用1个字节来表示。...GBK编码兼容ASCII码,即对于ASCII字符,使用单字节表示,与标准的ASCII编码一致。而对于中文字符和其他ASCII字符,使用双字节表示。

10910

Gradle 进阶学习之 文件操作

1、本地文件 Gradle ,Project.file(java.lang.Object) 方法是一个非常有用的工具,它允许你一种类型安全的方式引用文件。...1.5 总结 Project.file 方法是 Gradle 处理文件和目录的便捷方式,它结合了 Groovy 的简洁性和 Java File 类的功能,使得文件操作更加直观和易于管理。...4、文件拷贝 Gradle ,Copy 任务是用来拷贝文件和目录的。它非常灵活,允许你指定要拷贝的文件、目标目录,并且可以通过各种方式来修改拷贝行为,比如过滤、重命名文件等。...4.2 拷贝时的过滤和重命名 过滤条件:可以使用 include 和 exclude 方法来添加过滤条件,包含或排除特定的文件。...5、归档文件 Gradle ,处理归档文件是一项常见的任务,特别是当你需要将项目打包成 WAR、ZIP、TAR 等格式以便于发布或部署时。

8310

Linux文件归档,压缩与解压缩

; -L:将压缩文件的全部文件名改为小写; -M:将输出结果送到more程序处理; -n:解压缩时不要覆盖原有的文件; -o:不必先询问用户,unzip执行后覆盖原有的文件; -P:使用zip...建议的压缩的时候标明后缀 参数 作用 命名方式 -z 用于gzip压缩方式 文件名.tar.gz或文件名.tgz -j...用于bzip2压缩方式 文件名.tar.bz2 -J 用于xz压缩方式 文件名.tar.xz 参考: https://blog.csdn.net...-C #指定目录解开归档文件archive.tar的所有文件,并添加v选项,可显示解包的文件内容 tar -xvf archive.tar -C /tmp image-20200415142442904...-C /tmp 新版本tar可自动识别压缩文件格式,故可以不用添加-z参数,下面的.tar.xz和.tar.bz2处理方式相同。

9.4K40
领券