Java小白的File学习笔记(三)——字节流之InputStream、OutputSream
现在,我们到了File操做的一个重点内容
输入输出之字节输入输出流——InputStream、OutputSream
InputStream抽象了应用程序读取数据的方式
OutputSream抽象了应用程序写入数据的方式
输入流的基本方法:读。
到这有人可能会疑问了,输入流不是输入吗,不应该是写吗?
我来举个例子——键盘。众所周知,键盘属于输入设备,从人的角度来说,是我们把数据通过键盘输入到文件,而文件是从键盘读取数据到自己,所以,输入流的基本方法是读。
输入流基本方法:
in.read 返回一个整形,读取一个字节无符号填充到int低八位,读到-1结束。
in.read(byte[] buf) 将读取的数据填充到一个字节数组
in.read(byte[] buf, int start, int size) 读取数据到字节数组buf中,从start开始存放,存放size大小的数据。
输出流基本方法:写。经过上面的 思考,这个写的基本方法应该就明白了吧
out.write(int b) 写一个字节到输出流,尽管参数是一个int整形,但是只写一个字节,也即是b的低八位。
out.write(byte[] buf) 将一个字节数组的数据都写入到流
out.write(byte[] buf, int start, int size)将字节数组从start位置开始写size长度的数据到流
子类:FileInputStream与FileOutputSream
继承自InputStream和OutputSream,具体实现了在文件上读写数据
以下看例子
用FileInputStream来入去文件内容,并以16进制的方式打印输出,每打印10个字节换行
FileInputStream inputStream = new FileInputStream(fileName);
int b;//用于判断是否读到文件结尾
while ((b = inputStream.read())!= -1) {
System.out.print(Integer.toHexString(b));
}
inputStream.close();
看下打印结果
好了,这个方法掌握了吧,剩下两个方法自己联系。
下面我们来看一下FileOutputSream
/*
* 如果该文件不存在,创建文件,如果存在,删除后创建文件
* 还有一个方法FileOutputStream(String name,boolean append),若后面append参数为true,则代表在文件后面追加数据
*/
FileOutputStream fileOutputStream = new FileOutputStream("E:\\score2.txt");
fileOutputStream.write('A');//写一个字节,也就是A的低八位
/*
* 其实这个写方法与RandomAccessFile的写方法类似
* 每次只能写一个字节,当写一个整数时,也是类似要写4次,用移位操作每次写八位
* 当然,还有其他
* fileOutputStream.write(byte[] b);
* fileOutputStream.write(byte[] b,int off,int len);等方法
* 这些就让小伙伴们自己去摸索吧
*/
接下来,我们写一个简单的文件拷贝的代码
public static void copyww(File srcFile,File desFile) throws IOException{
/*
* 这很简单嘛,我们用FileInputStream读srcFile文件的同时,同时通过FileOutputStream写入到desFile
*/
FileInputStream fileInputStream = new FileInputStream(srcFile);
//没有desFile时,会自动创建。
FileOutputStream fileOutputStream = new FileOutputStream(desFile);
fileOutputStream.write(fileInputStream.read());
/*
* 现在我们用的是单个读取,但是当数据量很大时,效率就会很低了,我们可以用批量读取。
*/
byte[] bs = new byte[8*1024];
int b;
while((b=fileInputStream.read(bs,0,bs.length))!=-1) {
fileOutputStream.write(bs, 0, b);
fileOutputStream.flush();
}
}
从这大家就可以看出来了,数据复制已经完成。
DataInputStream、DataOutputStream——对“流”功能的扩展,可以更方便的读写int,long字符等类型的数据
看一下DataInputStream的一些方法,大家就明白了
看,有readChar(),readLong(),readUTF()等方法,就是说明了该类封装了直接读取int,long,char等的方法。
那DataOutputStream小伙伴们就自己去查看吧。
好了,今天的笔记就到这里,满足o( ̄︶ ̄)o