posts - 14,  comments - 7,  trackbacks - 0
  2010年10月18日
       

        刚学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 迷人笑笑 阅读(856) | 评论 (0)编辑 收藏
     摘要:           我相信大多说人都对构造方法、方法不陌生,而且很了解,但我也相信有很多像我这样的没有一个很好很清晰很全面的认识,今天就把它整理如下,希望能给大家带来点方便与帮助,也希望大家多多讨论。         ...  阅读全文
posted @ 2010-11-12 16:43 迷人笑笑 阅读(39124) | 评论 (1)编辑 收藏
     摘要:        今天我们用实例程序说一下java中常见的生产者与消费者的问题。  首先看一下里面线程间的通信问题:    一个线程向数据存储空间添加数据(生产者),另一个线程从数据存储空间去出数据(消费者)。 这个程序中有两个可能出现的问题需要考虑: 1、   ...  阅读全文
posted @ 2010-11-10 23:07 迷人笑笑 阅读(2133) | 评论 (1)编辑 收藏
     摘要: 项目需求:1.病人来挂号时根据自己想找的医生挂相应的医生的号,即加到相应医生的病人队列中。                    2.医生看见自己的屏幕,点击自己的名字,得到自己相应列表的下一位病人 具体代码如下: ...  阅读全文
posted @ 2010-11-02 16:51 迷人笑笑 阅读(3389) | 评论 (1)编辑 收藏
     摘要: 1.当我们去银行办理什么业务的时候总会先在一个类似电脑的小系统上去一个号,然后等着,当被叫到时就去相应的窗口办理业务,这种排队的小系统主要用到了接口Queue,因为它符合队列的要求先进先出。 2.还有就是有种特殊情况就是,银行的金卡用户,他们的权限较高,总可以在普通用户的前面办理业务 相应代码如下: package com.dr.queue; public clas...  阅读全文
posted @ 2010-11-01 13:22 迷人笑笑 阅读(3743) | 评论 (0)编辑 收藏
代码如下:
package com.dr.exercise6;

import java.util.Scanner;

public class Login {
    
public static void main(String[] args) {
        Scanner s 
= new Scanner(System.in);
        System.out.println(
"请输入用户名:");
        String name 
= s.nextLine();
        System.out.println(
"请输入密码:");
        String password 
= s.nextLine();
        
if(name.equals("abc")&&password.equals("123")){
            System.out.println(
"欢迎登入!!");
            
        }

        
else{
            System.out.println(
"用户名或密码不正确!!");
        }


    }


}

用户名密码输入正确时:
用户名或密码输入不正确时:
posted @ 2010-10-20 16:33 迷人笑笑 阅读(600) | 评论 (0)编辑 收藏
答案是两个,现在我们具体的说一下:
String s = new String("abc");
首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。
所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字池中,文字池的一个好处就是可以把相同的字符串合并,占用一个空间,我们可以用==判断一下两个引用变量是否指向了一个地址即一个对象
public class Demo02 {
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        String s1 ="abc";
        String s2 
= "abc" ;
        
if( s1 == s2 ) System.out.println("s1,s2 refer to the same object");
        
else System.out.println("trouble");
    }

}
输出结果为:
可以看出指向了一个对象,即文字池中保存了一个对象。
二、String s = new String("abc")实际上是"abc"本身就是文字池中的一个对象,在运行 new String()时,把文字池即pool中的字符串"abc"复制到堆中,并把这个对象的应用交给s,所以创建了两个String对象,一个在pool中,一个在堆中。下面看这个程序,创建了几个对象。
public class Demo03 {
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        String s1 = new String("abc") ;
        String s2 
= new String("abc") ;
        
if( s1 == s2 )//不会执行的语句}
       System.out.println("在堆中创建了一个对象");

    }

        
else{
        System.out.println(
"在堆中创建了两个对象");    
        }

        }

}
输出结果为:
可知在堆中创建了两个对象,但是在文字池中有一个对象,所以共创建了三个对象。
三、再看下一个例子:
public class Demo04 {
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        String s = new String("abc");
        s 
= "cba";
        System.out.println(s); 
    }


}
输出结果为:
String s = new String("abc")并不是给s赋值,而是把字符串"abc"的引用交给s持有,现在把s指向字符串"cba","cba"的引用地址把"abc"的引用地址覆盖,所以输出结果为cba

最后这个输出结果的解释,希望大家指出不足!!

posted @ 2010-10-18 14:32 迷人笑笑 阅读(10609) | 评论 (0)编辑 收藏
<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(13)

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜