【流的概念】:
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。
程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
【字节流与字符流】:
在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。
在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream
在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)
操作流程
Java中IO操作也是有相应步骤的,以文件操作为例,主要的操作流程如下:
1.使用File类打开一个文件
2.通过字节流或字符流的子类,指定输出的位置
3.进行读/写操作
4.关闭输入/输出
【注】:IO操作属于资源操作,一定要记得关流
深入
【字节流】:
字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream
字节输出流:OutputStream
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test {
public static void main(String[] args) throws IOException {
File f = new File("D://result.txt");
OutputStream out=new FileOutputStream(f);//如果文件不存在会自动创建
String str="Hello World";
out.write(str.getBytes());//因为是字节流,所以要转化成字节数组进行输出
out.close();
}
}
以上输出只会进行覆盖,如果要追加的话,文件路径后跟true,如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test {
public static void main(String[] args) throws IOException {
File f = new File("D://result.txt");
OutputStream out=new FileOutputStream(f,true);//追加内容
String str="\r\nHello World";
byte[] b=str.getBytes();
for(int i=0;i<b.length;i++){
out.write(b[i]);
}
out.close();
}
}
【\r\n:换行】
字节输入流:InputStream
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Test {
public static void main(String[] args) throws IOException {
File f = new File("D://result.txt");
InputStream is=new FileInputStream(f);
byte[] b=new byte[1024];
int temp=0;
int len=0;
while((temp=is.read())!=-1){//-1为文件读完的标志
b[len]=(byte) temp;
len++;
}
is.close();
System.out.println(new String(b,0,len));
}
}
【字符流】:
在程序中一个字符等于两个字节,那么java提供了Reader、Writer两个专门操作字符流的类。
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Test {
public static void main(String[] args) throws IOException {
File f = new File("D://result.txt");
FileWriter fw = new FileWriter(f);
String str="Hello World";
out.write(str);
out.close();
}
}
同字节流,以上输出只会进行覆盖,如果要追加的话,文件路径后跟true,如下:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Test {
public static void main(String[] args) throws IOException {
File f = new File("D://result.txt");
FileWriter fw = new FileWriter(f,true);//追加
String str="\r\nHello World";
out.write(str);
out.close();
}
}
字符输入流:Reader
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Test {
public static void main(String[] args) throws IOException {
File f = new File("D://result.txt");
FileReader fr = new FileReader(f);
char[] c=new char[1024];
int temp=0;
int len=0;
while((temp=fr.read())!=-1){
c[len]=(char) temp;
len++;
}
fr.close();
System.out.println(new String(c,0,len));
}
}
浅出
字节流与字符流的区别:
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容
开发中究竟用字节流好还是用字符流好呢?
在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。