我也是在整理自己的在这段时间的学习对于一IO的一些类有新的认识,整理一下
第一部分:IO流中分字符流和字节流,
字符流和字节流的区别
字节流的数据单元的是8位的字节,字符流的数据单元的是16位的字符,
字节流可以传输所有的文件,图片视频等但是字符流只能传输文本文件,文档,HTML等文本文档
字节流的基类是InputStream和OutputStream,字节流的基类是Reader和writer.
第二部分IO流还有别的分类,按照流接触的对象分为节点流(也称作低级流)和处理流(也叫包装流或者高级流),两者的区别是,节点流直接接触到数据,而处理流则是对一个已存在的流进行连接和处理,我自己认为节点流很基础,但是不如处理流要方便
简单输入流小demo(我用字节流做例子,字符流在我的project里面,下文也是)
package com.IO;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class FIleIOInputStream {
public static void main(String[] args) {
File file=new File("a.txt");
//用绝对路径选择一个文件
try {
InputStream in=new FileInputStream(file);
byte[] b = new byte[20];
//建立一个水桶
int size=0;
try {
while ((size=in.read(b))!=-1) {
System.out.println(new String(b, 0, size));
//String的截取字符串,我很快就会去整理关于String的方法
}
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
其中read(byte b[])方法中的只放一个字节数组的方法其实也是
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}
然后如果你再打开 read(b, 0, b.length);的源码你会看到
public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
int c = read();
if (c == -1) {
return -1;
}
b[off] = (byte)c;
int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c;
}
} catch (IOException ee) {
}
return i;
}
他也是显示了先进行判断看看他是否读完,如果读完就返回-1,如果没有读完就进行循环
简单的输出流小demo
package com.IO;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class FileIOOutputStream {
public static void main(String[] args) {
File f=new File("a.txt");
try {
OutputStream out=new FileOutputStream(f);
byte []b={23,4,45,6,57,75,67};
try {
out.write(b);
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输入文件时,如果输出汉字,会出现乱码现象,因为一个汉字占两个字节,我的编码格式已经转了utf-8,一会我会把我的源码穿上来,如果你们的eclipse没有改默认的话你导入我的项目我的所有的中文也会变成乱码
如果真的要使用OutputStream可以使用他得子类FileOutputStreamWriter,用法很简答我在这里就不一一解释了
关闭输出流除了可以保证流资源被回收,可能还可以将输出流缓冲区中的数据 flush到物流节点里(在结束之前自动执行flush()).
流关闭的原因是因为程序打开的文件的IO流资源不属于内存资源,垃圾回收机制无法回收,所以应该显示关闭文件的IO资源.
这就是最基础的IO流至于更高级的包装流之类的下次再整理了,有什么不对的请多多支出.