首页
version: jdk17
IO
InputStream
-
read():返回输入流中下一个字节的数据。返回的值介于 0 到 255 之间。如果未读取任何字节,则代码返回 -1 ,表示文件结束。
-
transferTo
public long transferTo(OutputStream out) throws IOException { Objects.requireNonNull(out, "out"); long transferred = 0; byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; int read; while ((read = this.read(buffer, 0, DEFAULT_BUFFER_SIZE)) >= 0) { out.write(buffer, 0, read); transferred += read; } return transferred; }
OutputStream
-
write(int b):将一个字节写入输出流。
-
flush() 刷新此输出流并强制写出所有缓冲的字节,在流关闭前会自动执行一次。大部分的输出流都在内部维护了一个缓冲区,调用write(int b)并不会每次都触发一次I/O操作,而是写入缓冲区内,当缓存区满了之后才会执行一次I/O操作。
Reader
Writer
BufferedInputStream / BufferedOutputStream
装饰器模式实现,为输入流及输出流增加缓冲区,对于write(int b)和read()每次只读取和写入一个字节的操作,性能与read(byte b[])和write(byte b[])相当,实际是读取缓冲区的数据和将数据写入缓冲区,能大幅减少IO次数。
InputStreamReader / OutputStreamWriter
适配器模式实现,实现字节流和字符流之间的转换。
Net
ServerSocket
服务器端需要主动监听端口,执行accpet()等待客户端连接,连接建立后创建Socket对象,通过getOutputStream()向客户端写入数据,通过getInputStream()读取客户端写入的数据。
public static void main(String[] args) {
try (var serverSocket = new ServerSocket(10990);
var socket = serverSocket.accept();
Scanner sc = new Scanner(System.in);
var writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
var reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
writer.write("hello\n");
writer.flush();
for (; ; ) {
// readline需要读取到换行符才能结束
var readLine = reader.readLine();
System.out.println(readLine);
if (readLine.equals("bye")) {
break;
}
writer.write(sc.nextLine() + "\n");
writer.flush();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
Socket
客户端直接创建Socket对象,并主动与服务器端连接,建立连接后,通过getOutputStream()向服务器端写入数据,通过getInputStream()读取服务器端写入的数据。
public static void main(String[] args) {
try (var socket = new Socket("127.0.0.1", 10990);
Scanner sc = new Scanner(System.in);
var writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
var reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
for (; ; ) {
var readLine = reader.readLine();
System.out.println(readLine);
var input = sc.nextLine();
writer.write(input + "\n");
writer.flush();
if (input.equals("bye")) {
break;
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
HttpClient
Since 11,支持HTTP/1.1和HTTP/2,支持异步。
public static void main(String[] args) throws Exception {
// 构建 HttpClient,可重用,线程安全
HttpClient client = HttpClient.newHttpClient();
// 构建 HttpRequest
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.baidu.com"))
.header("Content-Type", "application/json")
.GET()
.build();
// 同步发送请求
// HttpResponse.BodyHandlers.ofString() 指定将响应体转换为 String
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 处理响应
System.out.println("Status Code: " + response.statusCode());
System.out.println("Response Body: " + response.body());
System.out.println("Headers: " + response.headers().map());
// 异步发送请求
var responseCompletableFuture = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
// 处理响应
responseCompletableFuture.thenAccept(aysncResponse -> {
System.out.println("Status Code: " + aysncResponse.statusCode());
System.out.println("Response Body: " + aysncResponse.body());
System.out.println("Headers: " + aysncResponse.headers().map());
}).join();
}
File
RandomAccessFile
- public RandomAccessFile(File file, String mode)
模式支持(”r”, “rw”, “rws”, “rwd”),w模式下如果文件不存在则会自动创建。
- write(int b)
磁盘写入是调用操作系统write指令,该指令不需要flush且无法保证数据写入磁盘,如需强制输盘需要调用sync指令。
file.write("aaa".getBytes());
file.getFD().sync();
- public native long length()
获取文件实际字节数
- public void seek(long pos)
设置Position,不设置则默认从0开始,写入数据会进行覆盖。
- public long getFilePointer()
获取当前Position
- public final FileChannel getChannel()
获取NIO文件通道。