executor.java
来自「java调用ie浏览器demo源码,可以用在windows或者linux」· Java 代码 · 共 404 行
JAVA
404 行
/*
* Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. Use is
* subject to license terms.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the Lesser GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*/
package org.jdic.arc;
import java.io.*;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* The class is responsible for archive operatrions from commantd line.
* @author uta
*/
public class Executor {
/**
* Class can not be instantiated.
*/
private Executor() {}
/**
* Prints help information to console.
*/
static void PrintHelp()
{
System.out.println(
"\nUsage: cab <a|x> [<switches>...] <CabFile> <FilesParams>\n" +
" a: encode file\n" +
" x: decode file\n" +
"<Switches>\n" +
" pack:\n" +
" -r: pack recursively\n" +
" -a<NONE|MSZIP|LHZA>: just store or pack by MSZIP or LZX\n" +
" -l<0-9>: 0-fastest, 9-strongest\n" +
" -Ext: store CRC and Compressed Size in file name\n" +
" pack & unpack:\n" +
" -h<M|D>: M - use memory buffers, D - use temp files\n" +
"<CabFile>\n" +
" archive file name for coding or encoding\n" +
"<FilesParams>\n" +
" files/folders for compression or folder for decompession\n"
);
}
/**
* Standard streams copy routine.
* @param in the source stream
* @param out the destination stream
* @throws java.io.IOException
*/
public static void copyStream(
InputStream in,
OutputStream out) throws IOException
{
byte[] buffer = new byte[1024];
int read = 0;
while((read = in.read(buffer, 0, buffer.length)) != -1) {
out.write(buffer, 0, read);
}
}
/**
* Reports staff information about <code>ZipEntry</code> to console.
* @param ze the report subject
*/
public static void dumpEntry(ZipEntry ze)
{
String resume = null;
long size = ze.getSize();
long csize = ze.getCompressedSize();
if(0==size){
resume = " (stored 0%)";
} else {
resume = " (deflated " + ( (size - csize)*100/size ) + "%";
if(size < csize) {
resume += " - ok for stream compression";
}
resume += ")";
}
System.out.println(
"added: " + ze +
" original: " + ze.getSize() +
" compressed: " + ze.getCompressedSize() +
//" time: " + new java.util.Date(ze.getTime() +
resume );
}
/**
* Copies archived content from source stream
* to destination.
*
* @param prefix contains the parent folder name
* @param in the archived source stream
* @param out the archived destination stream
* @throws java.io.IOException
*/
public static void repackStream(
String prefix,
ZipInputStream in,
ZipOutputStream out) throws IOException
{
ZipEntry entry = in.getNextEntry();
while(entry != null) {
// It is expensive to create new ZipEntry objects
// when compared to cloning the existing entry.
// We need to reset the compression size, since we
// are changing the compression ratio of the entry.
ZipEntry outEntry = new ZipEntry(entry.toString());
outEntry.setTime(entry.getTime());
ZipEntryAccessor.setMethod(outEntry, -1);
ZipEntryAccessor.setName(outEntry, prefix + outEntry.toString());
out.putNextEntry(outEntry);
copyStream(in, out);
//needs to update outEntry fields
out.closeEntry();
dumpEntry(outEntry);
entry = in.getNextEntry();
}
}
/**
* Copies a content from source file(s) to archived destination stream.
* @param inf the source file to be compressed
* @param out the archived destination stream
* @param bRecursive the recursive execution property for folder operation
* @throws java.io.IOException
*/
public static void repackFile(
File inf,
ZipOutputStream out,
boolean bRecursive) throws IOException
{
String stEN = null;
if( inf.isAbsolute() ){
stEN = inf.getName();
} else {
stEN = inf.getPath();
}
if(inf.isDirectory() && !stEN.endsWith( File.separator )){
stEN += File.separator;
}
ZipEntry outEntry = new ZipEntry(stEN);
outEntry.setTime(inf.lastModified());
ZipEntryAccessor.setMethod(outEntry, -1);
out.putNextEntry(outEntry);
if( inf.isFile() ){
FileInputStream in = null;
try{
in = new FileInputStream(inf);
copyStream(in, out);
//needs to update outEntry fields
out.closeEntry();
dumpEntry(outEntry);
} finally {
if(null!=in){
in.close();
}
}
} else {
//needs to update outEntry fields
out.closeEntry();
dumpEntry(outEntry);
if(bRecursive){
File cnt[] = inf.listFiles();
for( File i: cnt ){
repackFile(
i,
out,
bRecursive);
}
}
}
}
/**
* Command line excecutor for packing operations.
* @param args the command line arguments.
* @return <code>false</code> on error, <code>true</code> in other cases
* @throws java.io.IOException
*/
public static boolean pack(String[] args) throws IOException
{
int iMethod = NativePackedOutputStream.METHOD_LZX;
int iLevel = 9;
int iHint = 0;
boolean bRecursive = false;
int i;
for(i = 1; i < args.length; ++i){
String s = args[i];
if(s.length() == 0)
return false;
if( !s.startsWith("-") ){
//end of switch section
break;
}
s.toLowerCase();
if( s.equalsIgnoreCase("-r") ){
bRecursive = true;
} else if( s.equalsIgnoreCase("-anone") ){
iMethod = NativePackedOutputStream.METHOD_NONE;
} else if( s.equalsIgnoreCase("-amszip") ){
iMethod = NativePackedOutputStream.METHOD_MSZIP;
} else if( s.equalsIgnoreCase("-alzh") ){
iMethod = NativePackedOutputStream.METHOD_LZX;
} else if( s.startsWith("-l") && 3==s.length()){
iLevel = s.charAt(2) - '0';
} else if( s.equalsIgnoreCase("-hM")){
iHint |= NativePackedOutputStream.HINT_IN_MEMORY;
} else if( s.equalsIgnoreCase("-hD")){
iHint |= NativePackedOutputStream.HINT_ON_DISK;
} else if( s.equalsIgnoreCase("-Ext")){
iHint |= NativePackedOutputStream.HINT_SORE_EINFO;
} else {
System.err.println("Errror: Unknown switch " + s);
return false;
}
}
if(i==args.length){
System.err.println("Errror: Unknown CAB name ");
return false;
}
if( (i+1)==args.length ){
System.err.println("Errror: Unknown compression list");
return false;
}
File of = new File(args[i]);
of.delete();
NativePackedOutputStream out = new NativePackedOutputStream(
new FileOutputStream(of), NativePackedOutputStream.FORMAT_CAB, iHint );
out.setLevel(iLevel);
out.setMethod(iMethod);
InputStream in = null;
boolean bDelOut = true;
try {
for(++i; i < args.length; ++i){
File inf = new File(args[i]);
if(
args[i].endsWith(".zip") ||
args[i].endsWith(".jar") ||
args[i].endsWith(".cab")
){
in = new FileInputStream(inf);
in = args[i].endsWith(".cab")
? new NativePackedInputStream(
in,
NativePackedInputStream.FORMAT_CAB )
: new ZipInputStream( in );
System.out.println(args[i] + " archive repack");
File pf = inf.getParentFile();
repackStream(
(null==pf || inf.isAbsolute())
? ""
: pf.getPath() + File.separatorChar,
(ZipInputStream)in,
out);
in.close();
in = null;
} else {
repackFile(inf, out, bRecursive);
}
}
bDelOut = false;
} catch( Exception e ){
e.printStackTrace();
} finally {
if(null!=in){
in.close();
}
out.close();
if(bDelOut){
of.delete();
}
}
return true;
}
/**
* Command line excecutor for unpacking operations.
* @param args the command line arguments.
* @return <code>false</code> on error, <code>true</code> in other cases
* @throws java.io.IOException
*/
public static boolean unpack(String[] args) throws Exception
{
int iHint = 0;
boolean bRecursive = false;
int i;
for(i = 1; i < args.length; ++i){
String s = args[i];
if(s.length() == 0)
return false;
if( !s.startsWith("-") ){
//end of switch section
break;
}
s.toLowerCase();
if( s.equalsIgnoreCase("-hM")){
iHint |= NativePackedOutputStream.HINT_IN_MEMORY;
} else if( s.equalsIgnoreCase("-hD")){
iHint |= NativePackedOutputStream.HINT_ON_DISK;
} else {
System.err.println("Errror: Unknown switch " + s);
return false;
}
}
if(i==args.length){
System.err.println("Errror: Unknown CAB name ");
return false;
}
File inf = new File(args[i]);
++i;
File outDir = new File(
i==args.length
? "."
: args[i]);
outDir.mkdirs();
NativePackedInputStream in = new NativePackedInputStream(
new FileInputStream(inf), NativePackedOutputStream.FORMAT_CAB, iHint );
OutputStream out = null;
try{
for(
ZipEntry ze = in.getNextEntry();
null != ze;
ze = in.getNextEntry())
{
System.out.println(
"extracted: " + ze +
" original size: " + ze.getSize() +
" time: " + new java.util.Date(ze.getTime())
);
File outf = new File(outDir.getPath() + File.separator + ze);
if( !ze.isDirectory() ){
outf.delete();
outf.getParentFile().mkdirs();
out = new FileOutputStream(outf);
copyStream(in, out);
out.close();
out = null;
} else {
outf.mkdirs();
}
}
} catch( Exception e ){
e.printStackTrace();
} finally {
in.close();
if( null!=out ){
out.close();
}
}
return true;
}
/**
* Module entry point. Command line excecutor for packing/unpacking operations.
* @param args the command line arguments. In case of empty argument list
* the help is printing to console.
* @throws java.lang.Exception
*/
public static void main(String[] args) throws Exception
{
do{
if(args.length > 1 ){
if(args[0].equalsIgnoreCase("a")){
if( pack(args) ){
break;
}
} if(args[0].equalsIgnoreCase("x")){
if( unpack(args) ){
break;
}
}
}
PrintHelp();
}while(false);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?