1. 什么是 IO
Java 中 I / O 操作次要是指应用 Java 进行输出,输入操作. Java 所有的 I / O 机制都是基于数据流进行输入输出,这些数据流示意了字符或者字节数据的流动序列。Java 的 I / O 流提供了读写数据的规范办法。任何 Java 中示意数据源的对象都会提供以数据流的形式读写它的数据的办法。
Java.io 是大多数面向数据流的输出 / 输入类的次要软件包。此外,Java 也对块传输提供反对,在外围库 java.nio 中采纳的便是块 IO。
流 IO 的益处是简略易用,毛病是效率较低。块 IO 效率很高,但编程比较复杂。
Java IO 模型 :
Java 的 IO 模型设计十分优良,它应用 Decorator 模式,按性能划分 Stream,您能够动静拆卸这些 Stream,以便取得您须要的性能。例如,您须要一个具备缓冲的文件输出流,则该当组合应用 FileInputStream 和 BufferedInputStream。
2. 数据流的基本概念
数据流是一串连续不断的数据的汇合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。数据写入程序能够是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序造成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段状况,每次能够读取其中的任意长度的数据,但只能先读取后面的数据后,再读取前面的数据。不论写入时是将数据分屡次写入,还是作为一个整体一次写入,读取时的成果都是齐全一样的。
“流是磁盘或其它外围设备中存储的数据的源点或起点。”
在电脑上的数据有三种存储形式,一种是外存,一种是内存,一种是缓存。比方电脑上的硬盘,磁盘,U 盘等都是外存,在电脑上有内存条,缓存是在 CPU 外面的。外存的存储量最大,其次是内存,最初是缓存,然而外存的数据的读取最慢,其次是内存,缓存最快。这里总结从外存读取数据到内存以及将数据从内存写到外存中。对于内存和外存的了解,咱们能够简略的了解为容器,即外存是一个容器,内存又是另外一个容器。那又怎么把放在外存这个容器内的数据读取到内存这个容器以及怎么把内存这个容器里的数据存到外存中呢?
在 Java 类库中,IO 局部的内容是很宏大的,因为它波及的畛域很宽泛:
规范输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip 文件流等等,java 中将输入输出形象称为流,就如同水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输出流,将数据从内存写入外存中的称为输入流。
流是一个很形象的概念,当程序须要读取数据的时候,就会开启一个通向数据源的流,这个数据源能够是文件,内存,或是网络连接。相似的,当程序须要写入数据的时候,就会开启一个通向目的地的流。
总结的基本概念如下:
1) 数据流:
一组有序,有终点和起点的字节的数据序列。包含输出流和输入流。
2) 输出流(Input Stream):
程序从输出流读取数据源。数据源包含外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道
3) 输入流:
程序向输入流写入数据。将程序中的数据输入到外界(显示器、打印机、文件、网络…)的通信通道。
采纳数据流的目标就是使得输入输出独立于设施。
Input Stream 不关怀数据源来自何种设施(键盘,文件,网络)
Output Stream 不关怀数据的目标是何种设施(键盘,文件,网络)
4 数据流分类:
流序列中的数据既能够是未经加工的原始二进制数据,也能够是经肯定编码解决后合乎某种格局规定的特定数据。因而 Java 中的流分为两种:
1) 字节流:数据流中最小的数据单元是字节
2) 字符流:数据流中最小的数据单元是字符,Java 中的字符是 Unicode 编码,一个字符占用两个字节。
- 规范 I /O
Java 程序可通过命令行参数与外界进行简短的信息替换,同时,也规定了与规范输出、输出设备,如键盘、显示器进行信息替换的形式。而通过文件能够与外界进行任意数据模式的信息替换。
- 命令行参数
复制代码 代码如下:
public class TestArgs {public static void main(String[] args) {for (int i = 0; i < args.length; i++) {System.out.println("args[" + i + "] is <" + args[i] + ">");
}
}
}
运行后果:args[0] is <Java>
args[1] is <C>
args[2] is <VB>
- 规范输出,输入数据流
java 零碎自带的规范数据流:java.lang.System:
复制代码 代码如下:
java.lang.System
public final class System extends Object{
static PrintStream err;// 规范谬误流(输入)
static InputStream in;// 规范输出(键盘输入流)
static PrintStream out;// 规范输入流(显示器输入流)
}
留神:
(1)System 类不能创建对象,只能间接应用它的三个动态成员。
(2)每当 main 办法被执行时, 就主动生成上述三个对象。
1) 规范输入流 System.out
System.out 向规范输出设备输入数据,其数据类型为 PrintStream。办法:
Void print(参数)
Void println(参数)
2)规范输出流 System.in
System.in 读取规范输出设施数据(从规范输出获取数据,个别是键盘),其数 据类型为 InputStream。办法:
int read() // 返回 ASCII 码。若, 返回值 =-1,阐明没有读取到任何字节读取工作完结。
int read(byte[] b)// 读入多个字节到缓冲区 b 中返回值是读入的字节数
例如:
复制代码 代码如下:
public class StandardInputOutput {
public static void main(String args[]) {
int b;
try {System.out.println("please Input:");
while ((b = System.in.read()) != -1) {System.out.print((char) b);
}
} catch (IOException e) {System.out.println(e.toString());
}
}
}
期待键盘输入,键盘输入什么,就打印出什么:
3)规范谬误流
System.err 输入规范谬误,其数据类型为 PrintStream。可查阅 API 取得具体阐明。
规范输入通过 System.out 调用 println 办法输入参数并换行,而 print 办法输入参数但不换行。println 或 print 办法都通 过重载实现了输入根本数据类型的多个办法,包含输入参数类型为 boolean、char、int、long、float 和 double。同时,也重载实现 了输入参数类型为 char[]、String 和 Object 的办法。其中,print(Object)和 println(Object)办法在运行时将调 用参数 Object 的 toString 办法。
复制代码 代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class StandardInputOutput {
public static void main(String args[]) {
String s;
// 创立缓冲区阅读器从键盘逐行读入数据
InputStreamReader ir = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(ir);
System.out.println("Unix 零碎: ctrl-d 或 ctrl-c 退出"
+ "\nWindows 零碎: ctrl-z 退出");
try {
// 读一行数据,并规范输入至显示器
s = in.readLine();
// readLine()办法运行时若产生 I / O 谬误,将抛出 IOException 异样
while (s != null) {System.out.println("Read:" + s);
s = in.readLine();}
// 敞开缓冲阅读器
in.close();} catch (IOException e) { // Catch any IO exceptions.
e.printStackTrace();}
}
}
4.java.IO 档次体系结构
在整个 Java.io 包中最重要的就是 5 个类和一个接口。5 个类指的是 File、OutputStream、InputStream、Writer、Reader;一个接口指的是 Serializable. 把握了这些 IO 的外围操作那么对于 Java 中的 IO 体系也就有了一个初步的意识了
Java I/ O 次要包含如下几个档次,蕴含三个局部:
1. 流式局部――IO 的主体局部;
2. 非流式局部――次要蕴含一些辅助流式局部的类,如:File 类、RandomAccessFile 类和 FileDescriptor 等类;
3. 其余类 – 文件读取局部的与平安相干的类,如:SerializablePermission 类,以及与本地操作系统相干的文件系统的类,如:FileSystem 类和 Win32FileSystem 类和 WinNTFileSystem 类。
次要的类如下:
- File(文件特色与治理):用于文件或者目录的形容信息,例如生成新目录,批改文件名,删除文件,判断文件所在门路等。
- InputStream(二进制格局操作):抽象类,基于字节的输出操作,是所有输出流的父类。定义了所有输出流都具备的独特特色。
-
OutputStream(二进制格局操作):抽象类。基于字节的输入操作。是所有输入流的父类。定义了所有输入流都具备的独特特色。
Java 中字符是采纳 Unicode 规范,一个字符是 16 位,即一个字符应用两个字节来示意。为此,JAVA 中引入了解决字符的流。
- Reader(文件格式操作):抽象类,基于字符的输出操作。
- Writer(文件格式操作):抽象类,基于字符的输入操作。
- RandomAccessFile(随机文件操作):它的功能丰富,能够从文件的任意地位进行存取(输入输出)操作。
Java 中 IO 流的体系结构如图:
- 非流式文件类 –File 类
在 Java 语言的 java.io 包中,由 File 类提供了形容文件和目录的操作与治理办法。但 File 类不是 InputStream、OutputStream 或 Reader、Writer 的子类,因为它不负责数据的输入输出,而专门用来治理磁盘文件与目录。
作用:File 类次要用于命名文件、查问文件属性和解决文件目录。
复制代码 代码如下:
public class File extends Object
implements Serializable,Comparable
{}
File 类共提供了三个不同的构造函数,以不同的参数模式灵便地接管文件和目录名信息。构造函数:
1)File (String pathname)
例:File f1=new File(“FileTest1.txt”); // 创立文件对象 f1,f1 所指的文件是在当前目录下创立的 FileTest1.txt
2)File (String parent , String child)
例:File f2=new File(“D:\dir1″,”FileTest2.txt”) ;// 留神:D:\dir1 目录当时必须存在,否则异样
3)File (File parent , String child)
例:File f4=new File("\\dir3");
File f5=new File(f4,"FileTest5.txt"); // 在如果 \\dir3 目录不存在应用 f4.mkdir()先创立
一个对应于某磁盘文件或目录的 File 对象一经创立,就能够通过调用它的办法来取得文件或目录的属性。
1)public boolean exists() 判断文件或目录是否存在
2)public boolean isFile( ) 判断是文件还是目录
3)public boolean isDirectory( ) 判断是文件还是目录
4)public String getName( ) 返回文件名或目录名
5)public String getPath( ) 返回文件或目录的门路。6)public long length( ) 获取文件的长度
7)public String[] list () 将目录中所有文件名保留在字符串数组中返回。
File 类中还定义了一些对文件或目录进行治理、操作的办法,罕用的办法有:
1)public boolean renameTo(File newFile); 重命名文件
2)public void delete( ); 删除文件
3)public boolean mkdir( ); 创立目录
例子:
复制代码 代码如下:
import java.io.File;
import java.io.IOException;
public class TestFile {
public static void main(String args[]) throws IOException {File dir = new File("\\root");
File f1 = new File(dir, "fileOne.txt");
File f2 = new File(dir, "fileTwo.java");
// 文件对象创立后,指定的文件或目录不肯定物理上存在
if (!dir.exists())
dir.mkdir();
if (!f1.exists())
f1.createNewFile();
if (!f2.exists())
f2.createNewFile();
System.out.println("f1's AbsolutePath= " + f1.getAbsolutePath());
System.out.println("f1 Canread=" + f1.canRead());
System.out.println("f1's len= " + f1.length());
String[] FL;
int count = 0;
FL = dir.list();
for (int i = 0; i < FL.length; i++) {
count++;
System.out.println(FL[i] + "is in \\root");
}
System.out.println("there are" + count + "file in //root");
}
}
阐明:File 类的办法:
(1) exists()测试磁盘中指定的文件或目录是否存在
(2) mkdir() 创立文件对象指定的目录(单层目录)
(3) createNewFile()创立文件对象指定的文件
(4) list()返回目录中所有文件名字符串
- Java.IO 流类库
- io 流的四个根本类
java.io 包中蕴含了流式 I / O 所须要的所有类。在 java.io 包中有四个根本类:InputStream、OutputStream 及 Reader、Writer 类,它们别离解决字节流和字符流:
根本数据流的 I /O
输出 / 输入
字节流
字符流
输出流
Inputstream
Reader
输入流
OutputStream
Writer
Java 中其余多种多样变动的流均是由它们派生进去的:
Java 中其余多种多样变动的流均是由它们派生进去的:
JDK1.4 版本开始引入了新 I / O 类库,它位于 java.nio 包中,新 I / O 类库利用通道和缓冲区等来进步 I / O 操作的效率。
在 java.io 包中,java.io.InputStream 示意字节输出流,java.io.OutputStream 示意字节输入流,处于 java.io 包最顶层。这两个类均为抽象类,也就是说它们不能被实例化,必须生成子类之后能力实现肯定的性能。
- io 流的具体分类
一、按 I / O 类型来总体分类:
-
Memory 1)从 / 向内存数组读写数据: CharArrayReader、CharArrayWriter、ByteArrayInputStream、ByteArrayOutputStream
2)从 / 向内存字符串读写数据 StringReader、StringWriter、StringBufferInputStream
2.Pipe 管道 实现管道的输出和输入(过程间通信): PipedReader、PipedWriter、PipedInputStream、PipedOutputStream
3.File 文件流。对文件进行读、写操作:FileReader、FileWriter、FileInputStream、FileOutputStream- ObjectSerialization 对象输出、输入:ObjectInputStream、ObjectOutputStream
5.DataConversion 数据流 按根本数据类型读、写(解决的数据是 Java 的根本类型(如布尔型,字节,整数和浮点数)):DataInputStream、DataOutputStream
6.Printing 蕴含不便的打印办法:PrintWriter、PrintStream
7.Buffering 缓冲 在读入或写出时,对数据进行缓存,以缩小 I / O 的次数:BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream
8.Filtering 滤流,在数据进行读或写时进行过滤:FilterReader、FilterWriter、FilterInputStream、FilterOutputStream 过
9.Concatenation 合并输出 把多个输出流连接成一个输出流:SequenceInputStream
10.Counting 计数 在读入数据时对行记数:LineNumberReader、LineNumberInputStream
11.Peeking Ahead 通过缓存机制,进行预读:PushbackReader、PushbackInputStream
12.Converting between Bytes and Characters 依照肯定的编码 / 解码规范将字节流转换为字符流,或进行反向转换(Stream 到 Reader,Writer 的转换类):InputStreamReader、OutputStreamWriter - ObjectSerialization 对象输出、输入:ObjectInputStream、ObjectOutputStream
二、按数据起源(去向)分类:
1、File(文件):FileInputStream, FileOutputStream, FileReader, FileWriter
2、byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、Char[]: CharArrayReader, CharArrayWriter
4、String: StringBufferInputStream, StringReader, StringWriter
5、网络数据流:InputStream, OutputStream, Reader, Writer
-
字节流 InputStream/OutputStream
- InputStream 抽象类
InputStream 为字节输出流,它自身为一个抽象类,必须依附其子类实现各种性能,此抽象类是示意字节输出流的所有类的超类。继承自 InputStream 的流都是向程序中输出数据的,且数据单位为字节(8bit);
InputStream 是输出字节数据用的类,所以 InputStream 类提供了 3 种重载的 read 办法.Inputstream 类中的罕用办法:
(1)public abstract int read():读取一个 byte 的数据,返回值是高位补 0 的 int 类型值。若返回值 =- 1 阐明没有读取到任何字节读取工作完结。
(2)public int read(byte b[]):读取 b.length 个字节的数据放到 b 数组中。返回值是读取的字节数。该办法实际上是调用下一个办法实现的
(3)public int read(byte b[], int off, int len):从输出流中最多读取 len 个字节的数据,寄存到偏移量为 off 的 b 数组中。
(4)public int available():返回输出流中能够读取的字节数。留神:若输出阻塞,以后线程将被挂起,如果 InputStream 对象调用这个办法的话,它只会返回 0,这个办法必须由继承 InputStream 类的子类对象调用才有用,
(5)public long skip(long n):疏忽输出流中的 n 个字节,返回值是理论疏忽的字节数, 跳过一些字节来读取
(6)public int close():咱们在应用完后,必须对咱们关上的流进行敞开.
次要的子类:
1)FileInputStream 把一个文件作为 InputStream,实现对文件的读取操作
2)ByteArrayInputStream:把内存中的一个缓冲区作为 InputStream 应用
3)StringBufferInputStream:把一个 String 对象作为 InputStream
4)PipedInputStream:实现了 pipe 的概念,次要在线程中应用
5)SequenceInputStream:把多个 InputStream 合并为一个 InputStream
2.OutputStream 抽象类 OutputStream 提供了 3 个 write 办法来做数据的输入,这个是和 InputStream 是绝对应的。
1. public void write(byte b[]):将参数 b 中的字节写到输入流。
2. public void write(byte b[], int off, int len):将参数 b 的从偏移量 off 开始的 len 个字节写到输入流。
3. public abstract void write(int b):先将 int 转换为 byte 类型,把低字节写入到输入流中。
4. public void flush() : 将数据缓冲区中数据全副输入,并清空缓冲区。
5. public void close() : 敞开输入流并开释与流相干的系统资源。
次要的子类:
1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
2) FileOutputStream:把信息存入文件中
3) PipedOutputStream:实现了 pipe 的概念,次要在线程中应用
4) SequenceOutputStream:把多个 OutStream 合并为一个 OutStream
流完结的判断:办法 read()的返回值为 - 1 时;readLine()的返回值为 null 时。
- 文件输出流:FileInputStream 类
FileInputStream 能够应用 read()办法一次读入一个字节,并以 int 类型返回,或者是应用 read()办法时读入至一个 byte 数组,byte 数组的元素有多少个,就读入多少个字节。在将整个文件读取实现或写入结束的过程中,这么一个 byte 数组通常被当作缓冲区,因为这么一个 byte 数组通常表演承接数据的两头角色。
作用:以文件作为数据输出源的数据流。或者说是关上文件,从文件读数据到内存的类。
应用办法(1)
File fin=new File(“d:/abc.txt”);
FileInputStream in=new FileInputStream(fin);
应用办法(2)
FileInputStream in=new FileInputStream(“d: /abc.txt”);
程序举例:
将 InputFromFile.java 的程序的内容显示在显示器上
复制代码 代码如下:
import java.io.IOException;
import java.io.FileInputStream;
public class TestFile {
public static void main(String args[]) throws IOException {
try{FileInputStream rf=new FileInputStream("InputFromFile.java");
int n=512; byte buffer[]=new byte[n];
while((rf.read(buffer,0,n)!=-1)&&(n>0)){System.out.println(new String(buffer) );
}
System.out.println();
rf.close();} catch(IOException IOe){System.out.println(IOe.toString());
}
}
}
4. 文件输入流:FileOutputStream 类 作用:用来解决以文件作为数据输入目标数据流;或者说是从内存区读数据入文件
FileOutputStream 类用来解决以文件作为数据输入目标数据流;一个示意文件名的字符串,也能够是 File 或 FileDescriptor 对象。
创立一个文件流对象有两种办法:
形式 1:
File f=new File (“d:/myjava/write.txt “);
FileOutputStream out= new FileOutputStream (f);
形式 2:
FileOutputStream out=new FileOutputStream(“d:/myjava/write.txt “);
形式 3:构造函数将 FileDescriptor()对象作为其参数。
FileDescriptor() fd=new FileDescriptor();
FileOutputStream f2=new FileOutputStream(fd);
形式 4:构造函数将文件名作为其第一参数,将布尔值作为第二参数。
FileOutputStream f=new FileOutputStream(“d:/abc.txt”,true);
留神:(1)文件中写数据时,若文件曾经存在,则笼罩存在的文件;(2)的读 / 写操作完结时,应调用 close 办法敞开流。
程序举例:应用键盘输入一段文章,将文章保留在文件 write.txt 中
复制代码 代码如下:
import java.io.IOException;
import java.io.FileOutputStream;
public class TestFile {
public static void main(String args[]) throws IOException {
try {System.out.println("please Input from Keyboard");
int count, n = 512;
byte buffer[] = new byte[n];
count = System.in.read(buffer);
FileOutputStream wf = new FileOutputStream("d:/myjava/write.txt");
wf.write(buffer, 0, count);
wf.close(); // 当流写操作完结时,调用 close 办法敞开流。System.out.println("Save to the write.txt");
} catch (IOException IOe) {System.out.println("File Write Error!");
}
}
}
- FileInputStream 流和 FileOutputStream 的利用
利用程序将文件 file1.txt 拷贝到 file2.txt 中。
复制代码 代码如下:
import java.io.File;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
public class TestFile {
public static void main(String args[]) throws IOException {
try {File inFile = new File("copy.java");
File outFile = new File("copy2.java");
FileInputStream finS = new FileInputStream(inFile);
FileOutputStream foutS = new FileOutputStream(outFile);
int c;
while ((c = finS.read()) != -1) {foutS.write(c);
}
finS.close();
foutS.close();} catch (IOException e) {System.err.println("FileStreamsTest:" + e);
}
}
}
- 缓冲输入输出流 BufferedInputStream/ BufferedOutputStream
计算机拜访外部设备十分耗时。拜访外存的频率越高,造成 CPU 闲置的概率就越大。为了缩小拜访外存的次数,应该在一次对外设的拜访中,读写更多的数据。为此,除了程序和流节点间替换数据必须的读写机制外,还应该减少缓冲机制。缓冲流就是每一个数据流调配一个缓冲区,一个缓冲区就是一个长期存储数据的内存。这样能够缩小拜访硬盘的次数, 进步传输效率。
BufferedInputStream: 当向缓冲流写入数据时候,数据先写到缓冲区,待缓冲区写满后,零碎一次性将数据发送给输出设备。
BufferedOutputStream : 当从向缓冲流读取数据时候,零碎先从缓冲区读出数据,待缓冲区为空时,零碎再从输出设施读取数据到缓冲区。
1)将文件读入内存:
将 BufferedInputStream 与 FileInputStream 相接
FileInputStream in=new FileInputStream(“file1.txt”);
BufferedInputStream bin=new BufferedInputStream(in);
2)将内存写入文件:
将 BufferedOutputStream 与 FileOutputStream 相接
FileOutputStreamout=new FileOutputStream(“file1.txt”);
BufferedOutputStream bin=new BufferedInputStream(out);
3)键盘输入流读到内存
将 BufferedReader 与规范的数据流相接
InputStreamReader sin=new InputStreamReader (System.in);
BufferedReader bin=new BufferedReader(sin);
复制代码 代码如下:
import java.io.*;
public class ReadWriteToFile {
public static void main(String args[]) throws IOException {InputStreamReader sin = new InputStreamReader(System.in);
BufferedReader bin = new BufferedReader(sin);
FileWriter out = new FileWriter("myfile.txt");
BufferedWriter bout = new BufferedWriter(out);
String s;
while ((s = bin.readLine()).length() > 0) {bout.write(s, 0, s.length());
}
}
}
程序阐明:
从键盘读入字符,并写入到文件中 BufferedReader 类的办法:String readLine()
作用:读一行字符串,以回车符为完结。
BufferedWriter 类的办法:bout.write(String s,offset,len)
作用:从缓冲区将字符串 s 从 offset 开始,len 长度的字符串写到某处。
-
字符流 Writer/Reader
Java 中字符是采纳 Unicode 规范,一个字符是 16 位,即一个字符应用两个字节来示意。为此,JAVA 中引入了解决字符的流。
- Reader 抽象类
用于读取字符流的抽象类。子类必须实现的办法只有 read(char[], int, int) 和 close()。然而,少数子类将重写此处定义的一些办法,以提供更高的效率和 / 或其余性能。
1) FileReader : 与 FileInputStream 对应
次要用来读取字符文件,应用缺省的字符编码,有三种构造函数:
(1)将文件名作为字符串:FileReader f=new FileReader(“c:/temp.txt”);
(2)构造函数将 File 对象作为其参数。
File f=new file(“c:/temp.txt”);
FileReader f1=new FileReader(f);
(3) 构造函数将 FileDescriptor 对象作为参数
FileDescriptor() fd=new FileDescriptor()
FileReader f2=new FileReader(fd);
(1) 用指定字符数组作为参数:CharArrayReader(char[])
(2) 将字符数组作为输出流:CharArrayReader(char[], int, int)
读取字符串,构造函数如下:public StringReader(String s);
2) CharArrayReader:与 ByteArrayInputStream 对应
3) StringReader : 与 StringBufferInputStream 对应
4) InputStreamReader
从输出流读取字节,在将它们转换成字符:Public inputstreamReader(inputstream is);
5) FilterReader: 容许过滤字符流
protected filterReader(Reader r);
6) BufferReader : 承受 Reader 对象作为参数,并对其增加字符缓冲器,应用 readline() 办法能够读取一行。
Public BufferReader(Reader r);
次要办法:
(1) public int read() throws IOException; // 读取一个字符,返回值为读取的字符
(2) public int read(char cbuf[]) throws IOException; /读取一系列字符到数组 cbuf[]中,返回值为理论读取的字符的数量 /
(3) public abstract int read(char cbuf[],int off,int len) throws IOException;
/ 读取 len 个字符,从数组 cbuf[]的下标 off 处开始寄存,返回值为理论读取的字符数量,该办法必须由子类实现/
- Writer 抽象类
写入字符流的抽象类。子类必须实现的办法仅有 write(char[], int, int)、flush() 和 close()。然而,少数子类将重写此处定义的一些办法,以提供更高的效率和 / 或其余性能。其子类如下:
1)FileWrite: 与 FileOutputStream 对应
将字符类型数据写入文件,应用缺省字符编码和缓冲器大小。
Public FileWrite(file f);
2) chararrayWrite: 与 ByteArrayOutputStream 对应 , 将字符缓冲器用作输入。
Public CharArrayWrite();
3) PrintWrite: 生成格式化输入
public PrintWriter(outputstream os);
4) filterWriter: 用于写入过滤字符流
protected FilterWriter(Writer w);
5) PipedWriter:与 PipedOutputStream 对应
6) StringWriter:无与之对应的以字节为导向的 stream
次要办法:
(1) public void write(int c) throws IOException;// 将整型值 c 的低 16 位写入输入流
(2) public void write(char cbuf[]) throws IOException;// 将字符数组 cbuf[]写入输入流
(3) public abstract void write(char cbuf[],int off,int len) throws IOException;// 将字符数组 cbuf[]中的从索引为 off 的地位处开始的 len 个字符写入输入流
(4) public void write(String str) throws IOException;// 将字符串 str 中的字符写入输入流
(5) public void write(String str,int off,int len) throws IOException;// 将字符串 str 中从索引 off 开始处的 len 个字符写入输入流
(6) flush() // 刷空输入流,并输入所有被缓存的字节。
(7)close() 敞开流 public abstract void close() throws IOException
3 .InputStream 与 Reader 差异 OutputStream 与 Writer 差异