posts - 14,  comments - 7,  trackbacks - 0
  2010年11月2日
       

        刚学java流技术IO编程时,一下出来这么多流,很是不敏感,不感冒,在学习了这段时间,发现好多项目中的读写数据,输入输出用到的都是以前学的最基本的,但是自己却不是很理解其根本,今天就说几个流中简单但又常用的几个知识点

   Java.io包中定义了多个流类型,来实现输入输出功能:

    •  按数据流的方向不同可以分为输入流和输出流。(以程序的角度来考虑)
    • 如:输入流InputStream Reader 输出流 OutputStream Writer
    •  按处理数据单位不同可以分为字节流和字符流。
    • : 字节流 InputStream OutputStream 字符流 Reader Writer
    •  按照功能不同可以分为节点流和处理流。

        通俗的说节点流就是一个简单的输入输出流,而处理流是“连接”在已存在的字节流或处理流之上的,通过对数据的处理为程序提供更为强大的读写功能。

 我们最经常用到的节点流类型是有关文件处理的有FileReader FileWriter FileInputStream FileOutputStream

Ø          FileInputSteam FileOutputStream 类支持其父类InputStream OutputStream 所提供的数据读写方法。

Ø       注意:

§         在实例化FileInputStreamFileOutputSteam流时要用trycatch语句以处理其可能抛出的FileNotFoundException

§         在读写数据时也要用trycatch语句以处理可能抛出的 IOException

§         FileNotFoundExceptionIOException的子类

FileReader FileWriter 分别继承自ReaderWriterFileInputSteamFileOutputStream类似,所不同的时FileReaderFileWriter向文件输入和输出的数据单位为字符。

     处理流中常用到的有缓冲流 、转换流。

l          缓冲流有BufferedReader BufferedWriter BufferedInputStream BufferedOutputStream ,缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法

l          BufferedReader提供了readLine方法用于读取一行字符串(以"r"n           隔)。

l          BufferedWriter提供了newLine用于写入一个行分隔符。

l          对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法将会使内存中的数据立刻写出。

Socket编程中接受信息时,不是直接用InputStream接收,而是把内容放入缓冲之中进行读取 ,在Socket中的简单应用如下
  

package com.dr.Echo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {

    
/**
     * 
@param args
     * 
@throws IOException 
     
*/

    
public static void main(String[] args) throws IOException {
        
// TODO Auto-generated method stub
         ServerSocket server = null;
         PrintStream out 
= null;
         BufferedReader buf 
= null;
         server 
= new ServerSocket(9999);
         Socket client 
= null;
         
while(true){
             
//不断接收数据
             client = server.accept();
             
//准备好像客户端输出内容
             out = new PrintStream(client.getOutputStream());
             
//而且客户端要有输入给服务器端
             buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
             
//下面先给出一个完整的信息提示
             out.println("您好!欢迎光临:http://wwww.tstc.edu.cn");
             out.println(
"输入bye表示退出哈-");
             
while(true){
                 
//接受客户端发送而来的内容
                 String str = buf.readLine();
                 System.out.println(
"client's data is "+str);
                 
if(str == null){
                     
//如果str为空就表示退出
                     break;
                 }
else{
                     
//如果输入的是bye则表示是退出系统
                     if("bye".equals(str)){
                         
break;
                     }

                     out.println(
"xiaoxiao:"+str);
                 }

             }

             out.close();
             buf.close();
             client.close();
         }

    }


}

 

package com.dr.Echo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class EchoClient {

    
/**
     * 
@param args
     * 
@throws IOException 
     * 
@throws UnknownHostException 
     
*/

    
public static void main(String[] args) throws UnknownHostException, IOException {
        
// TODO Auto-generated method stub
         Socket client = null;
         BufferedReader buf 
= null;
         PrintStream out 
= null;
         client 
= new Socket("127.0.0.1",9999);
         buf 
= new BufferedReader(new InputStreamReader(client.getInputStream()));
         System.out.println(buf.readLine());
         System.out.println(buf.readLine());
         BufferedReader in 
= new BufferedReader(new InputStreamReader(System.in));
         
         String userInput 
= null;
         out 
= new PrintStream(client.getOutputStream());
         
while((userInput = in.readLine())!=null){
             out.println(userInput);
             System.out.println(buf.readLine());
         }

         out.close();
         in.close();
         client.close();
         
         
    }


}

   

      转换流InputStreamReader OutputStreamWriter 用于字节数据到字符数据之间的转换。其中InputStreamReader 需要和InputStream”套接OutputStreamWriter需要和OutputStream套接

      数据流DataInputStream DataOutputStream 提供了可以存取与机器无关的java原始数据类型

l              Print流:PrintWriterPrintStream都属于输出流,分别针对与字符和字节,PrintWriterPrintStream提供了重载的printPrintln方法用于多种数据类型的输出。PrintWriterPrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息。PrintWriterPrintStream有自动flush功能

l           

 这几个流的类型都是在以后的学习中经常用到的。就不一一做例子啦

 

         以后所学到的所有流类型都是继承 InputStream OutputStream Reader Writer 这四个抽象的流类型

posted @ 2011-01-18 22:26 迷人笑笑 阅读(868) | 评论 (0)编辑 收藏
     摘要:           我相信大多说人都对构造方法、方法不陌生,而且很了解,但我也相信有很多像我这样的没有一个很好很清晰很全面的认识,今天就把它整理如下,希望能给大家带来点方便与帮助,也希望大家多多讨论。         ...  阅读全文
posted @ 2010-11-12 16:43 迷人笑笑 阅读(39147) | 评论 (1)编辑 收藏
     摘要:        今天我们用实例程序说一下java中常见的生产者与消费者的问题。  首先看一下里面线程间的通信问题:    一个线程向数据存储空间添加数据(生产者),另一个线程从数据存储空间去出数据(消费者)。 这个程序中有两个可能出现的问题需要考虑: 1、   ...  阅读全文
posted @ 2010-11-10 23:07 迷人笑笑 阅读(2146) | 评论 (1)编辑 收藏
     摘要: 项目需求:1.病人来挂号时根据自己想找的医生挂相应的医生的号,即加到相应医生的病人队列中。                    2.医生看见自己的屏幕,点击自己的名字,得到自己相应列表的下一位病人 具体代码如下: ...  阅读全文
posted @ 2010-11-02 16:51 迷人笑笑 阅读(3443) | 评论 (1)编辑 收藏
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(13)

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜