文章目录
流的分类
- 按数据流的方向不同可以分为输入流和输出流
- 按照处理数据单位不同可以分为字节流和字符流
- 按照功能不同可以分为节点流和处理流
输入输出流
输入输出是相对的,比如程序读取文件,站在程序角度叫输入,站在文件角度叫输出。(一般来说都是站在程序角度来看的)
字节字符流
字节流:最原始的一个流,读出来的数据就是010101这种最底层的数据表示形式,只不过它是按照字节来读的,一个字节(Byte)是8位(bit)读的时候不是一个位一个位的来读,而是一个字节一个字节来读。
字符流:字符流是一个字符一个字符地往外读取数据。一个字符是2个字节。
节点流处理流
简介:
节点流类型
处理流类型
节点流
输入流
InputStream
我们看到的具体的某一些管道,凡是以InputStream结尾的管道,都是以字节的形式向我们的程序输入数据。
继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字(8bit);下图中深色为节点流,浅色为处理流。
常用方法
//读取一个字节并以整数的形式返回(0~255)
//如果返回-1就说明已经到了输入流的末尾
int read() throws IOException
//读取一系列字节并存储到一个数组buffer
//返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1
int read(byte[] buffer) throws IOException
//读取length个字节
//并存储到一个字节数组buffer,从offset位置开始,使用长度位length.也就是只用buffer的一部分
//返回实际读取的字节数,如果读取前以到输入流的末尾返回-1.
int read(byte[] buffer,int offset,int length) throws IOException
//关闭流释放内存资源
void close() throws IOException
//跳过n个字节不读,返回实际跳过的字节数
long skip(long n) throws IOException
简单测试
测试的时候注意txt文件格式要选UTF-8。
package JZO;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class IOTest {
public static void main(String args[]) {
int b = 0;// 使用变量b来装调用read()方法时返回的整数
FileInputStream fi = null;
FileInputStream fi1 = null;
FileReader fr = null;
/* InputStream流里面的read()方法读取内容时是一个字节一个字节地读取的
FileReader流里面的read()方法是一个字符一个字符地读取的,这样每次读取出来的都是一个完整的汉字.
*/
try {
fi = new FileInputStream("C:\\Users\\j'j'j\\Desktop\\hi.txt");
fi1 = new FileInputStream("C:\\Users\\j'j'j\\Desktop\\hi.txt");
fr = new FileReader("C:\\Users\\j'j'j\\Desktop\\hi.txt");
} catch (FileNotFoundException e) {
System.out.println("系统找不到指定文件!");
System.exit(-1);// 系统非正常退出
}
long num = 0;// 使用变量num来记录读取到的次数
try {
while((b = fi.read())!=-1) {
fi.skip(1);//跳过一个
System.out.print(b+"=");
System.out.print((char) b+" ");
num++;
}
fi.close();// 关闭输入流
System.out.println();
System.out.println("总共读取了" + num + "个字节的文件");
} catch (IOException e1) {
System.out.println("文件读取错误!");
}
num = 0;
try {
byte[] bf = new byte[8];
while((b = fi1.read(bf))!=-1) {
System.out.print(" 读取了"+b+"个字符:");
for(byte i:bf) {
System.out.print(i+"|");
}
num++;
}
fi.close();// 关闭输入流
System.out.println();
System.out.println("总共读取了" + num + "次");
} catch (IOException e1) {
System.out.println("文件读取错误!");
}
try {
num = 0;
while((b = fr.read())!=-1) {
System.out.print(b+"=");
System.out.print((char) b+" ");
num++;
}
fr.close();// 关闭输入流
System.out.println();
System.out.println("总共读取了" + num + "个字符的文件");
} catch (IOException e1) {
System.out.println("文件读取错误!");
}
}
}
FileReader
(FileReader的用法和InputStream几乎一样,知识数据的单位是两个字节)。
常用方法
//读取一个字节并以整数的形式返回(0~255)
//如果返回-1就说明已经到了输入流的末尾
int read() throws IOException
//读取一系列字节并存储到一个数组buffer
//返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1
int read(byte[] buffer) throws IOException
//读取length个字节
//并存储到一个字节数组buffer,从只是用buffer的(offset,offset+length-1)这一部分。
//返回实际读取的字节数,如果读取前以到输入流的末尾返回-1.
int read(byte[] buffer,int offset,int length) throws IOException
//关闭流释放内存资源
void close() throws IOException
//跳过n个字符不读,返回实际跳过的字节数
long skip(long n) throws IOException
测试
public