zoukankan      html  css  js  c++  java
  • JAVA I/O流 之入门

    I/O流分类:

    • 根据处理的数据类型不同
      • 字节流
      • 字符流
    • 根据流向不同
      • 输入流
      • 输出流
    • 根据功能不同
      • 节点流:直接与数据源相连,读入或读出。
      • 处理流:直接使用节点流,读写不方便,为了更快的读写文件,才有了处理流。
        与节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。

    字符流由来
    因为文件编码的不同,而有了对字符进行高效操作的字符流对象。
    原理:其实就是基于字节流读取字节时,去查了指定的码表。

    字节流和字符流的区别
      1.字节流读取的时候,读到一个字节就返回一个字节。
      字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时,先去查指定的码表,将查到的字符返回。

      2.字节流可以处理所有类型数据,如图片,mp3,avi
       字符流只能处理字符数据。

    结论:只要是处理纯文本数据,就要优先考虑使用字符流。除此之外都用字节流。

    下图并不是按照继承关系画的。

    1、基本流 FileInputStream和FileOutputStream

    节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。

    将字符串写入特定文件,注意write方法只接收字符数组。

    FileOutputStream fos;  
    try {  
    	fos = new FileOutputStream("test.txt");
    	fos.write("www.cnblogs.com".getBytes());  
    	fos.close();  
    } catch (FileNotFoundException e) {  
    	e.printStackTrace();  
    } catch (IOException e) {  
    	e.printStackTrace();  
    }
    

    2、处理流 BufferedInputStream和BufferedOutputStream

    过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。

    try {			
    	BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt"));
    	bos.write("www.cnblogs.com".getBytes());
    	bos.close();
    } catch (FileNotFoundException e) {
    	e.printStackTrace();
    } catch (IOException e) {
    	e.printStackTrace();
    }
    

    3、DataInputStream和DataOutputStream

    过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。

    try {
    	FileOutputStream fos = new FileOutputStream("test.txt "); // 获得写入文件功能
    	BufferedOutputStream bos = new BufferedOutputStream(fos); // 获得缓冲功能
    	DataOutputStream dos = new DataOutputStream(bos); // 获得写入基本类型功能
    
    	byte b = 3;
    	short s = 4;
    	int i = 78;
    	long l = 100000;
    	char ch = 'a';
    	boolean bl = false;
    	float f = 4.5f;
    	double d = 4.0001;
    
    	/*
    	 * 将8种基本类型的对象写入文件中
    	 */
    	dos.writeByte(b);
    	dos.writeShort(s);
    	dos.writeInt(i);
    	dos.writeLong(l);
    	dos.writeChar(ch);
    	dos.writeBoolean(bl);
    	dos.writeFloat(f);
    	dos.writeDouble(d);
    	dos.close();
    } catch (FileNotFoundException e) {
    	e.printStackTrace();
    } catch (IOException e) {
    	e.printStackTrace();
    }
    

    4、PipedInputStream和PipedOutputStream

    管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。

    import java.io.IOException;
    import java.io.PipedInputStream;
    import java.io.PipedOutputStream;
    
    public class PipedStreamDemo {
    	class Producer extends Thread {
    		private PipedOutputStream pos;
    		public Producer(PipedOutputStream pos) {
    			this.pos = pos;
    		}
    		@Override
    		public void run() {
    			try {
    				pos.write("hello,I am Producer".getBytes());
    				pos.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    
    		}
    	}
    
    	class Consumer extends Thread {
    		private PipedInputStream pis;
    		public Consumer(PipedInputStream pis) {
    			this.pis = pis;
    		}
    		public void run() {
    			try {
    				byte[] buf = new byte[100];
    				int len = pis.read(buf);
    				System.out.println(new String(buf, 0, len));
    				pis.close(); // 关闭输入流
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	
    	public static void main(String[] args) {
    		PipedStreamDemo demo = new PipedStreamDemo();
    		PipedOutputStream pos = new PipedOutputStream();
    		PipedInputStream pis = new PipedInputStream();
    		try {
    			pos.connect(pis);
    			// pis.connect(pos); 二选一即可
    			Producer producer = demo.new Producer(pos);
    			producer.start();
    			Consumer consumer = demo.new Consumer(pis);
    			consumer.start();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    	}
    
    
    }
    

    其他的例子我就不一一列举,网上资料很多,或者直接看API,下面主要学习下NIO的知识。

  • 相关阅读:
    编程的核心思维
    对编程语言的一点总结
    End Poem
    linux下的errno对照表
    C++中的三个特殊宏:__FILE__,__FUNCTION__和__LINE__
    算法——从斐波那契数列谈起(一)
    [题解][HNOI2002][Luogu P2234] 营业额统计
    用STL水平衡树的题
    浅谈C++的智能指针
    cnblog代码高亮优化(tomorrow主题)
  • 原文地址:https://www.cnblogs.com/tina-smile/p/5243131.html
Copyright © 2011-2022 走看看