阻塞与非阻塞首要是从 CPU 的耗损上来说的,阻塞就是 CPU 停下来守候一个慢的操纵完成 CPU 才接着完成其余的事。非阻塞就是在这个慢的操纵在执行时 CPU 去干其余此外事,等这个慢的操纵完成时,CPU 再接着完成后续的操纵。固然外貌上看非阻塞的方法可以明明的进步 CPU 的操作率,可是也带了其它一种效果就是体系的线程切换增进。增进的 CPU 行使时刻能不能赔偿体系的切换本钱必要好好评估。
2.3 同/异、阻/非堵塞 组合
同/异、阻/非堵塞的组合,有四种范例,如下表:
三、优雅的文件读写
Java 7 之前文件的读取是这样的:
- // 添加文件
- FileWriter fileWriter = new FileWriter(filePath, true);
- fileWriter.write(Content);
- fileWriter.close();
- // 读取文件
- FileReader fileReader = new FileReader(filePath);
- BufferedReader bufferedReader = new BufferedReader(fileReader);
- StringBuffer bf = new StringBuffer();
- String str;
- while ((str = bufferedReader.readLine()) != null) {
- bf.append(str + "n");
- }
- bufferedReader.close();
- fileReader.close();
- System.out.println(bf.toString());
Java 7 引入了Files(java.nio包下)的,大大简化了文件的读写,如下:
- // 写入文件(追加方法:StandardOpenOption.APPEND)
- Files.write(Paths.get(filePath), Content.getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND);
- // 读取文件
- byte[] data = Files.readAllBytes(Paths.get(filePath));
- System.out.println(new String(data, StandardCharsets.UTF_8));
读写文件都是一行代码搞定,没错这就是最优雅的文件操纵。
Files 下尚有许多有效的要领,好比建设多层文件夹,写法上也简朴了:
- // 建设多(单)层目次(假如不存在建设,存在不会报错)
- new File("D://a//b").mkdirs();
四、Socket 和 NIO 的多路复用
本节带你实现最基本的 Socket 的同时,同时会实现 NIO 多路复用,尚有 AIO 中 Socket 的实现。
4.1 传统的 Socket 实现
接下来我们将会实现一个简朴的 Socket,处事器端只发给客户端信息,再由客户端打印出来的例子,代码如下:
- int port = 4343; //端标语
- // Socket 处事器端(简朴的发送信息)
- Thread sThread = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- ServerSocket serverSocket = new ServerSocket(port);
- while (true) {
- // 守候毗连
- Socket socket = serverSocket.accept();
- Thread sHandlerThread = new Thread(new Runnable() {
- @Override
- public void run() {
- try (PrintWriter printWriter = new PrintWriter(socket.getOutputStream())) {
- printWriter.println("hello world!");
- printWriter.flush();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- });
- sHandlerThread.start();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- });
- sThread.start();
- // Socket 客户端(吸取信息并打印)
- try (Socket cSocket = new Socket(InetAddress.getLocalHost(), port)) {
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(cSocket.getInputStream()));
- bufferedReader.lines().forEach(s -> System.out.println("客户端:" + s));
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- 挪用 accept 要领,阻塞守候客户端毗连;
- 操作 Socket 模仿了一个简朴的客户端,只举办毗连、读取和打印;
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|