杂项
国际化
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.poorpool.demo;
import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle;
public class HelloDemo { public static void main(String[] args) throws Exception { ResourceBundle resourceBundle = ResourceBundle.getBundle("com.poorpool.resource.Ds", Locale.US); String str = resourceBundle.getString("hello.msg"); System.out.println(MessageFormat.format(str, "poorpool")); } }
|
ThreadLocal
先来看一段明显错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package com.poorpool.demo;
class Message { private String content;
public String getContent() { return content; }
public void setContent(String content) { this.content = content; } }
class Resource { public static Message message; }
class MessagePrint { public static void print() { System.out.println(Resource.message.getContent()); } }
public class HelloDemo { public static void main(String[] args) throws Exception { String[] vals = new String[]{"poorpool", "thank", "you"}; for(String val : vals) { new Thread(()->{ Resource.message = new Message(); Resource.message.setContent(val); MessagePrint.print(); }).start(); } } }
|
输出全是you。
用ThreadLocal每个线程就能保存自己的东西:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| package com.poorpool.demo;
class Message { private String content;
public String getContent() { return content; }
public void setContent(String content) { this.content = content; } }
class Resource { public static final ThreadLocal<Message> MESSAGES = new ThreadLocal<>();
}
class MessagePrint { public static void print() { System.out.println(Resource.MESSAGES.get().getContent()); } }
public class HelloDemo { public static void main(String[] args) throws Exception { String[] vals = new String[]{"poorpool", "thank", "you"}; for(String val : vals) { new Thread(()->{ Resource.MESSAGES.set(new Message()); Resource.MESSAGES.get().setContent(val); MessagePrint.print(); }).start(); } } }
|
Timer类
干守护线程类似的任务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.poorpool.demo;
import java.util.Timer; import java.util.TimerTask;
class TimeThread extends TimerTask {
@Override public void run() { System.out.println("定时任务"); } } public class HelloDemo { public static void main(String[] args) throws Exception { Timer timer = new Timer(); timer.schedule(new TimeThread(), 1000, 2000); } }
|
schedule方法有挺多,可以看看。
流
OutputStream字节输出流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package com.poorpool.demo;
import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream;
public class HelloDemo { public static void main(String[] args) throws Exception { File file = new File("oicode" + File.separator + "20200515" + File.separator + "qwq.txt"); if(!file.getParentFile().exists()) file.getParentFile().mkdirs(); OutputStream output = new FileOutputStream(file); output.write("yxchen.net\n".getBytes()); output.close(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.poorpool.demo;
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream;
public class HelloDemo { public static void main(String[] args) { File file = new File("qwq.cpp"); try(InputStream inputStream = new FileInputStream(file)) { StringBuffer buffer = new StringBuffer(); byte[] bytes = new byte[10]; int len = 0; while((len=inputStream.read(bytes, 0, 10))>=0) buffer.append(new String(bytes, 0, len)); System.out.println(buffer); } catch (Exception e) { e.printStackTrace(); }
} }
|
Writer字符输出流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.poorpool.demo;
import java.io.*;
public class HelloDemo { public static void main(String[] args) { File file = new File("qwq.txt"); try(Writer writer = new FileWriter(file)) { writer.write("poorpool\n"); writer.write("hello!\n"); writer.append("qwq\n").append("233\n"); } catch (Exception e) { e.printStackTrace(); }
} }
|
Reader字符输入流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package com.poorpool.demo;
import java.io.*;
public class HelloDemo { public static void main(String[] args) { File file = new File("qwq.txt"); try(Reader reader = new FileReader(file)) { char []data = new char[5]; StringBuffer buffer = new StringBuffer(); int len = 0; while((len=reader.read(data, 0, 5))>=0) buffer.append(data, 0, len); System.out.println(buffer); } catch (Exception e) { e.printStackTrace(); }
} }
|
字节流和字符流的区别
因为字节流是字节,字节输出流便可以直接与目标介质进行输出控制。字符流要有一个内存缓冲区,flush一下才会写入目标介质。具体地,写了不close,字节输出流的文件有东西,字符输出流的文件没东西。中文主要用字符输出流。
转换流
顺带提一下transferTo。这样能很轻松实现文件复制。
1 2 3 4 5 6 7 8 9 10 11
| package com.poorpool.demo;
import java.io.*;
public class HelloDemo { public static void main(String[] args) throws Exception { InputStream inputStream = new FileInputStream(new File("cpt1-1.png")); OutputStream outputStream = new FileOutputStream(new File("qwq.png")); inputStream.transferTo(outputStream); } }
|
内存流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package com.poorpool.demo;
import java.io.*;
public class HelloDemo { public static void main(String[] args) throws Exception { InputStream input = new ByteArrayInputStream("poorpool".getBytes()); OutputStream output = new ByteArrayOutputStream(); int data = 0; while((data = input.read())>=0) { output.write(Character.toUpperCase(data)); } System.out.println(output); input.close(); output.close(); } }
|
还有管道流,用于多线程or进程之间的输入输出。这个不写了。
RandomAccessFile
实现文件的随机读取。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| package com.poorpool.demo;
import java.io.*;
public class HelloDemo { public static final int MAX_LENGTH=10; public static String addEscape(String x) { StringBuffer buffer = new StringBuffer(x); while(buffer.length()<MAX_LENGTH) buffer.append(" "); return buffer.toString(); } public static void writes() { File file = new File("qwq.txt"); try(RandomAccessFile raf = new RandomAccessFile(file, "rw")) { String[] names = new String[]{"poorpool", "qwq", "qaq"}; int[] ages = new int[]{12, 2, 999}; for(int i=0; i<names.length; i++) { raf.write(addEscape(names[i]).getBytes()); raf.writeInt(ages[i]); } } catch (Exception e) { e.printStackTrace(); } } public static void reads() { File file = new File("qwq.txt"); try(RandomAccessFile raf = new RandomAccessFile(file, "r")) { raf.skipBytes(MAX_LENGTH+4); byte[] data = new byte[MAX_LENGTH]; raf.read(data); System.out.println(new String(data).trim()); System.out.println(raf.readInt()); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { writes(); reads(); } }
|
打印流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package com.poorpool.demo;
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter;
public class HelloDemo { public static void main(String[] args) throws Exception { File file = new File("qwq.txt"); PrintWriter pw = new PrintWriter(new FileOutputStream(file)); pw.println(10); pw.printf("hello %s, your age is %d\n", "porp", 16); pw.close(); } }
|
Scanner
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.poorpool.demo;
import java.util.Scanner;
public class HelloDemo { public static void main(String[] args) throws Exception { Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\n"); while(scanner.hasNext()) System.out.println(scanner.next()); } }
|
这个最好使。不行就BufferReader。
输出可以考虑PrintWriter。
序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package com.poorpool.demo;
import java.io.*;
class Book implements Serializable { private String name; private String author; private double price;
public Book(String name, String author, double price) { this.name = name; this.author = author; this.price = price; }
@Override public String toString() { return "Book{" + "name='" + name + '\'' + ", author='" + author + '\'' + ", price=" + price + '}'; } }
public class HelloDemo { public static void main(String[] args) throws Exception { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("qwq.txt"))); oos.writeObject(new Book("qwq", "orz", 2.33)); oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("qwq.txt"))); Book book = (Book)ois.readObject(); System.out.println(book); } }
|
不过,像是总价=单价*数量
就没有必要序列化,可以用transient关键字。
网络编程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package com.poorpool.server;
import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;
public class ServerDemo { public static void main(String[] args) throws Exception { ServerSocket sers = new ServerSocket(9999); Socket sock = sers.accept(); PrintStream ps = new PrintStream(sock.getOutputStream()); Scanner scanner = new Scanner(sock.getInputStream()); while(true) { if(scanner.hasNext()) { String qwq = scanner.next(); System.out.println("Get " + qwq); if(qwq.equalsIgnoreCase("exit")) { break; } ps.println(qwq); } } sock.shutdownOutput(); sers.close(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| package com.poorpool.client;
import java.io.PrintStream; import java.net.Socket; import java.util.Scanner;
public class ClientDemo { public static void main(String[] args) throws Exception { Socket sock = new Socket("localhost", 9999); Scanner scanner = new Scanner(sock.getInputStream()); PrintStream out = new PrintStream(sock.getOutputStream()); Scanner scanner1 = new Scanner(System.in); while(true) { String qwq = scanner1.nextLine(); out.println(qwq); System.out.println("waiting..."); if (scanner.hasNext()) { String ret = scanner.next(); System.out.println("Echo: " + ret); } if(qwq.equalsIgnoreCase("exit")) break; } sock.close(); } }
|
Java里头有ServerSocket和Socket,挺方便的。
多线程也好处理,每次accept一个client的socket就把它扔进一个Runnable里头跑起来。
也可以使用udp的socket。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package com.poorpool.server;
import java.net.DatagramPacket; import java.net.DatagramSocket;
public class ServerDemo { public static void main(String[] args) throws Exception { DatagramSocket client = new DatagramSocket(9999); byte[] data = new byte[1024]; DatagramPacket packet = new DatagramPacket(data, data.length); client.receive(packet); System.out.println(new String(data, 0, packet.getLength())); client.close(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package com.poorpool.client;
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;
public class ClientDemo { public static void main(String[] args) throws Exception { DatagramSocket server = new DatagramSocket(9998); String msg = "poorpool"; DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.length(), InetAddress.getByName("localhost"), 9999); server.send(packet); server.close(); } }
|