Java实用工具API与经典I/O操作详解
立即解锁
发布时间: 2025-08-19 00:10:23 阅读量: 1 订阅数: 12 


深入浅出Java与Android开发
### Java实用工具API与经典I/O操作详解
#### 1. Java中的ZIP与JAR操作
在Java编程里,`java.util.zip`包和`java.util.jar`包为处理ZIP和JAR文件提供了强大的支持。
##### 1.1 ZipFile与ZipInputStream的区别
- **访问方式**:
- `ZipFile`允许通过`ZipEntry getEntry(String name)`方法随机访问ZIP条目。获取`ZipEntry`实例后,可调用`ZipEntry`的`InputStream getInputStream(ZipEntry entry)`方法获取输入流来读取条目的内容。
- `ZipInputStream`仅支持顺序访问ZIP条目。
- **缓存机制**:根据相关文章,`ZipFile`内部会缓存ZIP条目以提升性能,而`ZipInputStream`不会缓存条目。
此外,`ZipFile`的构造函数有一个`int`类型的`mode`参数,可传入`ZipFile.OPEN_READ`或`ZipFile.OPEN_READ | ZipFile.OPEN_DELETE`。后者会在文件打开和关闭之间的某个时间删除底层文件,这一功能是Java 1.3引入的,用于解决长期运行的服务器应用程序或远程方法调用中下载JAR文件的缓存问题。
##### 1.2 JAR API的探索
`java.util.jar`包提供了处理JAR文件的类。由于JAR文件是一种特殊的ZIP文件,该包中的类很多是`java.util.zip`对应类的扩展,例如`java.util.jar.JarEntry`继承自`java.util.zip.ZipEntry`。同时,该包也有一些`java.util.zip`没有的类,如`Manifest`,可用于处理JAR文件的清单。
以下是创建可运行JAR文件的示例代码:
```java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
public class MakeRunnableJAR
{
public static void main(String[] args) throws IOException
{
if (args.length < 2)
{
System.err.println("usage: java MakeRunnableJAR JARfile " +
"classfile1 classfile2 ...");
return;
}
JarOutputStream jos = null;
try
{
Manifest mf = new Manifest();
Attributes attr = mf.getMainAttributes();
attr.put(Attributes.Name.MANIFEST_VERSION, "1.0");
attr.put(Attributes.Name.MAIN_CLASS,
args[1].substring(0, args[1].indexOf('.')));
jos = new JarOutputStream(new FileOutputStream(args[0]), mf);
byte[] buf = new byte[1024];
for (String filename: args)
{
if (filename.equals(args[0]))
continue;
FileInputStream fis = null;
try
{
fis = new FileInputStream(filename);
jos.putNextEntry(new JarEntry(filename));
int len;
while ((len = fis.read(buf)) > 0)
jos.write(buf, 0, len);
}
catch (IOException ioe)
{
System.err.println("I/O error: " + ioe.getMessage());
}
finally
{
if (fis != null)
try
{
fis.close();
}
catch (IOException ioe)
{
assert false; // shouldn't happen in this context
}
}
jos.closeEntry();
}
}
catch (IOException ioe)
{
System.err.println("I/O error: " + ioe.getMessage());
}
finally
{
if (jos != null)
try
{
jos.close();
}
catch (IOException ioe)
{
assert false; // shouldn't happen in this context
}
}
}
}
```
上述代码的关键部分是创建JAR文件的清单。清单是一个名为`MANIFEST.MF`的特殊文件,存于JAR文件的`META-INF`目录中,用于存储JAR文件内容的相关信息。例如,对于包含`Hello`应用类的可执行`hello.jar`文件,其清单内容如下:
```plaintext
Manifest-Version: 1.0
Main-Class: Hello
```
需要注意的是,在`Main-Class: Hello`后必须插入一个空行,否则运行应用程序时会出现“no main manifest attribute, in hello.jar”错误。
##### 1.3 运行可执行JAR文件的步骤
- 编写一个包含`public static void main(String[] args)`方法的类,如`Hello`类:
```java
public class Hello
{
publ
```
0
0
复制全文
相关推荐










