Java文件流
标签(空格分隔): java基础知识
字节流和字符流
-
流
-
java中的流是对字节序列的抽象,粗体文本在程序中所有的数据都是以流的方式进行传输或者保存的,程序需要数据的时候使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就需要使用输出流完成。
程序中的输入输出都是以流的形式保存的,流中保存的实际上全部都是字节文件。
字节流
字节输入/输出流 只能按照一个一个字节的顺序进行读入或者写出。
字节输入流
InputStream
//根据文件的大小来定义字节数组的大小,File类中的方法:public long length()
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Test13{
public static void main (String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
InputStream in = new FileInputStream(f);
byte[] b = new byte[(int) f.length()];
in.read(b);
in.close();
System.out.println(new String(b));
}
}
//但以上情况只适合知道输入文件的大小,不知道的话用如下方法:
public class Test15 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
InputStream in=new FileInputStream(f);
byte[] b=new byte[1024];
int temp=0;
int len=0;
while((temp=in.read())!=-1){//-1为文件读完的标志
b[len]=(byte) temp;
len++;
}
in.close();
System.out.println(new String(b,0,len));
}
}
字节输出流
OutputStream
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test11 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.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();
}
}
字符流
-
字符流
- 在程序中一个字符等于两个字节,那么java提供了Reader、Writer两个专门操作字符流的类。字符流的操作比字节流操作好在一点,就是可以直接输出字符串了,不用再像之前那样进行转换操作了。
字符输入流
Reader
//也可以用循环方式,判断是否读到底:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Test19 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
Reader input=new FileReader(f);
char[] c=new char[1024];
int temp=0;
int len=0;
while((temp=input.read())!=-1){
c[len]=(char) temp;
len++;
}
input.close();
System.out.println(new String(c,0,len));
}
}
字符输出流
Writer
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Test16 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
Writer out=new FileWriter(f,true);//追加
String str="Hello World";
out.write(str);
out.close();
}
}
以上所有的四个流都是抽象类
文件读写操作流程
1.使用File类打开一个文件
2.通过字节流或者字符流的子类,指定输出的位置
3.进行读/写操作
4.关闭输入/输出
**IO操作输入资源操作,一定要进行关闭**
区别
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的。
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容。
由于在所有硬盘上保存文件或者进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成的,而字符只是在内存中才会形成的,所以使用字节的操作是最多的。
如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。