
2010年10月13日
刚学java流技术IO编程时,一下出来这么多流,很是不敏感,不感冒,在学习了这段时间,发现好多项目中的读写数据,输入输出用到的都是以前学的最基本的,但是自己却不是很理解其根本,今天就说几个流中简单但又常用的几个知识点
Java.io包中定义了多个流类型,来实现输入输出功能:
- 按数据流的方向不同可以分为输入流和输出流。(以程序的角度来考虑)
- 如:输入流InputStream Reader 输出流 OutputStream Writer
- 按处理数据单位不同可以分为字节流和字符流。
- 如: 字节流 InputStream OutputStream 字符流 Reader Writer
- 按照功能不同可以分为节点流和处理流。
通俗的说节点流就是一个简单的输入输出流,而处理流是“连接”在已存在的字节流或处理流之上的,通过对数据的处理为程序提供更为强大的读写功能。
我们最经常用到的节点流类型是有关文件处理的有FileReader FileWriter FileInputStream FileOutputStream
Ø FileInputSteam 和 FileOutputStream 类支持其父类InputStream 和OutputStream 所提供的数据读写方法。
Ø 注意:
§ 在实例化FileInputStream和FileOutputSteam流时要用try-catch语句以处理其可能抛出的FileNotFoundException。
§ 在读写数据时也要用try-catch语句以处理可能抛出的 IOException。
§ FileNotFoundException是IOException的子类
FileReader 和 FileWriter 分别继承自Reader和Writer,FileInputSteam与FileOutputStream类似,所不同的时FileReader和FileWriter向文件输入和输出的数据单位为字符。
处理流中常用到的有缓冲流 、转换流。
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流:PrintWriter和PrintStream都属于输出流,分别针对与字符和字节,PrintWriter和PrintStream提供了重载的print,Println方法用于多种数据类型的输出。PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息。PrintWriter和PrintStream有自动flush功能
l
这几个流的类型都是在以后的学习中经常用到的。就不一一做例子啦
以后所学到的所有流类型都是继承 InputStream OutputStream Reader Writer 这四个抽象的流类型
posted @
2011-01-18 22:26 迷人笑笑 阅读(873) |
评论 (0) |
编辑 收藏
摘要: 我相信大多说人都对构造方法、方法不陌生,而且很了解,但我也相信有很多像我这样的没有一个很好很清晰很全面的认识,今天就把它整理如下,希望能给大家带来点方便与帮助,也希望大家多多讨论。
...
阅读全文
posted @
2010-11-12 16:43 迷人笑笑 阅读(39153) |
评论 (1) |
编辑 收藏
摘要: 今天我们用实例程序说一下java中常见的生产者与消费者的问题。
首先看一下里面线程间的通信问题:
一个线程向数据存储空间添加数据(生产者),另一个线程从数据存储空间去出数据(消费者)。
这个程序中有两个可能出现的问题需要考虑:
1、 ...
阅读全文
posted @
2010-11-10 23:07 迷人笑笑 阅读(2152) |
评论 (1) |
编辑 收藏
摘要: 项目需求:1.病人来挂号时根据自己想找的医生挂相应的医生的号,即加到相应医生的病人队列中。
2.医生看见自己的屏幕,点击自己的名字,得到自己相应列表的下一位病人
具体代码如下:
...
阅读全文
posted @
2010-11-02 16:51 迷人笑笑 阅读(3458) |
评论 (1) |
编辑 收藏
摘要: 1.当我们去银行办理什么业务的时候总会先在一个类似电脑的小系统上去一个号,然后等着,当被叫到时就去相应的窗口办理业务,这种排队的小系统主要用到了接口Queue,因为它符合队列的要求先进先出。
2.还有就是有种特殊情况就是,银行的金卡用户,他们的权限较高,总可以在普通用户的前面办理业务
相应代码如下:
package com.dr.queue;
public clas...
阅读全文
posted @
2010-11-01 13:22 迷人笑笑 阅读(3762) |
评论 (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 迷人笑笑 阅读(616) |
评论 (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 迷人笑笑 阅读(10646) |
评论 (0) |
编辑 收藏
要求为:写一个公司员工类;
数据成员:员工号,姓名,薪水,部门;
方法:
利用构造方法完成设置信息:
A.单参,只传递员工号;
B.双参,只传递员工号、姓名;
C.四参,传递员工号、姓名、薪水、部门;
D.无参,则均为空值;
main方法中创建两个对象,分别进行验证。
package com.dr.computer;


public class Worker
{
private String id;
private String name;
private float salary;
private String department;

public Worker(String n)
{
this.setId(n);
this.setName("无名氏");
this.setSalary(0.0f);
this.setDepartment("未定");
}

public Worker(String n,String na)
{
this.setId(n);
this.setName(na);
this.setSalary(1000);
this.setDepartment("后勤");
}

public Worker (String n,String na,float sa,String dep)
{
this.setId(n);
this.setName(na);
this.setSalary(sa);
this.setDepartment(dep);
}

public Worker()
{
}

public String getId()
{
return id;
}

public void setId(String n)
{
this.id = n;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public float getSalary()
{
return salary;
}

public void setSalary(float f)
{

if(f>0.0f)
{
this.salary = f;
}
}

public String getDepartment()
{
return department;
}

public void setDepartment(String department)
{
this.department = department;
}

public void showWorker()
{
System.out.println("员工信息为:");
System.out.println("\t+--我的Id号:"+id);
System.out.println("\t+--我的名字:"+name);
System.out.println("\t+--我的工资:"+salary);
System.out.println("\t+--我的部门:"+department);
}
}

package com.dr.computer;


public class WorkerTest
{


public static void main(String[] args)
{
Worker w1 =new Worker("0001","泉水");
Worker w2 =new Worker("0002","阳光",1000.0f,"公关部");
w1.showWorker();
w2.showWorker();
}
}



posted @
2010-10-15 22:47 迷人笑笑 阅读(433) |
评论 (0) |
编辑 收藏
类是一个抽象的概念,对象则是类的具体实例,是真实的个体,比如人就是一个类,张三、李四等就是一个个真实的
具体的个体对象,人有具备所有人类通用的特征,但不能确定是哪个人,张三、李四等有具体的特征,比如身高性别,即
属性。类一种看不见摸不着的东西,对象是“有血有肉”的实物。
现实生活中到处皆对象,比如一辆汽车,一栋房子,一台电脑,一只猫。
面向对象具有封装、继承、多态三大特征。封装,即使属性用private修饰对外部不可见;继承,如人,有老人、小孩
、男人、女人,他们都是人的子类。多态包括方法的重载和对象的多态性,方法的重载就是方法名相同,但参数和类型不
同的方法,多态,即人分为老人,小孩,男人,女人等。
posted @
2010-10-15 15:13 迷人笑笑 阅读(803) |
评论 (0) |
编辑 收藏
java采用堆栈形式对数据进行存取,这样做的优点是存取速度较快,因为栈的速度比较快,仅次于寄存器的速度,堆栈的模式符合垃圾回收的机制,有利于垃圾的回收,垃圾收集器(GC)自动回收。
现在用一个小实例来感受一下java的堆栈存取,代码如下:

public class Person
{
String name;
int age;

public static void main(String[] args)
{
Person p1 = new Person();
Person p2 = null;
p2 = p1;
p1.name = "张三";
p1.age = 23;
p2.name = "李四";
p2.age = 24;
p1.say();
p2.say();
}

void say()
{
System.out.println("我的名字是:"+ name +"年龄 :"+age);
}
运行结果如下:我的名字是:李四年龄 :24
我的名字是:李四年龄 :24
可用画图来表示其堆栈的存取:其中李四把张三给覆盖啦。

修改代码如下:

public class Person
{
String name;
int age;

public static void main(String[] args)
{
Person p1 = new Person();
Person p2 = new Person();
p2 = p1;
p1.name = "张三";
p1.age = 23;
p2.name = "李四";
p2.age = 24;
p1.say();
p2.say();
}

void say()
{
System.out.println("我的名字是:"+ name +"年龄 :"+age);
}

}
运行结果也是:我的名字是:李四年龄 :24
我的名字是:李四年龄 :24
其堆栈存取用画图表示如下:其中李四把张三给覆盖啦

p2先断开自己原先的堆指向,再指向p1的指向,原先的堆空间被释放。
posted @
2010-10-13 08:33 迷人笑笑 阅读(987) |
评论 (3) |
编辑 收藏