先来看一下流的概念:
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,
而当程序需要将一些数据保存起来的时候,就要使用输出流完成。
程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
IO流:
字符流:主要用来处理字符或字符串,一个字符占两个字节
输入流:Reader-->BufferedReader,InputStreamReader
输出流:Writer-->BufferWriter,OutputStreamWriter,PrinterWriter,FilterWriter
字节流:主要用来处理字节byte或二进制对象
输入流InputStream-->FileInputStream,FilterInputStream,
输出流OutputStream-->FileOutputStream,FilterOutputStream
字节与字符流区别:
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容
说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容
在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。
//字节流写,读文件
public static void createFileByte(){
//创建文件
File f=new File("E:/fileTest/create.txt");
try {
//创建OutputStream子类对象FileOutputStream用来写文件内容
OutputStream out=new FileOutputStream(f,true);
//需要写入的字符串内容
String str="hello";
//转换成字节数组(对应ASCII码值)
byte[] b=str.getBytes();
//循环写入文件中
/*for(int i=0;i<b.length;i++){
out.write(b[i]);
}*/
out.write(b);
//读文件,创建InputStream子类对象FileInputStream用来读文件内容
InputStream is=new FileInputStream(f);
//创建文件内容相同大小的字节数组byte[]
byte[] inb=new byte[(int) f.length()];
//读文件内容,从输入流中读取一定数量的字节,并将其存储在缓冲区数组 inb中,以整数形式返回实际读取的字节数量
is.read(inb);
//将byte[]数组转换成String
String readValue=new String(inb);
System.out.println(readValue);
//关闭输入输出流
out.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//字符流写,读文件,字符流的操作可以直接输出字符串,不用再进行byte转换了
public static void createFileCharacter(){
File f=new File("E:/fileTest/create.txt");
try {
//向文件中写文件内容
Writer w=new FileWriter(f,true);
String s="my name is lilei";
w.write(s);
//刷新缓冲区数据,刷新文件数据,防止Reader读取不到最新数据
w.flush();
//读文件内容
Reader r=new FileReader(f);
char[] ac=new char[(int) f.length()];
r.read(ac);
String readValue=new String(ac);
System.out.println(readValue);
w.close();
//r.close();
} catch (IOException e) {
e.printStackTrace();
}
}
来源:https://www.cnblogs.com/yincan2014/p/7339857.html