1.内存映射文件读取
当要读取的文件内容太大时,使用内存映射文件来读取,性能就会很好,因为它是通过抽取文件内容的一部分映射到内存中,就可以在java里做逻辑处理了。
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
pulbic class MemoryMappedFile{
//十六进制,128MB大小
static int length = 0x8FFFFFF;
public static void main(String[] args)throws Exception{
//通过文件通道将文件映射为内存中的自己缓冲区
MappedByteBuffer out = new RandomAccessFile(“test.dat”, “rw”).getChannel()
.map(FileChannel.MapMode.READ_WRITE, 0, length);
for(int i = 0; i < length; i++){
out.put((byte)’x’);
}
System.out.println(“Finished writing”);
for(int I = length/2; i < length/2 + 6; i++){
System.out.println((char)out.get(i));
}
}
}
MappedByteBuffer是一个特殊的直接缓冲器,我们要用的话必须指定映射文件的初始位置和映射区域的长度,去拿到这位置的内容。
这里使用RandomAccessFile类实现以下三种模式将文件区域映射到内存中:
(1).只读:视图修改得到的缓冲区将导致抛出ReadOnlyBufferException。
(2).读/写:对得到的缓冲区的更改将最终传播到文件,该更改对映射到同一文件的其他程序不一定是可见的。
(3).专用:对的到的缓冲区更改将不会被传播到文件,并且该更改对映射到同一文件的其他程序也是不可见的,相反,会创建缓冲区已修改部分的专用副本。
注意:映射关系一经创建,就不再依赖于创建它时所用的文件通道,特别是关闭该通道对映射关系的有效性没有任何影响。另外,从性能观点来讲,通常相对较大的文件映射到内存中才是值得的。
2.文件加锁
当前线程如果给文件加锁,其它线程就会无法读取该文件(只限JVM中),这样就能保证资源同步,做到数据安全。
import java.nio.channels.*;
import java.util.concurrent.*;
import java.io.*;
public class FileLocking{
public static void main(String[] args)throws Exception{
FileOutputStream fos = new FileOutputStream(“file.txt”);
//试图对文件通道的文件锁定
FileLock fl = fos.getChannel().tryLock();
//文件锁定成功
if(fl != null){
System.out.println(“Locked File”);
TimeUnit.MILLISECONDS.sleep(100);
//释放文件锁
fl.release();
System.out.println(“Released Lock”);
}
foc.close();
}
}
输出结果:
Locked File
Released Lock
文件通道的tryLock()方法尝试获取对此通道的文件给定区域的锁定,是个非阻塞方法,无论是否已成功获得请求区域的锁定,调用总是立即返回。如果由于另一个程序保持这一个重叠锁而无法锁定,则此方法返回null.
文件锁定方法:
(1).FileLock tryLock():
尝试获取对此通道文件的独占锁定。
(2).FileLock tryLock(long position, long size, Boolean shared):
尝试获取对此通道文件给定区域的锁定。
(3).FileLock lock():
获取此通道的文件的独占锁定。
(4).FileLock lock(long position, long size, Boolean shared):
获取此通道的文件的给定区域锁定。
文件锁定方法是共享锁还是排斥锁取决于底层操作系统,可以使用FileLock.isShared()方法判断使用的是何种类型的文件锁。
锁定文件部分区域并修改 案例:
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class LockingMappedFiles {
static final int LENGTH = 0x8FFFFFF; // 128 MB
static FileChannel fc;
public static void main(String[] args) throws Exception {
fc = new RandomAccessFile("test.dat", "rw").getChannel();
MappedByteBuffer out = fc
.map(FileChannel.MapMode.READ_WRITE, 0, LENGTH);
for (int i = 0; i < LENGTH; i++)
out.put((byte) 'x');
new LockAndModify(out, 0, 0 + LENGTH / 3);
new LockAndModify(out, LENGTH / 2, LENGTH / 2 + LENGTH / 4);
}
private static class LockAndModify extends Thread {
private ByteBuffer buff;
private int start, end;
LockAndModify(ByteBuffer mbb, int start, int end) {
this.start = start;
this.end = end;
mbb.limit(end);
mbb.position(start);
buff = mbb.slice();
start();
}
public void run() {
try {
// 锁定文件部分区域
FileLock fl = fc.lock(start, end, false);
System.out.println("Locked: " + start + " to " + end);
int i = 0;
// 修改改区域内容
while (buff.position() < buff.limit() - 1){
buff.put((byte) (buff.get() + 1));
if(i++<5)
System.out.print(buff.get(buff.position()-1)+" ");
}
System.out.println();
fl.release();
System.out.println("Released: " + start + " to " + end);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
3.压缩/解压缩:
Java I/O类库中提供了一些关于压缩和加压的类,由于压缩和解压缩算法是针对字节数据进行操作的,因此javaI/O中关于压缩和加压素的类是继承自InputStream和OutputStream字节流体系。
Java压缩和解压的相关类在java.util.zip包下,具体的类如下:
(1).CheckedInputStream:
需要维护所读取数据校验和的输入流,校验和可用于验证输入数据的完整性。
(2).CheckedOutputStream:
需要维护所写入数据校验和的输出流。
(3).Deflater:
使用流行的”ZLIB”压缩程序库为通用压缩提供支持。
(4).Inflater:
使用流行的”ZLIB”压缩程序库为通用解压缩提供支持。
(5).DeflaterInputStream:
为压缩“deflate“格式压缩数据实现输入流过滤器。
(6).DeflaterOutputStream:
为压缩 “deflate“格式压缩数据实现输出流过滤器,它还用作其他类型的压缩过滤器(如GZIPOutputStream)的基础。
(7).InflaterInputStream:
为解压缩”deflate”压缩格式的数据实现输入流过滤器,它还用作其他解压缩过滤器(如GZIPInputStream)的基础。
(8).InfaterOutputStream:
为解压缩“deflate”压缩格式存储数据实现输出流过滤器。
(9).ZipOutputStream:
为以”zip”文件格式写入文件实现输出流过滤器,包括对已压缩和未压缩条目的支持。
(10).ZipInputStream:
为读取以”zip”文件格式的文件实现输入流过滤器,包括对已压缩和未压缩条目的支持。
(11).GZIPOutputStram:
为使用“GZIP“文件格式写入压缩数据实现输出流过滤器。
(12).GZIPInputStram:
为读取“GZIP“文件格式的压缩数据实现输入流过滤器。
GZIP对单个文件的压缩和提取 例子:
import java.util.zip.*;
import java.io.*;
public class GZIPCompress{
public static void main(String[] args)throws IOException{
BufferedReader in = new BufferedReader(new FileReader(“test.dat”));
BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(
new FileOutputStream(“test.gz”)));
int c;
//写GZIP格式压缩文件
while((c = in.read()) != -1){
out.write(c);
}
in.close();
out.close();
BufferedReader in2 = new BufferedReader(new InputStreamReader(
new GZIPInputStream(new FileInputStream(“test.gz”))));
String s;
//读取GZIP格式压缩文件
while((s = in2.readLine()) != null){
System.out.println(s);
}
in2.close();
}
}
4.使用zip I/O 对多文件压缩:
zip格式的压缩文件是最常用的压缩方式,使用zip多文件压缩时,可以将多个文件压缩在一个压缩包中,同时还可以从一个包含多个文件的压缩包中读取所有的压缩文件。使用zip进行多文件压缩时,一般要使用CheckSum类计算校验和,校验和的计算有两种算法:
(1).Adler32:速度比较快。
(2).CRC32:速度比较慢,但是更精确。
使用zip多文件压缩的例子如下:
import java.util.zip.*;
import java.io.*;
import java.util.*;
public class ZipCompress{
public static void main(String[] args)throws Exception{
FileOutputStream f = new FileOutputStream(“test.zip”);
//使用Adler32算法为文件输入流产生输出校验和文件
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
ZipOutputStream zos = new ZipOutputStream(csum);
BufferedOutputStream out = new BufferedOutputStream(zos);
//设置zip文件注释
zos.setComment(“A test of java zipping”);
//向zip压缩文件写入多个文件
for(String arg : args){
System.out.println(“Writing file:” + arg);
BufferedReader in = new BufferedReader(new FileReader(arg));
//写入一个zip文件条目,并将流定位到条目数据的开始处
zos.putNextEntry(new ZipEntry(arg));
int c;
//写入zip文件内容
while((c = in.read()) != -1){
out.write(c);
}
in.close();
out.flush();
}
out.close();
//文件关闭后获取校验和
System.out.println(“Checksum:” + csum.getChecksum().getValue());
FileInputStream fi = new FileInputStream(“test.zip”);
//使用Adler32算法为输入文件流产生输入校验和文件流
CheckedInputStream csumi = new CheckedInputStream(fi, new Adler32());
ZipInputStream in2 = new ZipInputStream(csumi);
BufferedInputStream bis = new BufferedInputStream(in2);
ZipEntry ze;
//读取zip文件条目
While((ze = in2.getNextEntry()) != null){
System.out.println(“Reading file:” + ze);
int x;
//读取zip文件条目内容
while((x = bis.read()) != -1){
System.out.println(x);
}
}
if(args.length == 1){
System.out.println(“Checksum:” + csumi.getChecksum().getValue());
}
bis.close();
//另一种读取zip文件的方法
ZipFile zf = new ZipFile(“test.zip”);
//获取zip文件的条目
Enumeration e = zf.entries();
while(e.hasMoreElements()){
ZipEntry ze2 = (ZipEntry)e.nextElement();
System.out.println(“Reading File:” + ze2);
}
}
}
相关推荐
### Java编程思想读书笔记 #### 一、Java与C++的区别及内存管理 在学习Java的过程中,我们常常会拿它与C++进行比较。这两门语言虽然有着相似之处,但也有许多不同点。 1. **内存管理:** - C++提供了更为底层的...
《Java编程思想笔记》是基于 Bruce Eckel 的经典著作 "Thinking in Java" 所做的学习总结,这本书深入浅出地介绍了Java语言的核心概念和技术。在本文中,我们将围绕Java编程的一些关键知识点进行深入探讨,包括但不...
在讨论Java编程思想学习笔记时,首先需要了解的是Java语言的平台无关性,而这一特性正是通过Java虚拟机(JVM)得以实现的。JVM作为Java程序设计的关键组成部分,对于Java开发人员来说是必须掌握的基础知识。在该学习...
### Java编程思想笔记知识点概述 #### 第 1 章 对象导论 在这一章节中,主要介绍...以上内容概括了《Java编程思想笔记》中的核心知识点,涵盖了Java语言的基础到高级特性,适合初学者和有一定经验的开发者参考学习。
《Java编程思想》是 Bruce Eckel 的经典之作,这本书深入浅出地介绍了Java语言的核心概念和技术,对于初学者和有经验的程序员来说都是极好的学习资源。以下是对书中的主要知识点进行的详细解读: 1. **Java语言基础...
面向对象编程思想是Java的灵魂,它使得代码更易于理解和维护。 接着,文件I/O、异常处理和集合框架也是Java的重要部分。这部分笔记可能涉及File类、IOException、try-catch-finally语句以及ArrayList、LinkedList、...
此外,文件输入/输出(I/O)操作也是Java编程中不可或缺的一部分。笔记会教授如何使用InputStream和OutputStream类进行基本的文件读写,以及高级的FileReader/Writer、BufferedReader/Writer等类,以提高效率和灵活性...
总的来说,这个JAVA学习笔记集是一个全面的学习资源,可以帮助初学者逐步建立起扎实的JAVA基础,理解并掌握编程思想、多线程、网络编程以及高效I/O操作等核心技能。通过深入学习和实践这些内容,读者将能够更好地...
《王者归来之经典-Java编程思想读书笔记》会介绍如何有效地使用异常处理机制,防止程序因未预期的错误而崩溃。 函数和方法是代码复用的关键。Java支持方法重载和重写,这使得代码更加灵活且易于维护。书中会详细...
在Java的高级部分,笔记可能涵盖了异常处理、集合框架(如ArrayList、LinkedList、HashMap等)、I/O流、线程、反射、注解、枚举等。这些主题在实际开发中经常使用,对于提高代码质量和效率有很大帮助。 接下来,...
这份笔记的PDF版本详细讲解了Java的基础概念、进阶特性和实战应用,旨在帮助读者全面理解和掌握Java编程。 一、Java基础 Java基础部分包括了Java环境的搭建、基本语法、数据类型、控制结构(如if语句、switch语句、...
Java编程语言是当今软件开发领域中的重要工具,尤其在企业级应用、服务器端开发以及大数据处理等方面占据着主导地位。"java黑马笔记"很可能是针对初学者或进阶者的一份详细教程,涵盖了Java的基础知识到高级特性。...
### Java私塾学习笔记整理 #### 第一章:Java入门 ...以上内容涵盖了Java基础知识的重要方面,从语言基础到高级特性,以及常见的开发技术和工具,帮助读者全面了解Java编程的基础知识和技术要点。
在IT领域,特别是Java编程的学习过程中,"JAVA夜未眠,thinkingJAVA和学习笔记"这一主题涵盖了许多核心概念和实践技巧。以下是对这些资源的详细解释: 首先,"Java夜未眠"可能指的是一个深入探讨Java编程的书籍或...
第十四章 标准I/O流与文件.............84 第十五章 网络编程.89 Tiger学习笔记..................94 第一章 Java5.0新特性.......................94 第二章 基础知识.....96 第三章 泛型...........101 第四章 ...
为了开发软件,需要选择合适的计算机语言、开发工具以及编程思想。计算机语言主要分为三类:机器语言、汇编语言和高级语言。高级语言是面向用户的编程语言,它更接近人类自然语言,易于理解和编写。常见的高级语言有...
【Java SE课程笔记详解】 Java SE(Standard Edition)是Java平台的核心版本,它为开发桌面应用、服务器端...通过深入学习和实践,你可以扎实掌握Java编程基础,为进一步深入学习Java EE或Android开发打下坚实的基础。
这份"JAVA学习笔记.zip"压缩包文件显然包含了关于Java编程的详细资料,可能是笔记、教程或者示例代码,旨在帮助学习者掌握Java的基础知识和高级特性。 首先,让我们从基础开始。Java的基础包括语法结构、数据类型、...
- 类库:Java提供了丰富的标准类库,如集合框架、I/O流、网络编程、多线程等,这些是开发中常用的工具。 4. **开发环境**: - IDE(Integrated Development Environment):如Eclipse、NetBeans、IntelliJ IDEA等...