标签:抽象 ring charset 支持 long string 类库 oid 时间
程序的主要任务是操纵数据。在Java中,把一组有序的数据序列称为流。根据操作的方向,可以把流分为输入流和输出流两种。程序从输入流读取数据,向输出流写出数据。
文件 输入流 输出流 文件
内存 -------------> Java程序 ------------------> 内存
键盘 控制台
| |
数据源 数据目的地
Java I/O系统负责处理程序的输入和输出,I/O类库位于java.io包中,它对各种常见的输入流和输出流进行了抽象。
如果数据流中最小的数据单元是字节,那么称这种流为字节流;如果数据流中最小的数据单元是字符,那么称这种流为字符流。
在java.io包中,java.io.InputStream表示字节输入流,java.io.OutputStream表示字节输出流,它们都是抽象类,不能被实例化。
InputStream类提供了一系列和读取数据有关的方法:
read(): 从输入流读取数据:有三种重载形式:
以上第一个read方法从输入流读取一个字节,而其余两个read方法从输入流批量读取若干字节。在从文件或键盘读数据时,采用后面两个read方法可以减少进行物理读文件或键盘的次数,因此能提高I/O操作的效率。
void close(): 关闭输入流,InputStream类本身的close()方法不执行任何操作。它的一些子类覆盖了close()方法,在close()方法中释放和流有关的系统资源。
OuputStream类提供了一系列和写数据有关的方法:
write(): 向输出流写入数据:有三种重载形式:
以上第一个write方法从输出流写入一个字节,而其余两个write方法从输出流批量写出若干字节。在向文件或控制台写数据时,采用后面两个write方法可以减少进行物理读文件或键盘的次数,因此能提高I/O操作的效率。
void close(): 关闭输出流,OutputStream类本身的close()方法不执行任何操作。它的一些子类覆盖了close()方法,在close()方法中释放和流有关的系统资源。
void flush(): OutputStream类本身的flush()方法不执行任何操作,它的一些带有缓冲区的子类(比如BufferedOutputStream和PrintStream类)覆盖了flush()方法。通过带缓冲区的输出流写数据时,数据先保存在缓冲区中,积累到一定程度才会真正写到输出流中。缓冲区通常用字节数组实现,实际上是指一块内存空间。flush()方法强制把缓冲区内的数据写到输出流中。
in:输入流
out: 输出流
BufferedInputStream类覆盖了被过滤的输入流的读数据行为,利用缓冲区来提高读数据的效率。BufferedInputStream类先把一批数据读入到缓冲区,接下来 read()方法只需要从缓冲区内获取数据,就能减少物理性读取数据的次数。
DataInputStream 实现了DataInput接口,用于读取基本类型数据,如int, float, long, double和boolean等。
管道输入流从一个管理输出流中读取数据。通常由一个线程向管理输出流写数据,由另一个线程从管理输入流中读取数据,两个线程可以用管道来通信。
InputStream和OutputStream类处理的是字节流,也就是说,数据流中的最小单元为一个字节,它包括8个二进制位。在许多应用场合,Java应用程序需要读写文本文件。在文本文件中存放了采用特定字符编码的字符。为了便于读于各种字符编码的字符,java.io包中提供Reader/Writer类,它们分别表示字符输入流和字符输出流。
在处理字符流时,最主要的问题是进行字符编码的转换。Java语言采用Unicode字符编码。对于每一个字符,Java虚拟机会为其分配两个字节的内存。而在文本文件中,字符有可能采用其他类型的编码,比如GBK和UTF-8字符编码等。
Reader类能够将输入流中采用其他编码类型的字符转换为Unicode字符,然后在内存中为这些Unicode字符分配内存。Writer类能够把内存中的Unicode字符转换为其他编码类型的字符,再写到输出流中。
在默认情况下,Reader和Writer会在本地平台的字符编码和Unicode字符编码之间进行编码转换。
Writer的write()方法
使用Unicode字符编码的字 ------------> 使用本地平台的字符编码的字符串
符串(内存中) <------------ (数据源/数据目的地)
Reader的read()方法
如果要输入或输出采用特定类型编码的字符串,可以使用InputStreamReader类和OutputStreamWriter类。在它们的构造方法中可以指定输入流或输出流的字符编码。
OutputStreamWriter的write()方法
使用Unicode字符编码的字 ---------------> 使用本地平台的字符编码的字符串
符串(内存中) <-------------- (数据源/数据目的地)
InputStreamReader的read()方法
由于Reader和Writer采用了字符编码转换技术,Java I/O系统能够正确地访问采用各种字符编码的文本文件,另一方面,在为字符分配内存时,虚拟机对字符统一采用Unicode字符编码,因此Java程序处理字符具有平台独立性。
InputStreamReader类把InputStream类型转换为Reader类型,构造方法:
InputStreamReader的一个子类,用于从文件中读取字符数据。该类只能按照本地平台的字符编码来读取数据,用户不能指定其他字符编码类型。
接下来的操作都从缓冲区内获取数据,避免每次都从数据源读取数据并进行字符编码转换,从而提高读操作的效率。
File类提供管理文件或目录的方法。File实例表示真实文件系统中的一个文件或者目录。
构造方法
只处理一个文件,使用第一个构造方法;如处理一个公共目录的若干子目录或文件,那么使用第二个或者第三个更方便。
普通方法
File f = new File(".\\test.txt"));
System.out.println(f.getCanonicalPath()); //c:\mypath\test.txt
System.out.println(f.getAbsolutePath()); //c:\mypath\ .\test.txt
System.out.println(f.getPath()); //.\test.txt
if(!f.exists()) f.createNewFile());
如果要创建的文件已经存在,可以选择向旧文件添加新的内容(append为true)或者新的内容覆盖旧文件的内容(append为false)。
注意:在这里写个com.briup.ch14.CopyTime.java
FileReader:new FileReader(“d:/back/string.txt”) =
new InputStreamReader(new FileInputStream(“d:/back/string.txt”));
FileWriter:new FileWriter(“d:/back/string.txt”) =
new InputStreamWriter(new FileOutputStream(“d:/back/string.txt”));
可以输出基本数据类型、对象、字符(字符数组)和字符串,但是不能输出字节流。
对象的序列化: 把对象写到一个输出流;
对象的反序列化:从一个输入流中读取一个对象;
要点:
transit 类名
表示该类不能被序列化 或者transit 字段
对象的序列化主要用于:
ObjectInputStream 和 ObjectOutputStream(对象输入和输出流,可以读写基本数据类型和对象)
Java基础(十一) Stream I/O and Files
标签:抽象 ring charset 支持 long string 类库 oid 时间
原文地址:http://blog.csdn.net/u010416101/article/details/66554481