IO流:I是指Input(输入),O是指Output(输出)。所以几种接来几种典型的IO流都是通过Input 输入 和 Output输出来进行操作的。
一、字节流:字节流用于处理以字节为单位的二进制文件(如音乐、图片等),
现在有这么A、B两个瓶子, 想把A瓶的水通过java复制机,复制一份,放在B瓶中。
第一步插入一个导管到A瓶中:
FileInputStream fileinputstream = new FileInputStream("C:\\aaa\\bbb\\111.jpg")
第二步:将导管插入B瓶中。
FileOutputStream fileOutputStream = new FileOutputStream("C:\\aaa\\bbb\\222.jpg");
第三步开始复制转移:
int date =0;
while((fileInputStream.read())!=-1) {
fileOutputStream.write(date);
}
其实IO就是这么一个过程,
具体代码如下:
try {
FileInputStream fileInputStream = new FileInputStream("C:\\aaa\\bbb\\111.jpg");
FileOutputStream fileOutputStream = new FileOutputStream("C:\\aaa\\bbb\\222.jpg");
int date =0;
try {
while((fileInputStream.read())!=-1) {
fileOutputStream.write(date);
}
fileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}
还可以使用数组的方式,进行传输,此过程我们进行资源释放:
FileInputStream fileInputStream =null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream("C:\\aaa\\bbb\\111.jpg");
fileOutputStream = new FileOutputStream("C:\\aaa\\bbb\\111.jpg");
byte [] car = new byte[1024];
int length = 0;
while((length=fileInputStream.read(car))!=-1) {
fileOutputStream.write(car,0,length);
}
fileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}finally{
if(fileInputStream!=null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
if(fileOutputStream!=null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
二、字符流:字符流用于处理以Unicode字符为单位的文本文件(如记事本文件等)。
和上述过程是一样的:也是先进行两步建立连接,然后再进行复制传输。同样是有两种形式。接下来我们分别演示,
第一种:非数组形式
try {
FileReader fileReader = new FileReader("C:\\aaa\\bbb\\111.jpg");
FileWriter fileWriter = new FileWriter("C:\\aaa\\bbb\\222.jpg");
int data =0;
while((data =fileReader.read())!=-1) {
fileWriter.write(data);
}
} catch (Exception e) {
e.printStackTrace();
}
第二种:数组形式传输:
try {
FileReader fileReader = new FileReader("C:\\aaa\\bbb\\111.jpg");
FileWriter fileWriter = new FileWriter("C:\\aaa\\bbb\\222.jpg");
char [] car = new char [1024];
int length =0;
while(( length=fileReader.read(car))!=-1) {
fileWriter.write(car,0,length);
}
fileWriter.flush();
} catch (Exception e) {
e.printStackTrace();
}
三、缓冲流:缓冲流是一种装饰器类,目的是让原字节流、字符流新增缓冲的功能以提高读取或写入。
不仅可以修饰字节流,也可以修饰字符流,相当于在复制传输的中间加上一个中转站;
修饰字节具体代码演示如下:
try {
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("C:\\aaa\\bbb\\111.jpg"));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("C:\\aaa\\bbb\\222.jpg"));
int date =0;
try {
while((bufferedInputStream.read())!=-1) {
bufferedOutputStream.write(date);
}
bufferedOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}
修饰字符具体代码演示:
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\aaa\\bbb\\111.jpg"));
BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("C:\\aaa\\bbb\\111.jpg"));
char [] car = new char [1024];
int length =0;
while(( length=bufferedReader.read(car))!=-1) {
bufferedWriter.write(car,0,length);
}
bufferedWriter.flush();
} catch (Exception e) {
e.printStackTrace();
}
四、转换流:由于文件自身编码方式和程序运行时使用的默认编码方式不一致,致使程序读取或输出字符文件时可能会出现乱码,这时可以使用字节流操作文件,然后再将字节流转换成字符流,这一转换过程可以借助转换流实现。
具体代码如下:
try {
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\aaa\\bbb\\111.txt"),"UTF-8");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("C:\\aaa\\bbb\\111.txt"),"UTF-8");
char [] car = new char [1024];
int length =0;
while(( length=inputStreamReader.read(car))!=-1) {
outputStreamWriter.write(car,0,length);
}
outputStreamWriter.flush();
} catch (Exception e) {
e.printStackTrace();
}
五、数据流(了解):通过DataInputStream和DataOutputStream数据流可以直接操作基本数据类型和字符串。
int age = 21 ;
double price = 9.9;
try {
DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("C:\\aaa\\bbb\\111.temp"));
dataOutputStream.writeInt(age);;
dataOutputStream.writeDouble(price);;
dataOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}
try {
DataInputStream dataInputStream = new DataInputStream(new FileInputStream("C:\\aaa\\bbb\\111.temp"));
int a =dataInputStream.readInt();
double b =dataInputStream.readDouble();
System.out.println(a);
System.out.println(b);
} catch (Exception e) {
e.printStackTrace();
}