写入和写出概述
——写入和读取是相对于我们的程序来说的
从外界读取数据到我们的程序叫做输入
从我们的程序写入数据到外界叫做输出
输入流只能读取数据,而不能写入
输出流只能写入数据,而不能读取
可以说输入流和输出流在这方面是互斥的
read方法是拿来读取文件的
write是拿来写入数据的
对于输入流中的read(byte[], off, len)方法:
byte[] bytes = new byte[5];// 这边是随意定义的一个数组
bytes是字节数组,off是读取的起始下标,len是指从读取的起始下标开始要读的长度,
若要从off开始读取到字节数组末尾,则可以填写为read(bytes,off,bytes.length-off)。
同理得,对于输出流中的write(bytes, off, len)方法:
它从bytes数组的bytes[off]往下读取数据,算上自身总共读取len长度的数据。
若要对读取的内容进行输出,通过字节数组存放读取内容再将其转换为字符数组的方法是比较简洁,比较方便的。下面是读取文件的操作。
package io流.i;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo1112 {
public static void main(String[] args) throws IOException {
FileInputStream inp = new FileInputStream("./写来写去.txt");
byte[] bytes = new byte[1024];
int count = 1;
int len;
while ((len = inp.read(bytes)) != -1) {
System.out.printf("第%d次读取了%d个字节\n",count++,len);
System.out.println(new String(bytes, 0, len));
}
inp.close();
System.out.println("===========");
for(byte i : bytes) {
if(i=='\n') System.out.print("\\n");
if(i=='\r') System.out.print("\\r");
}
}
}
由此可见,记事本中的换行是用到两个字符的,也就是"\r\n"。
接下来是复制图片操作
package io流.i;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo1024 {
public static void main(String[] args) throws IOException {
FileInputStream inp = new FileInputStream("C:\\Users\\Administrator\\Desktop\\0.0\\图片.png");
FileOutputStream out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\0.0\\1\\1.png");
byte[] bytes = new byte[1024];
int len;
int a = 0;// 计数器,看重复写入了多少次
while((len=inp.read(bytes))!=-1) {
System.out.println(a++);
out.write(bytes,0,len-0);
// 这里必须写len-0次,而不能写bytes.length次,因为最后面len<bytes.length,\
从len到bytes.length这一段是上一次读取到的内容(用read把数据存入数组的话,\
其原理相当于赋值操作,赋值到len的时候就结束了。而最后一次赋值到len结束,\
从len到length这一段的数据仍是上一次读取的数据)
}
inp.close();
out.close();
System.out.println("录入完毕");
}
}
字节流可以复制任何类型的文件