Java IO

来源:互联网 发布:java游戏设计吃豆豆 编辑:程序博客网 时间:2024/05/22 04:59

Java IO 非常看起来非常难记,难于使用,尤其是看了类图以后,大家一下就不想再深入下去了。本文试图通过一种让人容易理解的方式,来阐明JAVA IO。


Java IO 示意图



Java IO 的简单记忆方法

需要记住这5句再加上一些demo便可以整个理解Java IO了。
1. Java IO 分为字节流和字符流。 字节流按照字节byte (0~256)进行操作,字符流安装字符char  unicode进行操作。字符流有缓存,字节流没有。
2. 输入字节流直面对象的为文件FileInputStream, 字节数组ByteArrayInputStream, 管道PipedInputStream。其他为工具类,并和对应的字符流相对应。SequenceInputStream合并两个流,DataInputStream提供了操控基本数据的流,BufferedInputStream和lineNumberInputStream提供按行操作的流封装,PushBackInputStream提供unread方法回退。
3. 输入字符流和字节流对应。 提供直面对象的FileReader,CharArrayReader,StringReader, PipeReader.。其他工具类,BufferReader,LineNumberReader按行操作,PushBackReader提供unread 回退。InputStreamReader提供stream和reader转换。
4. 输出字节流。面向对象为FileOutputStream,ByteArrayOutputStream,PipedOutputStream.工具类,DataOutputStream,PrintStream提供Printf format. BufferedOutputStream.
5. 输出字符流。面向对象FileWriter,CharArrayWriter,StringWriter,PipedWriter。工具栏BufferedOutputWriter,OutputStreamWriter提供字节字符转换,PrinterWriter提供格式化。

Java IO 字节流

本节先看一些JDK流的代码,然后结合一些实例来看看各种字节输入流。
InputStream
字节流的基类抽象类InputStream

read() 抽象方法,等待子类实现
read(byte b[]) 
read(byte b[], int off, int len) 读字节到数组
long skip(long n)   跳过流中的数组,读这些字节并丢弃,返回剩下的值
int available() 剩下的字节数,抽象类中直接返回0,待子类实现
void close() 抽象类中定义了空方法,待实现。
mark reset标记,然后返回
void mark(int readlimit) 
void reset() 

ByteArrayInputStream
成员变量
buf 流的存储,byte数组
pos 当前读位置
mark mark的位置
count byte 数组的最大索引

ByteArrayInputStream(byte buf[]) 用此buf数组初始化
ByteArrayInputStream(byte buf[], int offset, int length) 用此数组的一段作为初始化
public synchronized int read() 读一个字节,byte为无符号整数0~256
FileInputStream
成员变量文件句柄fd, FileChannel channel
封装了操作系统的文件操作,故read,mark, reset等都为native 方法
Demo: FileInputStream, FileOutputStream拷贝文件
public static void testFileInputStreamCopyFile() throws IOException{File f = new File("/home/dumplog.py");InputStream is = new FileInputStream(f);//file no more than 10kbyte buf[] = new byte[10240];int len = is.read(buf);is.close();File fdest = new File("/home/dumplog2.py");OutputStream os = new FileOutputStream(fdest);os.write(buf, 0, len);os.close();System.out.println(new String(buf));}

Demo: ByteArrayInputStream,PushbackInputStream 
public static void testPushArrayInputStream() throws IOException{String demo = "hello, girl";InputStream bai = new ByteArrayInputStream(demo.getBytes());PushbackInputStream pbis = new PushbackInputStream(bai);int temp = 0;        while((temp = pbis.read()) != -1){           if(temp == ','){           pbis.unread(temp);                temp = pbis.read();                System.out.println("(back" +(char) temp + ") ");           }else{                System.out.print((char) temp);           }        }}

Demo:PipedInputStream 和PipedOutputStream
public class FIO {public static void main(String args[]) throws IOException{Sender send=new Sender();Receiver recive=new Receiver();try{   send.getPos().connect(recive.getPis());}catch (Exception e) {   e.printStackTrace();}new Thread(send).start();new Thread(recive).start();    }}class Receiver implements Runnable{private PipedInputStream pis;public PipedInputStream getPis() {return pis;}public Receiver(){this.pis = new PipedInputStream();}public void setPis(PipedInputStream pis) {this.pis = pis;}@Overridepublic void run() {byte buf[] = new byte[4096];int len=0 ;try {len = this.pis.read(buf);this.pis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("read message:"+ new String(buf,0,len));}}class Sender implements Runnable{private PipedOutputStream pos;public Sender(){pos = new PipedOutputStream();}public PipedOutputStream getPos() {return pos;}public void setPos(PipedOutputStream pos) {this.pos = pos;}@Overridepublic void run() {String msg = "message send by pipe";try {this.pos.write(msg.getBytes());this.pos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

Demo: DataInputStream 和 DataOutPutStream
public static void testDataStream() throws IOException{File f = new File("/tmp/data.txt");f.createNewFile();DataOutputStream dos = new DataOutputStream(new FileOutputStream(f));dos.writeInt(10);dos.writeDouble(20.0);dos.close();DataInputStream dis = new DataInputStream(new FileInputStream(f));int tmp = dis.readInt();double doubleTmp = dis.readDouble();System.out.println(tmp);System.out.println(doubleTmp);dis.close();}

Demo: SequenceInputStream合并流
public static void testSequenceInputStream() throws IOException{File f1 = new File("/tmp/1.txt");File f2 = new File("/tmp/2.txt");OutputStream o1 = new FileOutputStream(f1);OutputStream o2 = new FileOutputStream(f2);String f1Message = "F1 Message";String f2Message = "F2 Message";o1.write(f1Message.getBytes());o2.write(f2Message.getBytes());o1.close();o2.close();InputStream is1 = new FileInputStream(f1);InputStream is2 = new FileInputStream(f2);InputStream is = new SequenceInputStream(is2,is1);int temp = 0;byte buf[]= new byte[4096];int count=0;    while((temp =is.read()) != -1)    {        buf[count++] = (byte)temp;       //System.out.println((byte)buf);    }is1.close();is2.close();is.close();System.out.println(new String(buf,0,count));}

Demo: PrintStream格式化输出
public static void testPrintStream() throws FileNotFoundException{File f = new File("/tmp/1.txt");PrintStream ps = new PrintStream(new FileOutputStream(f,true));ps.printf("print stream print format message. %d ok, %s nice", 2, "9");ps.close();}

Demo: BufferedInputStream 带缓存读
public static void testBufferInputStream() throws IOException {File f = new File("/home/file.txt");BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));int len;//16 byte arraybyte buf[] = new byte[16];while((len=bis.read(buf))!=-1)System.out.print(new String(buf,0,len));bis.close();}

Java 字符流

Demo: FileReader
public static void testReader() throws IOException{File f = new File("/home/file.txt");Reader isr = new FileReader(f);char buf[] = new char[4096];int len = isr.read(buf);isr.close();System.out.println(new String(buf,0,len));}

Demo: StringReader,StringWriter
public static StringBuffer transform(String str) {  // lowwer case to upperStringBuffer s = null;StringReader sr = new StringReader(str);          StringWriter sw = new StringWriter();          char[] chars = new char[1024];          try {              int len = 0;              while ((len = sr.read(chars)) != -1) {                  String strRead = new String(chars, 0, len).toUpperCase();                  sw.write(strRead);                  sw.flush();              }              sr.close();              s = sw.getBuffer();            sw.close();          } catch (IOException e) {              e.printStackTrace();          } finally {              sr.close();              try {                  sw.close();              } catch (IOException e) {                  e.printStackTrace();              }          }          return s;    }  

Demo: BufferedReader
public static void testBufferReaderSystem() throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String tmp = br.readLine();br.close();System.out.println("content="+ tmp);}

Demo: PrintWriter
public static void testPrintWriter() throws IOException{File f = new File("/tmp/1.txt");CharArrayWriter caw = new CharArrayWriter();PrintWriter pw = new PrintWriter(caw);pw.printf("age:%d, face: %s", 15, "handsome");System.out.println(caw.toString());caw.close();pw.close();}

Demo: InputStreamReader,InputStreamWriter. 字节转字符的桥梁。
public static void testInputStreamReader() throws IOException{File f = new File("/home/dumplog.py");InputStream is = new FileInputStream(f);InputStreamReader isr =new InputStreamReader(is);BufferedReader fr = new BufferedReader(isr);String str;while((str=fr.readLine())!=null)System.out.println(str);}


0 0