Java的IO流_每天小小的改变,可以改变世界!

来源:互联网 发布:新的邮政软件 编辑:程序博客网 时间:2024/05/22 16:48

Java流式输入/输出原理
概念:用以获取不同种类的数据,程序中通过标准的方法输入或输出数据
1、输入/输出流的分类
按照数据流的方向可以分为输入流和输出流。
按照处理数据单位不同可以分为字节流和字符流。
按照功能不同可以分为节点流和处理流。
1.1、站在程序的角度上来说:字节流分为原文件指向程序读取的为输入流,反之
1.2、原始数据叫做字节流,字符流是一个字节一个字节的读
1.3、以Stream结尾的全是字节流,最原始的读取数据关系。
<————————分割线———————————->
节点流和处理流
1、节点流为可以从一个特定的数据源(节点)读写数据(如:文件,内存)
节点流图
2、处理流是“连接在已存在的流”(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
这里写图片描述
3、InputStream
概念:继承自InputStream的流都是用于向程序中输入数据的单位为字节(8bit);深色的为节点流,浅色的为处理流。这里写图片描述
4、OutputStream
继承自OutputStream的流是用于程序中输入数据,且数据的单位为字节(8bit);深色为节点流,浅色为处理流。这里写图片描述
5、Reader
继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit)深色为节点流,浅色为处理流。
这里写图片描述
6、访问文件
FileInputStream和FileOutputStream分别继承来自InputStream和OutoutStream,用于向文件中输入和输出字节。

public class TestFileWriter {    public static void main(String[] args) {       FileReader fr=null;    int c=0;        try {       fr=new FileReader("E:/Android开发/workspace_从入门到精通" +           "/hk_09/src/com/itheima/Student/TestFileWriter.java");  int in=0;      while ((c=fr.read())!=-1) {            System.out.println(c);      }          fr.close();   } catch (Exception e) {        System.out.println("找不到指定路径"+e.getMessage());    }            }      }

7、缓冲流
缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率

public class TestFileWriter {    public static void main(String[] args)  {       int c=0;        try {     FileInputStream  fr=new FileInputStream("E:/Android开发/workspace_从入门到精通" +      "/hk_09/src/com/itheima/Student/TestFileWriter.java");    BufferedInputStream bf = new BufferedInputStream(fr);       try {        System.out.println((char)bf.read());        bf.mark(100);// 直接读标记为100的信息        for (int i = 0; i <=10 &&(c=bf.read())!=-1; i++) {            System.out.print((char)c+"");        }        System.out.println();        bf.reset();// 返回标记点        for (int i = 0; i <=10 &&(c=bf.read())!=-1; i++) {            System.out.print((char)c+"");        }        bf.close();        fr.close();    } catch (FileNotFoundException e) {            e.printStackTrace();}        }catch (IOException e) {        e.printStackTrace();    }    }}

8、转换流
1、InputStreamReader和OutputStreamWriter用于字节数据到字符数据之前的转换
2、InputStreamReader需要和InputStream“套接”。
3、OutputStreamReader需要和OutputStream“套接”。
4、转换流在构造时可以指定其编码集合,例如:

InputStream isr=newInputStreamReader(System.in,“ISO8859_1”)

InputStreamReader将字节流转换成字符流。是字节流通向字符流的桥梁。若不指定字符编辑码,则默认GBK。
9、数据流
1、DataInputStream 和DataOutStream分别继承自InputStream和OutputStream,它属于处理流,需要分别“套接”在InputStream和OutputStream类型的节点流上。
2、建议先写进去的数据最好是在读的时候先读

public class TesrtDataStream {  public static void main(String[] args) {        ByteArrayOutputStream bos=new         ByteArrayOutputStream();     DataOutputStream dos=new DataOutputStream(bos);        try {            dos.writeDouble(Math.random());            dos.writeBoolean(true);        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());            System.out.println(bis.available());            DataInputStream dis=new DataInputStream(bis);            //先写进去的先读出来            System.out.println(dis.readDouble());            System.out.println(dis.readBoolean());     dos.close();             dis.close();     } catch (IOException e) {                         e.printStackTrace();               }                            }        }

10、Object流(也叫序列化)
1、直接将Object写入或读出
2、transient关键字:序列化对象的时候,这个属性就不会序列化到指定的目的地中

public static void main(String[] args) {                T t = new T();                try {                FileOutputStream fos=new FileOutputStream("d:/bak/java.dat");                ObjectOutputStream oos = new ObjectOutputStream(fos);                oos.writeObject(t);                oos.flush();                oos.close();                FileInputStream fis = new FileInputStream("d:/bak/java.dat");                ObjectInputStream ois = new ObjectInputStream(fis);              T tr = (T) ois.readObject();              System.out.println(t.d+"---"+"---"+t.s+"-----"+t.k);                } catch (Exception e) {                    e.printStackTrace();                }               }        }              class  T implements Serializable{                int j=9;                double d=2.3;                String s="Hello Wrold";                 transient int k=25;}
原创粉丝点击