1、io流
这几天看了io流实现输入、输出的几种方式,首先是字节流:输入流InputStream、输出流OutputStream,字节流是以一个字节(1B=8bit)进行数据传输;然后是字符流:输入流Reader、输出流Writer,字符流是以两个字节(2B=16bit)进行数据传输,其中又有高效输入输出流BuferedReader、BufferedWriter。我觉得我了解的很基础
注意字符流对象,如果不.close()关闭流,数据流会在缓存区,而如果此时需要获得数据,需要对流对象.fluse()操作来获得流中的数据
疑惑??现阶段我感觉自己还有很多搞不清楚的地方,怎么确定使用哪个流来进行数据的传输?
例如下面这段代码,使用装饰者模式,但是我应该怎么选择哪个是装饰者,哪个是被装饰者,装饰者模式是什么?
关于这种流的使用我不知道理解的对不对,你想要获得的类型流它就是装饰者,而怎么去获取这种类型流的具体实现就是被装饰者。实现语句如下:
装饰者 decorate=new 装饰者(new 被装饰者())
而这种语句的具体实现需要慢慢的熟悉IO流的API文档
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
在搜索上诉问题的答案新的问题有跳出来了,NIO、BIO是什么?在后面的学习中我将带着这些疑惑慢慢的去解决。
2、UDP
只是发,不管你接不接收得到
主要学习DatagramSocket和DatagramPacket的的用法
客户端:
InetAddress adr = InetAddress.getByName("192.168.22.222");
System.out.println(adr.getHostName());
DatagramSocket ds = new DatagramSocket();//建立udp协议对象
String s = "coming";
byte[] b = s.getBytes();
DatagramPacket dp = new DatagramPacket(b, b.length, adr, 8888);//将需要传输的内容打包并填写到指定的主机端口
ds.send(dp);//发送数据
// adr.getHostAddress();
ds.close();//关闭客户端
服务端:
DatagramSocket ds = new DatagramSocket(8888);//建立udp协议对象,并指定接收端口号
byte[] bys = new byte[1024];
DatagramPacket p = new DatagramPacket(bys, 1024);
ds.receive(p);//收到包数据
InetAddress asr = p.getAddress();
System.out.println(asr.getHostAddress());
System.out.println(new String(p.getData(), 0, p.getData().length));//解析包中的数据
ds.close();//关闭服务器端,一般并不需要
3、TCP
三次握手:
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
客户端
package com.javaSE;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PipedReader;
import java.net.Socket;
import java.net.UnknownHostException;
public class demo12 {
public static void main(String[] args) throws IOException {
// method();
//发送数据并接收从服务器返回的数据
Socket ss=new Socket("192.168.5.9", 10024);
BufferedReader is=new BufferedReader(new InputStreamReader(System.in));
OutputStream os=ss.getOutputStream();
byte[] b=is.readLine().getBytes();
os.write(b, 0, b.length);
InputStream s=ss.getInputStream();
s.read(b);
System.out.println(new String(b,0,b.length));
ss.close();
}
private static void method() throws UnknownHostException, IOException {
//发送数据
Socket se = new Socket("192.168.5.9", 10024);
OutputStream os = se.getOutputStream();
byte[] b = "im coming,tcp".getBytes();
os.write(b);
InputStream is = se.getInputStream();
byte[] b1 = new byte[1024];
while (is.read(b1) != -1) {
System.out.println(new String(b1, 0, b1.length));
}
os.close();
se.close();
}
}
服务端:
package com.javaSE;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class demo13 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
@SuppressWarnings("resource")
ServerSocket ss = new ServerSocket(10024);
Socket sc = ss.accept();
InputStream is = sc.getInputStream();
byte[] b = new byte[1024];
OutputStream os = sc.getOutputStream();
while (is.read(b) != -1) {
os.write(b, 0, b.length);
System.out.println(new String(b, 0, b.length));
}
// os.close();
sc.close();
// ss.close();
}
}
4、算法题
给定单链表,将所有奇数节点连接在一起,然后将偶数节点连接在一起。 请注意,这里我们讨论的是节点编号,而不是节点中的值。
思路:一开始我理解成了节点中的值,然后想只要发现两组不同的奇偶数排列满足,便将后面符合的数插入的前面的节点中。。。。后面去阅读别人笔记,发现没仔细审题
正解:新建两个单链表,根据遍历节点的编号依次将原有的节点插入到两个新链表中,然后合并两个新链表输出。
public ListNode oddEvenList(ListNode head) {
// write your code her
ListNode dummyOdd = new ListNode(0);
ListNode keepDummyOdd = dummyOdd;
ListNode dummyEven = new ListNode(9);
ListNode keepDummyEven = dummyEven;
ListNode pointer = head;
while (pointer != null) {
dummyOdd.next = pointer;
dummyOdd = dummyOdd.next;
dummyEven.next = pointer.next;
dummyEven = dummyEven.next;
if (pointer.next == null) {
break;
}
pointer = pointer.next.next;
}
dummyOdd.next = keepDummyEven.next;
return keepDummyOdd.next;
}