JAVA---IO流

来源:互联网 发布:fidaonline3数据库 编辑:程序博客网 时间:2024/06/11 09:58

流:

什么是流?

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。

通俗地讲:流就是一根管道,连接着设备和程序,用于进行数据传输。

数据流的方向分为输入流和输出流;

按照处理单位的划分,分为字节流和字符流

按照功能的划分,分为节点流和处理流

节点流:可以从或向一个特定的地方(节点)读写数据

处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写

以下是字符流:

import java.io.*;public class IO {public static void main(String[]args)throws Exception{FileReader fr=new FileReader("H:/a.txt");FileWriter fw=new FileWriter("H:/b.txt");int ch;ch=fr.read();while(ch!=-1){fw.write(ch);ch=fr.read();}fw.flush();//刷新缓冲区fr.close();fw.close();}}


刷新输出流非常重要。如果服务器写入了几百个字节的请求,通常你会等待响应,然后再发送更多的数据。不过,如果输出流有有一个1024字节的缓冲区,那么这个流在发送缓冲区中的数据之前会等待更多的数据到达。在服务器响应到达之前不会向流写入更多数据,但是响应永远也不会到来,因为请求还没有发送,flush方法可以强迫缓冲的流发送数据,即使缓冲区还没有满,以此来打破这种死锁的状态


以下是字节流:

import java.io.*;public class IO {public static void main(String[]args)throws Exception{FileInputStream fr=new FileInputStream("H:/a.txt");FileOutputStream fw=new FileOutputStream("H:/b.txt");int ch;ch=fr.read();while(ch!=-1){fw.write(ch);ch=fr.read();}fw.flush();//刷新缓冲区fr.close();fw.close();}}


字符流一般用来用于文本上;字节流可用于文本,视频,图片等上

缓冲流:

缓冲流就是带有缓冲区的的输入输出流

缓冲流可以显著减少我们对IO访问的次数,保护我们的硬盘!

缓冲流本身就是处理流,缓冲流必须得依附节点流

处理流是包裹在原始节点流上的流

缓冲字节流:

import java.io.*;public class IO {public static void main(String[]args)throws Exception{BufferedInputStream bis=new BufferedInputStream(new FileInputStream("H:/a.txt"));BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("H:/b.txt"));byte buf[]=new byte[1024];int len;len=bis.read(buf);while(len!=-1){bos.write(buf,0,len);len=bis.read(buf);}bos.flush();//刷新缓冲区bis.close();bos.close();}}

缓冲字符流

import java.io.*;public class IO {public static void main(String[]args)throws Exception{BufferedReader bs=new BufferedReader(new FileReader("H:/a.txt"));BufferedWriter bw=new BufferedWriter(new FileWriter("H:/b.txt"));String str=bs.readLine();while(str!=null){bw.write(str);bw.newLine();//插入一个换行符str=bs.readLine();}bw.flush();//刷新缓冲区bs.close();bw.close();}}


数据流

DataInputStream能够以一种与机器无关的方式,直接从底层字节输入流读取JAVA基本类型和String类型的数据

DataOutputStream能够以一种与机器无关的方式,直接将JAVA基本类型和String类型写到其他的字节输出流

import java.io.*;public class IO {public static void main(String[]args)throws Exception{ByteArrayOutputStream baos=new ByteArrayOutputStream();DataOutputStream dos=new DataOutputStream(baos);int a=123456;dos.writeInt(a);byte b[]=baos.toByteArray();//返回一个字节数组ByteArrayInputStream bais=new ByteArrayInputStream(b);DataInputStream dis=new DataInputStream(bais);int n;n=dis.readInt();System.out.println(n);}}
转换流

OutputStreamWriter流是把OutputStream流转化成Writer流

InputeStreamReader流是把InputStream流转化成Reader流

import java.io.*;public class IO {public static void main(String[]args)throws Exception{BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String s=br.readLine();System.out.println(s);}}

Print流

Print流只输出不输入

PrintWriter 输出字符

PrintStream 输出字节

PrintStream只能封装OutputStream类型的字节流,PrintWriter可以封装OutputStream也可以封装Writer

import java.io.*;public class IO {public static void main(String[]args)throws Exception{PrintStream ps=new PrintStream("H:/b.txt");System.setOut(ps);System.out.println(123);}}


对象序列化

所谓序列化:就是把一个Object对象直接转化成字节流,然后把这个字节流直接写入本地硬盘或者网络中

如果想要实现对象序列化,就必须实现Serializable接口(这个接口是空的,这种接口起的作用就是标识作用,潜在含义是告诉编译器这个类是允许被序列化的)

Java中transient修饰的成员表示在对象序列化的时候不能被序列化

import java.io.*;class Person implements Serializable{String name;long phone;public Person(String name,long phone){this.name=name;this.phone=phone;}}public class IO {public static void main(String[]args)throws Exception{ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("H:/b.txt"));Person p=new Person("xiaoming",123);Person p1=null;oos.writeObject(p);ObjectInputStream ois=new ObjectInputStream(new FileInputStream("H:/b.txt"));p1=(Person)ois.readObject();System.out.println(p1.name);System.out.println(p1.phone);}}