一、引言
趁着年后的这点时间,抓紧点时间回顾下javase中的IO流,以往都是用到那些常用的IO类,这次来个全点的,有不对的地方还请大神指正一下,做到坚持写博的习惯来。。。。。。
回归正题,IO流顾名思义,就是输入流(input)与输出流(output),我们可以通过IO流中的一些类来实现从程序中读取外部的数据或者通过程序输出到外部的设备中
在IO流中我们可以进行分类,分别可以按照数据流的方向和数据单位进行分类,分类如下:
输入流 输出流
字节流 InputStream OutputStream
字符流 Reader Writer
上述四大基本流可以交叉进行连接
之前查看源码时发现上述四大基本流都是抽象的,不能直接使用,所以在他们的基础上,又派生出了很多具体功能的子类
注:在字节流和字符流中,1字符 = 2字节 、 1字节(byte) = 8位(bit) 、 一个汉字占两个字节长度,常识经常忘记
二、字符流代码示例
1、输出字符数据到文件中
以前对这些流总是弄混,后来发现我们可以从需求中找到一些规律,例如此刻的需求是需要字符数据到文件中,所以需要联想到Writer--->OutputStreamWriter--->FileWriter
流在读取文件时候,如果文件不存在则会自动的生成一个新的文件,如果已经存在,默认情况下会覆盖该文件,如果不想覆盖,需要在构造方法中进行明确的指定
Class FileWriterDemo{
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("D:\123.txt");
fw.write("hello world!");
fw.flush(); //刷新缓冲区,可以多次写入多次刷新,刷新后可以再次写入数据
fw.write("beichen");
fw.close(); //flush和close的区别:flush刷新后可以继续输入,close刷新后不能继续输入。
}
}
2、从文件中读取数据
按照上面的套路,我们可以分析出需要使用Reader -- InputStreamReader -- FileReader
Class FileReaderDemo{ public static void main(String[] args) { try { FileReader fr = new FileReader("D:\123.txt");char
[] ch=
new
char
[
100
];
Reader read=
new
FileReader(f);
int
temp=
0
;
int
count=
0
;
while
((temp=read.read())!=(-
1
)){
ch[count++]=(
char
)temp;
}
read.close();
System.out.println(
"内容为"
+
new
String(ch,
0
,count));
} catch (IOException e) { system.out.println('失败') } } }
三、字节流代码示例
对于电脑来讲,电脑只认识0和1,归根结底是对字节的处理
1、复制文件
Class FileCopy{ public static void main(String[] args){ FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("D:\123.txt"); fos = new FileOutputStream("D:\1.txt"); byte[] copy = new byte[1024]; int len = 0; while((len=fis.read(copy))!=-1) { fos.write(copy,0,len); } } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("复制文件异常"); } finally { try { if(fis!=null) fis.close(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("读取流"); } } } }
四、字符流缓冲区代码示例
字符流的缓冲区可以分成:BufferReader、BufferWriter
先引用JDK文档概述:
对BufferReader,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
对BufferWriter,将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
综上我们可以看出来,缓冲区的出现时为了提高流的操作效率而出现的,在缓冲区中封装了一个数组,存入数据后可以一次取出
class BufferedReaderDemo { public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader( newInputStreamReader(System.in)); String str = null; System.out.println("请输入内容"); try{ str = buf.readLine(); }catch(IOException e){ e.printStackTrace(); } System.out.println("你输入的内容是:" + str); } }
五、缓冲区字节流代码示例
根据上面的规则我们也可以在文档出找出缓冲区的字节流分别是:BufferedInputStream、BufferedOutputStream
在此我就不进行代码的演示,可以参考缓冲区字符流进行编写