一、字节输入/输出流实现数据的保存和读取
编程要求
根据提示,在右侧编辑器补充代码。 编写应用程序(SortArray.java),使用字节输入/输出流实现数据的保存和读取。 要求功能如下:
- 输入1~100之间的整型数据保存到数组(数组大小为10)中
- 将数组排序(由小到大)后的元素保存到指定的文件中
- 如果文件不存在,则创建文件
- 从文件中读取排序后的元素并按指定格式输出
- 利用异常处理机制处理可能发生的错误
测试说明
平台会对你编写的代码进行测试:
测试输入:70 94 21 43 76 60 70 37 75 80
;
预期输出: 21<37<43<60<70<70<75<76<80<94
代码
package step2;
import java.io.*;
import java.util.Scanner;
public class Encrypt {
public static void main(String[] args) throws IOException {
// 创建要发送的电报
Scanner sc = new Scanner(System.in);
String data = sc.next();
// 将电报分割成字符数组
/********** Begin **********/
char[] area = data.toCharArray();
/********** End **********/
// 打开指定存放电报的文件,如果文件不存在,则创建
File file = new File("data.txt");
if (!file.exists()) {
file.createNewFile();
}
// 循环遍历字符数组,将每个字符加密处理
for (int i = 0; i < area.length; i++) {
area[i] = (char) (area[i] ^ 'q');
}
// 利用字符输出流FileWriter将加密后的字符数组写入文件中
/********** Begin **********/
FileWriter fw = new FileWriter(file);
fw.write(area);
fw.flush();
fw.close();
/********** End **********/
// 利用字符输入流FileReader读取文件,将密文输出
/********** Begin **********/
FileReader fr1 = new FileReader(file);
char[] buf1 = new char[10];
int n;
System.out.println("密文:");
while ((n = fr1.read(buf1)) != -1) {
String s = new String(buf1);
System.out.print(s);
}
System.out.println();
fr1.close();
/********** End **********/
// 利用字符输入流FileReader读取文件,将密文转换为明文输出
/********** Begin **********/
FileReader fr2 = new FileReader(file);
char[] buf2 = new char[10];
System.out.println("明文:");
while ((n = fr2.read(buf2)) != -1) {
for (int i = 0; i < n; i++) {
buf2[i] = (char) (buf2[i] ^ 'q');
}
String s = new String(buf2);
System.out.print(s);
}
fr2.close();
/********** End **********/
}
}
二、字符输入/输出流实现发送电报
编程要求
根据提示,在右侧编辑器补充代码。
- 电报内容经过加密后使用字符输出流存储在指定的文件中
- 如果文件不存在,则创建文件
- 使用字符输入流从文件中分别读取密文和明文的内容并显示出来
- 利用异常处理机制处理可能发生的错误
注意:在对字符加密时采用了异或(^q
)的简单字符加密处理,解密时也要进行逐个字符异或(^q
)的处理。
测试说明
平台会对你编写的代码进行测试:
测试输入: 今晚10点发动总攻
预期输出: 密文: 亻昫@A烈厠務恊敊 明文: 今晚10点发动总攻
代码
package step2;
import java.io.*;
import java.util.Scanner;
public class Encrypt {
public static void main(String[] args) throws IOException {
// 创建要发送的电报
Scanner sc = new Scanner(System.in);
String data = sc.next();
// 将电报分割成字符数组
/********** Begin **********/
char[] area = data.toCharArray();
/********** End **********/
// 打开指定存放电报的文件,如果文件不存在,则创建
File file = new File("data.txt");
if (!file.exists()) {
file.createNewFile();
}
// 循环遍历字符数组,将每个字符加密处理
for (int i = 0; i < area.length; i++) {
area[i] = (char) (area[i] ^ 'q');
}
// 利用字符输出流FileWriter将加密后的字符数组写入文件中
/********** Begin **********/
FileWriter fw = new FileWriter(file);
fw.write(area);
fw.flush();
fw.close();
/********** End **********/
// 利用字符输入流FileReader读取文件,将密文输出
/********** Begin **********/
FileReader fr1 = new FileReader(file);
char[] buf1 = new char[10];
int n;
System.out.println("密文:");
while ((n = fr1.read(buf1)) != -1) {
String s = new String(buf1);
System.out.print(s);
}
System.out.println();
fr1.close();
/********** End **********/
// 利用字符输入流FileReader读取文件,将密文转换为明文输出
/********** Begin **********/
FileReader fr2 = new FileReader(file);
char[] buf2 = new char[10];
System.out.println("明文:");
while ((n = fr2.read(buf2)) != -1) {
for (int i = 0; i < n; i++) {
buf2[i] = (char) (buf2[i] ^ 'q');
}
String s = new String(buf2);
System.out.print(s);
}
fr2.close();
/********** End **********/
}
}
三、简单TCP通信
编程要求
根据提示,在右侧编辑器补充代码,使用Socket和ServerSocket套接字编程,完成简单的TCP通信。
测试说明
平台会对你编写的代码进行测试:
测试输入:张三
预期输出: 你已经连上服务器了,告诉我你的姓名... 再见:张三
代码
package step3;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
Server server = new Server();
server.start();
Scanner sc = new Scanner(System.in);
//创建客户端Socket(s),指定服务器端IP地址和端口号
/********** Begin **********/
Socket s = new Socket("127.0.0.1", 8000);
/********** end **********/
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
DataInputStream dis = new DataInputStream(s.getInputStream());
System.out.println(dis.readUTF());
String name = sc.next();
dos.writeUTF(name);
System.out.println(dis.readUTF());
s.close();
}
}
package step3;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server extends Thread {
@Override
public void run() {
try {
//创建服务器端ServerSocket(ss),指定端口号8000
/********** Begin **********/
ServerSocket ss =new ServerSocket(8000);
/********** end **********/
Socket s = ss.accept();
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
DataInputStream dis = new DataInputStream(s.getInputStream());
dos.writeUTF("你已经连上服务器了,告诉我你的姓名...");
String name = dis.readUTF();
dos.writeUTF("再见:" + name);
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、TCP通信实现奇偶数判断
编程要求
根据提示,在右侧编辑器补充代码,对输入的整数进行奇偶性判断;当输入的整数为-1时,程序结束运行。
测试说明
平台会对你编写的代码进行测试:
测试输入:1 2 3 4 -1
预期输出: 请输入一个整数,我知道是奇数还是偶数 1是...奇数 2是...偶数 3是...奇数 4是...偶数
代码
package step4;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class ClientPlus {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ServerPlus server = new ServerPlus();
server.start();
try {
//创建客户端Socket(s),指定服务器端IP地址和端口号
/********** Begin **********/
Socket s = new Socket("127.0.0.1", 8000);
/********** end **********/
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
DataInputStream dis = new DataInputStream(s.getInputStream());
//客户端通过循环依次接收服务器返回的结果,并输入新的整数传递给服务器
/********** Begin **********/
while(true){
System.out.println(dis.readUTF());
String num = sc.next();
dos.writeUTF(num);
}
/********** end **********/
} catch (EOFException e) {
} catch (IOException e) {
e.printStackTrace();
}
}
}
package step4;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerPlus extends Thread {
@Override
public void run() {
try {
/********** Begin **********/
//创建服务器端ServerSocket(ss),指定端口号8000
ServerSocket ss = new ServerSocket(8000);
/********** end **********/
Socket s = ss.accept();
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
DataInputStream dis = new DataInputStream(s.getInputStream());
ReceiveThread thread = new ReceiveThread(s, dos, dis);
thread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package step4;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
class ReceiveThread extends Thread {
DataOutputStream dos;
DataInputStream dis;
Socket s;
public ReceiveThread(Socket s, DataOutputStream dos, DataInputStream dis) {
this.s = s;
this.dos = dos;
this.dis = dis;
}
@Override
public void run() {
try {
dos.writeUTF("请输入一个整数,我知道是奇数还是偶数");
while(true) {
String num = dis.readUTF();
if("-1".equals(num)) {
s.close();
break;
}
String result = (Integer.parseInt(num)%2==0)?"偶数":"奇数";
dos.writeUTF(num + "是..." + result);
}
} catch (SocketException e) {
try {
s.close();
} catch (IOException e1) {
e1.printStackTrace();
}
} catch (IOException e) {
System.out.println("数据读取异常");
}
}
}