IO流
IO流简介
- IO流:Java对数据的操作是通过流的方式,IO流就是处理设备之间的数据传输。
- 输入流InputStream(读取数据) 输出流OutStream(写数据)
- 字节流可以操作任何数据 字符流只能操作字符数据
FileInputStream
文件输入流FileInputStream用于读取文件的原始字节流。
构造方法:FileInputStream(File file)
FileInputStream(String name)
方法:Int read()
读取一个字节
FileInputStreamDemo1.java*
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo1 {
public static void main(String[] args) throws IOException {
//创建文件输入流对象
FileInputStream fis1 = new FileInputStream("a.txt");
//读取a.txt文件数据(每读取一个字节返回一个int数值)
int a=0;
while((a=fis1.read())!=-1){
System.out.println(a);
}
//创建文件对象
File file = new File("b.txt");
//创建文件输入流对象
FileInputStream fis2 = new FileInputStream(file);
//读取b.txt文件数据
int b;
while ((b=fis2.read())!=-1){
System.out.println(b);
}
//关闭流
fis1.close();
fis2.close();
}
}
FileOutputStream
文件输出流FileOutputStream用于向文件中写入数据
构造方法:FileOutputStream(File file)
FileOutputStream(String name)
方法:write(int b)
每次向文件中写入一个字节 write(byte[] b)
每次向文件中写入多个字节
FileOutputStreamDemo1.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo1 {
public static void main(String[] args) throws IOException {
File file = new File("a.txt");
FileOutputStream fos1 = new FileOutputStream(file);
fos1.write(65);//向a.txt文件中写入'A'
fos1.close();
FileOutputStream fos2 = new FileOutputStream("b.txt");
byte[] b={65,66,67,68,69,70};
fos2.write(b);//向b.txt文件中写入"ABCDDEF"
fos2.close();
}
}
缓冲区思想
拷贝文件,利用文件输入流读取文件数据,再利用文件输出流向文件中写入数据。
- CopeDemo1.java (该方法每读取一个字节写入一个字节,速度慢)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopeDemo1 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/1(副本).jpg");
int a = 0;
while ((a = fis.read()) != -1) {
fos.write(a);
}
System.out.println("图片拷贝成功!");
fis.close();
fos.close();
}
}
- CopeDemo2.java (利用available()方法,返回文件大小,只适合小文件,若文件太大会造成内存溢出)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopeDemo2 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
int size = fis.available();
byte[] bytes = new byte[size];
fis.read(bytes);
FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/11(副本).jpg");
fos.write(bytes);
System.out.println("图片拷贝成功!");
fis.close();
fos.close();
}
}
- CopeDemo3.java (自定义缓存区大小,先读取一个缓存区大小数据,再进行写入,再继续读取写入,知道完后为止)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopeDemo3 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/1(副本).jpg");
byte[] bytes = new byte[1024*8];//自定义缓存区大小
int size=0;
while((size=fis.read(bytes))!=-1){
fos.write(bytes,0,size);
}
System.out.println("图片拷贝成功!");
fis.close();
fos.close();
}
}
BufferedInputStream
-
BufferedInputStream内置了一个缓冲区(数组)
-
当使用BufferedInputStream读取一个字节时,BufferedInputStream会一次性从文件中读取8192个(8Kb), 存在缓冲区中,直到缓冲区装满了, 才重新从文件中读取下一个8192个字节数组
-
向流中写入字节时, 不会直接写到文件, 先写到缓冲区中直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里
CopeDemo4.java
import java.io.*;
public class CopeDemo4 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:/Users/Jascen/Desktop/1.jpg");
BufferedInputStream bis=new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("C:/Users/Jascen/Desktop/1(副本).jpg");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int a=0;
while((a=bis.read())!=-1){
bos.write(a);
}
System.out.println("图片拷贝成功!");
bis.close();
bos.close();
}
}
flush()方法
用来刷新缓冲区的,把内部buf[] 变量的数据写入文件,刷新后可以再次写入数所
close()方法
-
用来关闭流释放资源的
-
如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写入数据