概念
Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中。其中,
所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类;
而所有输出流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类。
【首先需要明白的是:流是干什么的???(为了永久性的保存数据)
根据数据流向的不同分为输入流和输出流;
根据处理数据类型的不同分为字符流和字节流;
】
【然后需要明白的是输入模式和输出模式是谁流向谁:
InputStream(字节输入流)和Reader(字符输入流)通俗的理解都是读(read)的。
OutputStream(字节输出流)和Writer(字符输出流)通俗的理解都是写(writer)的。
】
最后下面搞清楚各种流的类型的该怎么用,谁包含谁,理清思路。
字节流
字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream
2.实例:
(1)FileInputStream的单个字节读取,FileOutputStream的单个字节写入:
//输出流
public class fos_demo {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt", true);
//FileOutputStream()后面加true指文件后面可追加
int a = fis.read();//单个读取输入流字节
System.out.println(a);
int b = fis.read();
System.out.println(b);
int c = fis.read();
System.out.println(c);
fos.write(97);//单个读出字节
fos.write(98);
fos.write(99);
fis.close();//关闭输出流
fos.close();//关闭输出流
}
}
(2)FileInputStream和FileOutputStream进行拷贝文本或者图片或者歌曲(以图片为例)
public class copy_demo1 {
public static void main(String[] args) throws IOException{
copy_2();
}
public static void copy_2() throws IOException{
FileInputStream fis= new FileInputStream("aaa.jpg");
FileOutputStream fos = new FileOutputStream("copy1.jpg");
int b;
while((b=fis.read())!=-1){
fos.write(b);
}
fis.close();
fos.close();
}
}
(3)FileInputStream和FileOutputStream定义小数组进行操作:
//拷贝图片
package IO;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Array_copy {
public static void main(String[] args) throws IOException {
FileInputStream fis= new FileInputStream("aaa.jpg");
FileOutputStream fos= new FileOutputStream("copy3.jpg");
byte[] bytes = new byte[1024 * 8];//自定义字节大小
int len;
while ((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fis.close();
fos.close();
}
}
(4)关于buffer
package IO;
import java.io.*;
//Buffer 相当于缓冲池 输入输出的转化
public class Buffer_demo {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("ren.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.jpg"));
int len;
while((len=bis.read())!=-1){
bos.write(len);
}
bis.close();
bos.close();
}
}
//读文件 public class Demo_FileReader { public static void main(String[] args) throws Exception { FileReader reader = new FileReader("demo.txt"); int len; while ((len=reader.read())!=-1){ System.out.println((char) len); } reader.close(); } //写文件 public class Demo_FileWriter { public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("pao.txt"); fw.write("哈哈哈哈哈哈");; fw.write(97); fw.close(); } }
2.字符流是不可以拷贝非纯文本的文件(如图片)
public static void copy_2() throws IOException{ BufferedReader br = new BufferedReader(new FileReader("aaa.jpg")); BufferedWriter bw = new BufferedWriter(new FileWriter("copy2.jpg")); int len; while ((len = br.read()) != -1) { bw.write(len); } br.close(); bw.close(); }
3.关于文本行(line)
//读取一个文本行 public class Buffered_demo { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("copy3.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("line.txt")); String line; while((line=br.readLine())!=null){ bw.write(line); } br.close(); bw.close(); } //使用默认输入缓冲区的大小创建新的行编号 reader。 public class Linenum_Demo { public static void main(String[] args) throws IOException { LineNumberReader lr = new LineNumberReader(new FileReader("copy3.txt")); String line; lr.setLineNumber(2); while((line=lr.readLine())!=null){ System.out.println(lr.getLineNumber()+" "+line); } lr.close(); }
字节流与字符流的区别
字节流和字符流使用是非常相似的,那么除了操作代码的不同之外,还有哪些不同呢?
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容
那开发中究竟用字节流好还是用字符流好呢?
在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。
如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。