-----Android培训 、 Java培训 、期待与你交流!-----
一.IO流的基本概述
1.1 IO流的分类
从方向:输入流(继承InputStream和继承Reader的流);输出流(继承OutputStream和继承Writer的流)
流的底层数据单位:字节流(继承InputStream和OutputStream的流);字符流(继承Reader和Writer的流)
流的功能:节点流(直接与文件数据操作的流),处理流(对节点流处理的流)。
1.2 IO流的作用
主要是对一些文件和数据进行操作。
二.字节输入流
2.1 IputStream
简介:此抽象类是表示字节输入流的所有类的超类。
常用方法:
int available() 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
void close() 关闭此输入流并释放与该流关联的所有系统资源。
void mark(int readlimit) 在此输入流中标记当前的位置。
boolean markSupported() 测试此输入流是否支持 mark 和 reset 方法。
abstract int read() 从输入流中读取数据的下一个字节。
int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。
void reset() 将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。
long skip(long n) 跳过和丢弃此输入流中数据的 n 个字节。
2.2 FileInputStream
简介:该文件流操作文件,将文件从非内存区域输入到内存。
常用方法:
protected void finalize() 确保在不再引用文件输入流时调用其close 方法。
FileChannel getChannel() 返回与此文件输入流有关的唯一FileChannel 对象。
FileDescriptor getFD()返回表示到文件系统中实际文件的连接的FileDescriptor 对象,该文件系统正被此FileInputStream 使用。
2.3 ByteArrayInputStream
简介:ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪read 方法要提供的下一个字节。关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
常用方法:
boolean markSupported() 测试此 InputStream 是否支持 mark/reset。
2.4 应用举例
public class Test {
public static void main(String[] args) throws Exception {
File f=new File("1.txt");
FileInputStream fin=new FileInputStream(f);
byte[] b=new byte[(int) f.length()];
fin.read(b);
String str=new String(b);
System.out.println(str);
FileChannel channel=fin.getChannel();
System.out.println(channel.size());
FileDescriptor des=fin.getFD();
System.out.println(des.valid());
byte[] c=new byte[10];
ByteArrayInputStream bin=new ByteArrayInputStream(b);
bin.read(c);
String str1=new String(c);
System.out.println(str1);
}
}
三.字节输出流
3.1 OutputStream
简介:此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。需要定义OutputStream 子类的应用程序必须始终提供至少一种可写入一个输出字节的方法。
常见方法:
void close() 关闭此输出流并释放与此流有关的所有系统资源。
void flush() 刷新此输出流并强制写出所有缓冲的输出字节。
void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
abstract void write(int b) 将指定的字节写入此输出流。
3.2 FileOutputStream
简介:文件输出流是用于将数据写入File 或FileDescriptor 的输出流。文件是否可用或能否可以被创建取决于基础平台。特别是某些平台一次只允许一个FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。FileOutputStream
用于写入诸如图像数据之类的原始字节的流。
常见方法:
protected void finalize() 清理到文件的连接,并确保在不再引用此文件输出流时调用此流的 close 方法。
FileChannel getChannel() 返回与此文件输出流有关的唯一FileChannel 对象。
FileDescriptor getFD() 返回与此流有关的文件描述符。
3.3 ByteArrayOutputStream
简介:此类实现了一个输出流,其中的数据被写入一个byte数组。缓冲区会随着数据的不断写入而自动增长。可使用toByteArray()和toString()获取数据。
关闭ByteArrayOutputStream无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。
常见方法:
int size() 返回缓冲区的当前大小。
byte[]toByteArray() 创建一个新分配的 byte 数组。
String toString() 使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串。
String toString(String charsetName) 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串。
void writeTo(OutputStream out)将此byte数组输出流的全部内容写入到指定的输出流参数中,这与使用out.write(buf,0,count)调用该输出流write方法效果一样。
3.4 应用举例
public class Test {
public static void main(String[] args) throws Exception {
File f=new File("1.txt");
FileOutputStream fou=new FileOutputStream(f);
String str="中国是世界大国";
byte[] b=str.getBytes();
fou.write(b);
fou.flush();
FileChannel channel=fou.getChannel();
System.out.println(channel.size());
FileDescriptor des=fou.getFD();
System.out.println(des.valid());
ByteArrayOutputStream bin=new ByteArrayOutputStream();
bin.write(b);
byte[] c=bin.toByteArray();
String str1=new String(c);
System.out.println(str1);
}
}
四.字符输入流
4.1 Reader
简介:用于读取字符流的抽象类。子类必须实现的方法只有read(char[],int,int)和close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和或其他功能。
常见方法:
abstract void close()关闭该流并释放与之关联的所有资源。
void mark(int readAheadLimit)标记流中的当前位置。
boolean markSupported() 判断此流是否支持 mark() 操作。
int read() 读取单个字符。
int read(char[]cbuf) 将字符读入数组。
abstract int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
int read(CharBuffer target) 试图将字符读入指定的字符缓冲区。
boolean ready() 判断是否准备读取此流。
void reset() 重置该流。
longskip(long n) 跳过字符。
4.2 FileReader
简介: 用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在FileInputStream上构造一个InputStreamReader。 FileReader 用于读取字符流。4.3 StringReader
简介:该类是字符输入流,将字符转换为流。
4.4 应用举例
public class Test {
public static void main(String[] args) throws Exception {
File f=new File("1.txt");
FileReader fd=new FileReader(f);
int ch = 0;
String str=null;
while((ch=fd.read())!=-1)
{
fd.skip(1);
str+=(char)ch;
}
str=str.substring(4, str.length());
StringReader sr=new StringReader(str);
char[] buf=new char[str.length()];
sr.read(buf);
String str1=new String(buf);
System.out.println(str1);
}
}
五.字符输出流
5.1 Writer
简介:写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
常见方法:
Writer append(char c)将指定字符添加到此 writer。
Writer append(CharSequence csq) 将指定字符序列添加到此 writer。
Writer append(CharSequence csq, int start, intend)将指定字符序列的子序列添加到此writer.Appendable。
abstract void close()关闭此流,但要先刷新它。
abstract void flush()刷新该流的缓冲。
void write(char[] cbuf)写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
void write(int c) 写入单个字符。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分。
5.2 StringWriter
简介:一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。关闭StringWriter无效。此类中的方法在关闭该流后仍可被调用,而不会产生任何 IOException。
常见方法:StringBuffer getBuffer() 返回该字符串缓冲区本身。
String toString() 以字符串的形式返回该缓冲区的当前值。
5.3 FileWriter
简介:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。文件是否可用或是否可以被创建取决于底层平台。特别是某些平台一次只允许一个 FileWriter(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。
5.4 应用举例
public class Test {
public static void main(String[] args) throws Exception {
File f=new File("1.txt");
FileWriter fw=new FileWriter(f);
fw.write("台湾是中华人民共和国的领土");
fw.flush();
StringWriter sw=new StringWriter();
sw.write("台湾是中华人民共和国的领土");
sw.append("1949 10 01");
sw.flush();
StringBuffer buf=sw.getBuffer();
System.out.println(buf.toString());
}
}
六.装饰流
6.1 BufferedInputStream
简介:BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和reset 方法的能力。在创建BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次mark 操作后读取的所有字节。
6.2 BufferedReader
简介:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。
常见方法:String readLine() 读取一个文本行
6.3 BufferedOutputStream
简介:该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
常见方法: void flush() 刷新此缓冲的输出流
6.4 BufferedWriter
简介:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。
常见方法:
void flush() 刷新该流的缓冲。
void newLine() 写入一个行分隔符。
6.5 InputStreamReader
简介:InputStreamReader 是字节流通向字符流的桥梁:它使用指定的charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
常见方法:String getEncoding() 返回此流使用的字符编码的名称。
6.6 OutputStreamWriter
简介:OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
常见方法:
void flush() 刷新该流的缓冲。
String getEncoding() 返回此流使用的字符编码的名称。
6.7 应用举例
public class Test {
public static void main(String[] args) throws Exception {
File f=new File("1.txt");
FileInputStream fin=new FileInputStream(f);
System.out.println(fin.markSupported());
BufferedInputStream bin=new BufferedInputStream(fin);
byte[] b=new byte[(int) f.length()];
bin.mark(b.length);
bin.read(b);
System.out.println(bin.markSupported());
bin.reset();
System.out.println(new String(b));
InputStreamReader r=new InputStreamReader(bin);
BufferedReader bd=new BufferedReader(r);
System.out.println(bd.readLine());
bin.close();
bd.close();
FileOutputStream fou=new FileOutputStream(f);
BufferedOutputStream bou=new BufferedOutputStream(fou);
byte[] c="武汉大学".getBytes();
bou.write(c);
bou.flush();
OutputStreamWriter w=new OutputStreamWriter(fou);
BufferedWriter bw=new BufferedWriter(w);
char [] t="中华人民共和国万岁".toCharArray();
bw.write(t);
bw.flush();
bw.close();
}}
七.文件
7.1 File
public class Test {
public static void main(String[] args) throws Exception {
File f=new File("1.txt");
File dir=new File("空文件夹");
System.out.println(f.exists());
dir.mkdirs();
System.out.println(f.getAbsolutePath());
File[] files=dir.listFiles();
for(File f1:files)
System.out.println(f1.getName());
f.setReadOnly();//拒绝改写
/*FileOutputStream fout=new FileOutputStream(f);
BufferedOutputStream out=new BufferedOutputStream(fout);
out.write("中华人民共和国".getBytes());
out.flush();
out.close();*/
FileInputStream fin=new FileInputStream(f);
BufferedInputStream in=new BufferedInputStream(fin);
byte[] file=new byte[(int) f.length()];
in.read(file);
System.out.println(new String(file));
f.setWritable(true);
FileOutputStream fout=new FileOutputStream(f);
BufferedOutputStream out=new BufferedOutputStream(fout);
out.write("中华人民共和国".getBytes());
out.flush();
out.close();
}}