------- <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! ----
关于IO接口原理,里面东西比较复杂,细节比较多,很容易让初学者搞混淆,本人现将主要的内容尽可能详细的总结如下,大家可以参考,如有不足,敬请斧正!
第一节、关于InputStream和OutputStream***********************************************************************
1、InputStream和OutputStream都是以字节为单位的抽象流类,规定了字节流所有的输出和输入的基本操作。
InputStream:以字节为单位从数据源中读取数据,其继承层次结构大致如下:
public abstract int read ()throws IOException :从输入流中读取数据的下一个字节,返回读到的字节值,若遇到流的末尾,返回—1。
public int read (byte[] b) throws IOException:从输入流中读取B.length个字节的数据并存储到缓冲区b中,返回的是实际读到的字节数
public int read (byte[] b,int off ,int len )throws IOException:读取len个字节的数据,并从数组b的off位置开始写入到这个数组中
public void close() throws IOExceptiom:关闭此输入流并释放所有系统资源
public int available() IOException:返回此输入流的下一个方法调用可以不受阻塞地从此输入读取的估计字节数
public skip(long n) throws IOException:跳过河丢弃此输入流中数据的n个字节,返回的是字节数
2、outputStream常用方法介绍:
public abstract void write(int b)throws IOException:将制定的字节写入此输出流
public void write(byte[] b)throws IOException:将b.length个字节从指定的byte数组写入此输出流
public void write(byte[] b,int off,int len)throws IOException:将指定byte数组中从off开始的len个字节写入此输出流
public void flush() throws IOException:刷新此输出流,并强制写出所有缓冲的输出字节
public void close ()throws IOExceptoin:关闭此输出流,并释放与此输出流有关的所有系统资源
第二节、下面介绍字符输出流,用法的差别不大,只是针对的操作类型不同而已,大家可以对比记忆**********************
reader 和writer 都是以字符为操作对象的流类。
1、Reader 常用方法介绍:
public int read ()throws IOException:读取单个字符,返回作为整数读取的字符,如果已达到流的末尾则返回-1
public int read(char[] abcd)throws IOException:将字符读入数组,返回读取的字符数
public abstract int read (char[] abcd,int off,int len)throws IOExcrption:读取len 个字符的数据,并从数组ancd的off 位置开始写入到
这个数组中
public abstract void close()throws IOException:关闭该流并释放与之并联的所有系统资源
public long skip(long n)throws IOException:跳过n个字符
2、write常用方法介绍。
Public void write(int c)throws IOException:写入单个字符
public void write (char[] abcd)throws IOException:写入字符数组
public abstract void write(char[]abcd,int off,int len)throws IOException:写入字符数组的某一部分
public void write(String str)throws IOExcrption:写入字符串
public void write(String str,int off ,int len)throws IOException:写入字符串的某一部分
public abstract void close ()throws IOException:关闭此流,但是先刷新它
public abstract void flush()throws IOException:刷新该流的缓冲,将缓冲的数据全部写到目的地
第三节、关于文件流***************************************************************************
文件流是指那些专门用于操作数据源中的文件的流,主要有FileInputStream、FileOutPut、FileReader、FileWriter
四个类,根据分组先介绍FileInputStream、FileOutPutStream
FileInputStream、FileOutPutStream是以字节位操作单位的文件输入流和文件输出流,利用这两个类可以对文件
进行读写操作。。。。。
下面用例子来读取指定文件的数据。。。。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/** 用FileInputStream来读取数据源中的数据 */
public class FileInputStreamTest {
public static void main(String[] args) {
FileInputStream fin = null;
try {
// step1: 创建一个连接到指定文件的FileInputStream对象
fin = new FileInputStream("D:\\IOTest\\source.txt");
System.out.println("可读取的字节数: " + fin.available() + "字节");
// step2: 读数据: 一次读取一个字节的数据,返回的是读到的字节.
int i = fin.read();
while (i != -1) { // 若遇到流的末尾,会返回-1
System.out.print((char) i);
i = fin.read(); // 再读
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) { // 捕获IO异常
e.printStackTrace();
} finally {
// step3: 关闭输入流
try {
if (null != fin) {
fin.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
“D:\\IOTest\soruce.txt”的内容如下:abc 你好吗 中国 i1234
运行以上这个程序,在控制台的输出结果为:abc ?????? ??? i1234
下面给出阐释:乱码的原因是FileInputStream、FileOutPutStream是用字节流读取文件内容的,而汉语一个字是两个字节
因此才会出现乱码,解决办法就是使用转换流进行转换在输出,关于转换流会在本人连载的帖子中给出
--- <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! -------- |