一:IO(输入输出流):有三种输入输出流是比较常用的:
a):第一种是inputStream和outputStream该两种类是顶层的抽象类;如果想使用的话,必须使用他的子类
b):第二种是FileInputStream和FileOutputStream该两种类是对于文件的读取所采用的类,使用方法是是:
InputStream in = new FileInputStream();
c): 第三种是ByteArrayInputStram和ByteArrayOutputStream是关于数组的,即该类的构造方法。
d):第四种是BufferedInputStream和BufferedOutStream是缓冲的数据处理。
e)第五种是DataOutputStream和DataOutputStream是一个过滤流,可以包装节点流,注意继承FilterOutStream或者FilterInputStream的是包装流。DataOutputStream和DataInputStream可以写入基本数据类型。其特点就是可以写入基本数据类型。并且写入的是二进制文件。
二:字节和字符以及比特的区别:
1.比特(bit):是计算机中最小单位,即计算机内部是二进制,只能用0和1表示,比特就是二进制中的最小单位。
2.字节(byte):一个字节是计算机文件大小的单位,一个字节占八个比特。即1 byte = 8 bit。
3.字符(char):字符是对字母,汉字和其他符号的统称。通常一个字母占用一个字节大小,一个汉字两个字节大小。字符是指计算机中使用的数字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。1个汉字字符存储需要2个字节,1个英文字符存储需要1个字节。.
注意:字节和字符没有必然联系,字节是计算机存储的基本单位。
三:
序列化:(Serializable) 一个类要想序列化,必须实现java.io.Serializabel的接口。该接口中没有定义任何方法,是一个标识性接口(Mark inteface),当一个类实现了该接口,说明这个类是可以序列化的。当一个对象被序列化的时候,只能保存其非静态变量,因为静态变量或者方法是属于类的。
例如:Student的类型继承Serizalizable接口,则该student可以序列化。
ObjectInputStream和ObjectOutputStream是两个序列化的类。其方法readObject()和writeObject()分别接收一个FileOutputStream的文件。
FileOutputStream file = new FileOutputStream(“file”);
ObjectOutputStream ofile = new ObjectOutputStream(file);
ofile.writeObject(Object obj);即可写入一个Object的对象。读取则反之。
四:
线程(Thread):实现线程有两种方法:一个是继承Thead的类,重写run()方法。一个是Runable接口。启动线程是start();
a)继承Thread的类,Thread类中有start()的方法。直接main()方法中调用MyThread.start()的方法。
b)实现Runable接口。重写Runnable的run()方法。在main()方法中生成new Thread(new MyRunnable()).start()的方法。
四:关于线程的同步(synchronized)问题;建议使用synchronized块。因为这样选择更能小范围的使用。Synchronized的使用方式是:
Synchronized(Object){
...所执行的代码
}
关于wait()和notify()的方法。wait()方法必须放在同步代码块里面,配合notify()方法,如果没有notify()方法,则wait()所执行的线程等待让出锁,却无法得到唤醒,只能一直等待,另一种机制是sleep()只是暂停线程的使用,所占用的资源并没有让出,只是暂时睡眠。
五:关于对象的复制,分为浅复制和深复制。浅复制的实现:
让想要复制的类继承Cloneable()接口,然后调用super.clone()的方法。如:
1 public class ClonetTest1 { 2 3 public static void main(String[] args) { 4 5 6 People people = new People(90,"zhangsan"); 7 8 try { 9 People people2 = (People)people.clone(); 10 System.out.println(people2.getAge()); 11 System.out.println(people2.getName()); 12 } catch (CloneNotSupportedException e) { 13 14 e.printStackTrace(); 15 } 16 } 17 } 18 19 class People implements Cloneable{ 20 21 private int age; 22 private String name; 23 24 public People(int age,String name){ 25 26 this.age = age; 27 this.name = name; 28 } 29 30 @Override 31 public Object clone() throws CloneNotSupportedException { 32 33 Object peple2 = super.clone(); 34 return peple2; 35 } 36 37 public int getAge() { 38 return age; 39 } 40 41 public String getName() { 42 return name; 43 } 44 45 }
深复制:是用序列化的方式写入Stream当中,再读出。这样可以实现深复制。
六:网络编程:此类所用到的类都在java.lang.net的包下,
如果请求远程的一个网页:可以使用这样一个方式:
1 public class UrlTest3 { 2 3 public static void main(String[] args) throws Exception{ 4 5 URL url = new URL("http://www.baidu.com"); 6 7 InputStream is = url.openStream(); 8 9 //这两行可以用上面的一行进行实现。 10 // URLConnection con = url.openConnection(); 11 // InputStream ins = con.getInputStream(); 12 13 OutputStream os = new FileOutputStream("Test.txt"); 14 15 byte[] b = new byte[2048]; 16 int length; 17 18 while((length = is.read(b, 0, b.length)) != -1){ 19 20 os.write(b, 0, length); 21 } 22 23 is.close(); 24 os.close(); 25 } 26 }
网络编程的连个协议:一个是TCP一个是UDP,TCP 是链接UDP是分散之后再传输,TCP的实现方式:
NetAddress address = new NetAddress(“”);
七:网络编程:
Tcp的实现方式的两个类是ServerSocket和Socket这两个类。
1 ServerSocket serverSocket = new ServerSocket(1997); 2 serverSocket.accept(); 3 Udp的网络实现方式:新建DatagramSocket socket = new DatagramSocket(); 4 DatagramPacket packet = new DatagramPacket(); 5 Socket.send(packet); 6 package com.koma.network5; 7 8 import java.net.DatagramPacket; 9 import java.net.DatagramSocket; 10 11 public class UdpTest2 { 12 13 public static void main(String[] args) throws Exception{ 14 15 DatagramSocket socket = new DatagramSocket(1993);//这是要接受的客户端的端口必须是指定的。 16 17 byte[] b = new byte[1024]; 18 19 DatagramPacket packet = new DatagramPacket(b,100); 20 21 socket.receive(packet); 22 System.out.println(new String(b,0,packet.getLength())); 23 24 String str = "how do you do"; 25 // 先前接收的数据包中含有地址和端口。 26 DatagramPacket packet2 = new DatagramPacket(str.getBytes(), 0,str.length(),packet.getAddress(),packet.getPort()); 27 28 socket.send(packet2); 29 socket.close(); 30 } 31 } 32 这个是另一个客户端: 33 package com.koma.network5; 34 35 import java.net.DatagramPacket; 36 import java.net.DatagramSocket; 37 import java.net.InetAddress; 38 39 public class UdpTest1 { 40 41 public static void main(String[] args) throws Exception{ 42 //新建一个Udp的数据 43 44 DatagramSocket socket = new DatagramSocket(); 45 46 String str = "hello everyone"; 47 // 封装一个数据包,通过数据包发送。其中这个数据包中含有地址和端口。 48 DatagramPacket packet = new DatagramPacket(str.getBytes(), 0, str.length(), InetAddress.getLocalHost(), 1993); 49 // 发送数据包 50 socket.send(packet); 51 // 接收数据包,把要接收到的数据包存放到一个数组中, 52 byte[] b = new byte[1024]; 53 // 新建一个数据包把要读的数据包封装到数组中 54 DatagramPacket packet2 = new DatagramPacket(b, 100); 55 socket.receive(packet2); 56 // 打印出发送的数据。 57 System.out.println(new String(b,0,packet2.getLength())); 58 socket.close(); 59 60 } 61 }
注意:关于网络的传输必须是先启动接收端即服务端,等待客户的输入,再启动客户端发送。
Junit的测试:测试私有方法应该使用反射
1 public class TestCalc extends TestCase{ 2 3 public void testAdd(){ 4 5 try { 6 7 Calc calc = new Calc(); 8 9 Class<Calc> clazz = Calc.class; 10 11 Method method = clazz.getDeclaredMethod("add", new Class[]{int.class,int.class}); 12 13 method.setAccessible(true); 14 15 int result = (int)method.invoke(calc, new Object[]{2,3}); 16 17 Assert.assertEquals(5, result); 18 19 } catch (Exception e) { 20 21 Assert.fail(); 22 } 23 } 24 }
JUnit的测试:
Junit3的测试必须满足三个条件:
1)继承TestCase父类
2)Public的
3)Void的
4)方法名必须是以test开头
Junit4加入了注解:注意不必加入继承TestCase父类,如果继承了就会判断异常时出现错误。也就是说Junit4不必继承父类