10.新I/O
nio速度的提高来自于所使用的结构更接近于操作系统执行I/O的方式:通道和缓冲器。我们并没有直接和通道交互,只是和缓冲器交互,并把缓冲器派送到通道。通道要么从缓冲器换得数据,要么向缓冲器发送数据。
唯一直接与通道交互的缓冲器是ByteBuffer----也就是说,可以存储未加工字节的缓冲器。
旧I/O的FileInputStream、FileOutputStream和RandomAccessFile被修改用以产生FileChannel。Reader和Writer这种字符模式类不能用于产生通道,但是java.nio.channels.Channels类提供了实用方法,用以在通道中产生Reader和Writer。
可以参考:http://alicsd.iteye.com/blog/834447
内存映射文件允许我们创建和修改那些因为太大而不能放入内存的文件。有了内存映射文件,我们可以假定整个文件都放在内存中,而且可以完全把它当作非常大的数组来访问。
public class LargeMappedFiles {
static int length = 0x8FFFFFF; // 128 Mb
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.print((char)out.get(i));
}
}
注意必须指定映射文件的初始位置和映射区域的长度。
尽管“旧”的I/O流在用nio实现后性能有所提高,但是“映射文件访问”往往可以更加显著地加快速度。
文件加锁机制允许同步访问某个作文共享资源的文件。不过,竞争同一文件的两个线程可能在不同的JVM,或者一个是Java线程,另一个是操作系统中其他的某个本地线程。文件锁对其他的操作系统进程是可见的,因为Java的文件加锁直接映射到了本地操作系统的加锁工具。
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");
Thread.sleep(100);
fl.release();
System.out.println("Released Lock");
}
fos.close();
}
}
通过对FileChannel调用tryLock()或lock()就可以获得整个文件的FileLock。
tryLock()是非阻塞式的,设法获得锁,如果不能获得将直接从方法调用返回。
lock()则是阻塞式的,它要阻塞进程直至锁可以获得,或调用lock()的线程中断,或调用lock()的通道关闭。
使用FileLock.release()可以释放锁。
SocketChannel、DatagramChannel和ServerSocketChannel不需要加锁,因为他们是从单进程实体继承而来,通常不在两个进程之间共享网络socket。
锁可分为独占锁和共享锁,可以通过FileLock.isShared()进行查询。
数据库中独占锁和共享锁解释如下:
共享锁(S锁):如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
排他锁(X锁):如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
可以对映射文件的部分加锁,只能对文件通道上加锁,不能获得缓冲器上的锁。
12.对象序列化
Java的对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行;这意味着序列化机制能弥补不同操作系统之间的差异。
对象序列化是为了支持两种主要特性:Java的远程方法调用(Remote Method Invocation,RMI)和Java Beans序列化。
只要对象实现了Serializable接口(该接口仅是一个标记接口,不包括任何方法),对象的序列化处理就会非常简单。
要序列化一个对象,首先要创建某些OuputStream对象,然后将其封装在一个ObjectOutputStream对象内,这时只需要调用writeObject()即可将对象序列化,并将其发送给OutputStream。反之需要讲一个InputStream封装在ObjectInputStream内,然后调用readObject()。
对象序列化特别“聪明”的一个地方史它不仅保存了对象的“全景图”,而且能追踪对象内所包含的所有引用,并保存那些对象,接着又能对对象内的每个这样的引用进行追踪,以此类推。称为“对象网”。
可通过实现Externalizable接口----代替实现Serializable接口-----来对序列化过程进行扩展,主要添加了writeExternal()和readExternal()。
transient关键字:修饰的字段被关闭序列化,意思是“不用麻烦你保存或恢复数据-----我自己会处理的”。Externalizable对象在默认情况下不保存它们的任何字段,所以transient关键字只能和Serializable对象一起使用。
Externalizable的替代方法:
实现Serializable接口,并添加名为writeObject()和readObject()方法,必须具有准确的方法特征签名:
private void writeObject(ObjectOutputStream stream) throws IOException;
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException;
这样一旦对象被序列化或反序列化,就会自动地分别调用这两个方法,而不是默认的序列化机制。
在调用ObjectOutputStream.writeObject()时,会检查所传递的Serializable对象,看看是否实现了它自己的writeObject(),是则跳过正常的序列化过程并调用它的writeObject(),readObject()类似。在自实现的writeObject()内部可以调用defaultWriteObject()选择执行默认的writeObject()。
利用序列化可以实现对任何可Serializable对象的“深度复制”。
如果想序列化static值,必须自己动手去实现。
Preferences只能用于小的、受限的数据集合-----只能存储基本类型和字符串,并且每个字符串的存储长度不能超过8K。
分享到:
相关推荐
Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行...
### Java I/O详细笔记 #### 一、流的分类 Java I/O系统主要涉及四种基本的流分类方式:根据数据流动的方向、数据处理的类型、流处理的源以及是否使用了缓冲机制。 **1. 按数据流动方向** - **输入流(Input ...
本教程详细讲解了这些知识点,并配以代码示例和笔记,旨在帮助学习者逐步掌握Java I/O流的使用,无论你是初学者还是有一定经验的开发者,都能从中受益。通过深入学习和实践,你将能够熟练地处理各种数据输入输出场景...
笔记通常涵盖了语言的基础概念、核心特性、类与对象、内存管理、多线程、异常处理、输入/输出(I/O)系统等方面的内容。 【描述】"别下别下别下别下别下别下别下别下别下别下别下别下别下别下别下别下别下别下别下" ...
第十四章 标准I/O流与文件.............84 第十五章 网络编程.89 Tiger学习笔记..................94 第一章 Java5.0新特性.......................94 第二章 基础知识.....96 第三章 泛型...........101 第四章 ...
通过对PrintStream和PrintWriter的分析,我们可以看到,Java I/O流是一个非常复杂的系统,但是了解每个组件的作用和使用场景,可以帮助我们更好地使用Java I/O流。 在实际应用中,我们可以使用PrintStream和...
java_I\O学习笔记 主要讲的是字节流以及缓冲流的操作
文件I/O操作是任何编程语言都不可或缺的部分,Java也不例外。笔记会讲解如何在Java中读写文件,理解流的概念,以及文件的复制、追加等操作。 在面向对象高级特性的部分,笔记可能包含抽象类、接口、内部类、匿名类...
O'Reilly的《Java I/O》第二版是一本深入探讨这一主题的经典书籍,它详尽地介绍了Java IO系统的设计、工作原理以及如何有效地使用这些工具。中文翻译和学习笔记的出现,为中文读者提供了极大的便利,能够帮助他们更...
总的来说,这份"Java学习笔记PPT"是初学者和进阶者学习Java的理想资料,覆盖了语言基础、面向对象、集合框架、异常处理、I/O系统、多线程等多个方面,旨在帮助读者系统地掌握Java编程技能,并能灵活运用到实际项目中...
Java I/O操作是Java编程中不可或缺的一部分,它主要用于数据的输入和输出处理。在这个总结中,我们将深入探讨Java I/O的几个关键知识点。 首先,我们要理解I/O的基本概念。I/O,即Input/Output,指的是计算机系统与...
笔记会讲解流的分类、缓冲流、字符流与字节流的区别,以及NIO(非阻塞I/O)的相关知识。 5. **多线程**:Java支持多线程编程,使得程序能同时执行多个任务。笔记将介绍线程的创建方式、同步机制(如synchronized...
11. **Java IO/NIO**:深入理解流的分类,学习非阻塞I/O模型NIO(New Input/Output)。 12. **Java 8及更高版本新特性**:包括Lambda表达式、Stream API、Optional类、日期时间API的改进等。 这些笔记内容全面覆盖...
Java的I/O流系统用于读写数据,包括字符流和字节流。文件输入输出、网络通信和数据转换都依赖于I/O流。这部分笔记可能详细介绍了`InputStream`、`OutputStream`、`Reader`、`Writer`及其子类,以及缓冲流和转换流的...
- 文件I/O操作:使用`java.io`包,如`FileWriter`和`BufferedReader`,将笔记内容写入和读取文件。可能需要JSON或XML序列化技术来保存额外的元数据,如撤销历史。 - 文件对话框:`JFileChooser`类提供了一种让用户...
接着,文件I/O、异常处理和集合框架也是Java的重要部分。这部分笔记可能涉及File类、IOException、try-catch-finally语句以及ArrayList、LinkedList、HashMap等集合类的使用。 此外,笔记可能还会涵盖线程与并发,...
7. **输入/输出流**:Java的I/O流用于读写文件和网络数据,笔记可能涵盖了FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等基本流的使用。 8. **集合框架**:如ArrayList、LinkedList、...
【标题】"用Java语言笔记本"是一个专门为新手设计的学习项目,它模仿了Windows操作系统中的记事本功能。这个项目旨在帮助初学者理解Java编程语言的基本概念,并通过实际操作提升编程技能。 【描述】中提到的"Java...
此外,笔记还会讲解IO流和NIO(非阻塞I/O),让你掌握文件操作和网络通信的技术。 在并发编程部分,笔记会介绍线程的创建和管理,同步机制如synchronized关键字和Lock接口,以及并发工具类如ExecutorService、...