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()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写入数据