Java基础——iO(一)
此文为了解IO知识的基础篇,这块我看了几天,感觉和前段时间学习集合一样,零散又重要。想记录一下这块由浅入深的学习过程。所以,接下来会记录几篇学习笔记,之后会有以前深入总结。因为这块比较重要啊,所以一定要学好。
一、IO的概述
IO: (Input Output)
--- 什么是流:
一组有顺序的、有起点和终点的数据集合,如文件流、网络流
--- 流与文件的区别:
文件是数据的静态存储方法。流是数据在传输时的一种形态。
java 对数据的操作都是通过流的方式,java 用于操作流的对象都在IO包中。
流按操作数据分为:
字节流(InputStream、OutputStream) 和 字符流(Reader、Writer)
其他所有的IO操作的类都是有它 们派生出来的
凡是属于字节流的 都是以 InputStream , OutputStream 为结尾,比如 FileInputStream, FileOutputStream 等
凡是属于字符流的,都是以 Reader , Writer 为结尾 比如 FileReader, PrintWriter 等
流按流向分为:
输入流和输出流
二、字符流 Writer
字符流的结构(只以输出流为例)
Writer -- BufferedWriter
CharArrayWriter
OutputStreamWriter --FileWriter
FilterWriter //过滤流
PipedWriter //管道流
StringWriter
//例一 创建一个文件,写入一些内容 static void test() throws IOException{ Writer wr=new FileWriter("c:/1.txt"); //把原来的内容覆盖了 wr.write("这是一行文本"); wr.write("\r\n"); //写入换行符 wr.write("这是第二行文本"); //写到缓冲区中了 wr.flush(); //刷新缓冲区 wr.close(); //流使用完,一定要关闭 } //FileWriter(String fileName, boolean append) static void test2()throws IOException{ Writer wr=new FileWriter("c:/1.txt",true); //可以给第二个参数传true,表示以追回的方式写入 wr.write("这是追加方式写入的内容"); //wr.flush(); 有下面的close,这里不flush也可以 wr.close(); }
三、标准的IO异常处理
代码示例:
import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.List; //把一份名单写入文件 class Test16 { public static void main(String[] args) { List<String> nameList = new ArrayList<String>(); nameList.add("PHP"); nameList.add("Java"); nameList.add("C#"); nameList.add("C++"); Writer wr = null; try { wr = new FileWriter("名单.exe"); for (String name : nameList) { wr.write(name + "\r\n"); } } catch (Exception ex) { throw new RuntimeException(ex); } finally { try { if (wr != null) { wr.close(); } } catch (IOException ex) { throw new RuntimeException(ex); } } } } // 关键点,要在finally 中关闭资源,关闭的时候,不要忘了判断这个资源是不是null
四、字符流 Reader
//例子,从文件中读取数据
int read() 读取单个字符 //返回的是这个字符的编码值
int read(char[] cbuf) 将字符读入数组 //返回值是读到的字符个数,如果读到了末尾,返回-1(-1这个性质经常用到)
int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
//从文件读取数据 (本例是一个字符一个字符的方式读的) static void test4() throws IOException { Reader r=new FileReader("C:/名单.txt"); int ch=0; while(( ch=r.read()) !=-1 ){ System.out.println((char)ch); } }
//从文件读取数据 ,做为了一个符串打印出来 static void test5() throws IOException { Reader r=new FileReader("C:/1.txt"); char [] buff=new char[1024]; int count=r.read(buff); String str=new String(buff,0,count); System.out.println(str); r.close(); }
//例子 文件复制 ,把C盘上的某个文件复制到E盘
//这样的复制是将字符一个一个的复制,很显然,它的效率比较低!
Reader r=new FileReader("E:\\FristOne\\src\\MyProject.java"); //注意:路径的反斜杠要用转义 Writer w=new FileWriter("E:\\desc.txt"); int ch=0; while( (ch= r.read())!=-1 ){ w.write(ch); } r.close(); w.close()
既然,有一个一个的复制,我们会想,怎么样才能让复制的效率变得更加高效呢?
我们可以定义一个容器,用它去块一块的去复制,效率就会更高了。下面是图形说明:
代码示例:
Reader r=new FileReader("E:\\FristOne\\src\\MyProject.java"); Writer w=new FileWriter("E:\\desc.txt"); char [] buff=new char[1024];//定义一个容器 //定义容器之后,会发生一些情况,比如取了几次以后,剩下部分的容量少于定义的容器的容量,这时候让它再去一次势必会有空余的空间被占位。这不是我们想要的,所以就引出下面这个含参的取法。 int len=0; while( (len= r.read(buff))!=-1 ){ w.write(buff,0,len); } r.close(); w.close();
关于IO的知识确实蛮多的,下篇待续咯......