一、java的I/O流
1. 输入流(字节流和字符流,字节流操作的数据单元是8位的字节,字符流操作的是16位的字符)(InputStream 和Reader作为基类)
2、输出流(字节流和字符流,字节流操作的数据单元是8位的字节,字符流操作的是16位的字符)(outputStream和Writer作为基类)
划分输入流和输出流是从内存角度考虑划分。如:数据从服务器通过网络流向客户端,server端的内存将数据输出到网络(用输出流),client将网络中的数据输入内存(用输入流)。
创建字节输入流代码: FileInputStream fis = new FileInputStream(new File("D://info.txt"));
创建字符输入流代码:FileReader fr = new FileReader(new File("D://info.txt"));
可能用到ileInputStream 和 InputStreamReader两个对象,来看FileInputStream 和 InputStreamReader的区别:
前者的构造函数是有一个文件类型的参数,没有设定编码,是读取的字节,需要用字节数组接受,至于你读取后的字节要转换为字符输出需要后续处理;
FileInputStream fis = null;
try {
fis = new FileInputStream(new File("D://info.txt"));
byte [] bbuf = new byte[1024];
int hasread = 0;
while((hasread = fis.read(bbuf))>0){
String str1 = new String(bbuf, "UTF-8");//to UTF-8 string
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
fis.close();
}
后者的构造函数是含有两个参数,一个是关联的文件File或FileReader,另一个则是字符串类型的字符编码,此时读取的数据已经不是字节,而是字符。
FileInputStream fr = null;
InputStreamReader ir = null;
try {
fr = new FileInputStream(new File("D://info.txt"));
ir = new InputStreamReader(fr,"UTF-8");
char [] cbuf = new char[32];
int hasread = 0;
while((hasread = ir.read(cbuf))>0){ //最多读取cbuf中的32个字符;
System.out.println(new String(cbuf));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
finally{
fr.close();
}
要关闭输入输出流,因为流不单在内存中分配了空间,也在操作系统中占有了资源,java的gc是能从内存中回收不使用的对象,但对操作系统分配的资源是无能为力的,所以要调用close()方法来通知os释放资源。
二、java节点流和处理流的概念:
节点流:可以从或者向一个特定的I/O设备(如磁盘、网络)读(写)数据,节点流与底层的I/O设备、文件交互。
处理流:用于包装节点流,是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
JAVA常用的节点流有以下几个:
文 件 FileInputStream 、FileOutputStrean、 FileReader 、FileWriter 文件进行处理的节点流。
字符串 StringReader、 StringWriter 对字符串进行处理的节点流。
数 组 ByteArrayInputStream 、ByteArrayOutputStream、CharArrayReader、 CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)。
管 道 PipedInputStream 、PipedOutputStream 、PipedReader、PipedWriter对管道进行处理的节点流。
父 类 InputStream 、OutputStream 、Reader 、Writer
常用处理流(关闭处理流需要关闭里面的节点流)
缓冲流:BufferedInputStrean、 BufferedOutputStream 、BufferedReader、 BufferedWriter,增加缓冲功能,避免频繁读写硬盘。
转换流:InputStreamReader 、OutputStreamReader实现字节流和字符流之间的转换。
数据流: DataInputStream 、DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来,