Lors de l'échange de fichiers ZIP au travail, le créateur ZIP était un utilisateur Mac et c'était Windows. Comme vous pouvez le voir à ce stade, le nom de l'entrée est ZIP avec UTF-8 sur Mac. Dans le déploiement ZIP standard de Windows, le nom de l'entrée est déformé car il est développé avec Windows-31j (Shift-JIS) dans l'environnement japonais. ~~ Je ne comprends toujours pas la signification de lutter avec les codes de caractères. ~~
C'est fini quand j'ai mis en place un logiciel libre prenant en charge UTF-8, Comme je travaille en tant que client résident, je peux le télécharger sans permission, et comme c'est un gros problème, j'ai décidé de le résoudre moi-même.
Référence: http://www.ne.jp/asahi/hishidama/home/tech/java/zip.html Il a été presque résolu sur la page de stabilité de M. Hishidama. ..
ZipDecoder.java
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipFile;
public class ZipDecoder {
private static final String ZIP_FILE = "C:\\temp\\dossier.zip";
public static void main(String[] args) {
decode(ZIP_FILE);
}
public static void decode(String strPath) {
if (strPath == null || !strPath.toLowerCase().endsWith(".zip")) {
System.out.println("Argument is not zip file.");
return;
}
Path zipFilePath = Paths.get(strPath);
String outDir = zipFilePath.toString().replace(".zip", "");
if (Files.notExists(zipFilePath)) {
System.out.println("Argument is not file path.");
return;
}
try (ZipFile zipFile = new ZipFile(zipFilePath.toFile(), Charset.forName("UTF-8"))) {
zipFile.stream().filter(entry -> !entry.isDirectory()).forEach(entry -> {
Path outName = Paths.get(outDir, entry.getName());
try {
Files.createDirectories(outName.getParent());
} catch (IOException e1) {
throw new UncheckedIOException(e1);
}
try (InputStream is = zipFile.getInputStream(entry);
BufferedOutputStream os = new BufferedOutputStream(Files.newOutputStream(outName))) {
byte[] buf = new byte[1024];
while (is.read(buf) >= 0) {
os.write(buf);
}
} catch (IOException e) {
throw new UncheckedIOException(e);
}
});
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
Puisque l'échange de fichiers ZIP est toujours en cours, je vais le recréer pour qu'il puisse être utilisé. Transmettez le nom du fichier en tant qu'argument de démarrage afin qu'il puisse être développé par glisser-déposer. Il semble que jar puisse être transformé en fichier exe en utilisant quelque chose appelé launch4j, mais comme il réside chez le client (
Référence: https://qiita.com/bugtrap/items/15864474076767a7a957
ZipDecoder.java
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.zip.ZipFile;
public class ZipDecoder {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("There are no Arguments.");
}
Arrays.asList(args).stream().forEach(ZipDecoder::decode);
}
public static void decode(String strPath) {
if (strPath == null || !strPath.toLowerCase().endsWith(".zip")) {
System.out.println("Argument is not zip file.");
return;
}
Path zipFilePath = Paths.get(strPath);
String outDir = zipFilePath.toString().replace(".zip", "");
if (Files.notExists(zipFilePath)) {
System.out.println("Argument is not file path.");
return;
}
try (ZipFile zipFile = new ZipFile(zipFilePath.toFile(), Charset.forName("UTF-8"))) {
zipFile.stream().filter(entry -> !entry.isDirectory()).forEach(entry -> {
Path outName = Paths.get(outDir, entry.getName());
try {
Files.createDirectories(outName.getParent());
} catch (IOException e1) {
throw new UncheckedIOException(e1);
}
try (InputStream is = zipFile.getInputStream(entry);
BufferedOutputStream os = new BufferedOutputStream(Files.newOutputStream(outName))) {
byte[] buf = new byte[1024];
while (is.read(buf) >= 0) {
os.write(buf);
}
} catch (IOException e) {
throw new UncheckedIOException(e);
}
});
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
call-decoder.bat
@echo off
contrôle de commande rem
where java 2> nul > nul || goto :notfound
java -jar ZipDecoder.jar %*
Echo Déploiement terminé
goto :end
:notfound
mettre la commande echo java dans PATH
goto :end
:end
pause
Sélectionnez deux fichiers zip et faites-les glisser et déposez-les dans le fichier bat
J'ai pu l'agrandir par glisser-déposer.
Vous devriez créer un fichier java dans bat, le compiler et l'utiliser, non? Alors j'ai essayé.
decord.bat
@echo off
contrôle de commande rem
where java 2> nul > nul || goto :notfound
echo import java.io.BufferedOutputStream; > ZipDecoder.java
echo import java.io.IOException; >> ZipDecoder.java
echo import java.io.InputStream; >> ZipDecoder.java
echo import java.io.UncheckedIOException; >> ZipDecoder.java
echo import java.nio.charset.Charset; >> ZipDecoder.java
echo import java.nio.file.Files; >> ZipDecoder.java
echo import java.nio.file.Path; >> ZipDecoder.java
echo import java.nio.file.Paths; >> ZipDecoder.java
echo import java.util.Arrays; >> ZipDecoder.java
echo import java.util.zip.ZipFile; >> ZipDecoder.java
echo public class ZipDecoder { >> ZipDecoder.java
echo public static void main(String[] args) { >> ZipDecoder.java
echo if (args.length == 0) { >> ZipDecoder.java
echo System.out.println("There are no Arguments."); >> ZipDecoder.java
echo } >> ZipDecoder.java
echo Arrays.asList(args).stream().forEach(ZipDecoder::decode); >> ZipDecoder.java
echo } >> ZipDecoder.java
echo public static void decode(String strPath) { >> ZipDecoder.java
echo if (strPath == null ^|^| !strPath.toLowerCase().endsWith(".zip")) { >> ZipDecoder.java
echo System.out.println("Argument is not zip file."); >> ZipDecoder.java
echo return; >> ZipDecoder.java
echo } >> ZipDecoder.java
echo Path zipFilePath = Paths.get(strPath); >> ZipDecoder.java
echo String outDir = zipFilePath.toString().replace(".zip", ""); >> ZipDecoder.java
echo if (Files.notExists(zipFilePath)) { >> ZipDecoder.java
echo System.out.println("Argument is not file path."); >> ZipDecoder.java
echo return; >> ZipDecoder.java
echo } >> ZipDecoder.java
echo try (ZipFile zipFile = new ZipFile(zipFilePath.toFile(), Charset.forName("UTF-8"))) { >> ZipDecoder.java
echo zipFile.stream().filter(entry -^> !entry.isDirectory()).forEach(entry -^> { >> ZipDecoder.java
echo Path outName = Paths.get(outDir, entry.getName()); >> ZipDecoder.java
echo try { >> ZipDecoder.java
echo Files.createDirectories(outName.getParent()); >> ZipDecoder.java
echo } catch (IOException e1) { >> ZipDecoder.java
echo throw new UncheckedIOException(e1); >> ZipDecoder.java
echo } >> ZipDecoder.java
echo try (InputStream is = zipFile.getInputStream(entry); >> ZipDecoder.java
echo BufferedOutputStream os = new BufferedOutputStream(Files.newOutputStream(outName))) { >> ZipDecoder.java
echo byte[] buf = new byte[1024]; >> ZipDecoder.java
echo while (is.read(buf) ^>= 0) { >> ZipDecoder.java
echo os.write(buf); >> ZipDecoder.java
echo } >> ZipDecoder.java
echo } catch (IOException e) { >> ZipDecoder.java
echo throw new UncheckedIOException(e); >> ZipDecoder.java
echo } >> ZipDecoder.java
echo }); >> ZipDecoder.java
echo } catch (IOException e) { >> ZipDecoder.java
echo throw new UncheckedIOException(e); >> ZipDecoder.java
echo } >> ZipDecoder.java
echo } >> ZipDecoder.java
echo } >> ZipDecoder.java
javac ZipDecoder.java
java ZipDecoder %*
del ZipDecoder.java
del ZipDecoder.class
Echo Déploiement terminé
goto :end
:notfound
mettre la commande echo java dans PATH
goto :end
:end
pause
Après avoir échappé à certains symboles, j'ai pu sortir normalement.
Faites glisser et déposez le fichier zip
J'ai pu le déployer.
Cette source peut être utilisée si le chemin est java8 ou supérieur.
Recommended Posts