Java IO操作,根据GitHub上的实例,写了一些字节流的实现操作来理解Java IO的实现过程,以此来记录。
import javax.print.DocFlavor;
import java.io.*;
import java.net.*;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;
public class Test2 {
/**
* 通过字节流复制文件
* @param src
* @param dist
* @throws IOException
*/
public void copyFile(String src,String dist) throws IOException {
FileInputStream fileInputStream = new FileInputStream(src);
FileOutputStream fileOutputStream = new FileOutputStream(dist);
byte[] buffer = new byte[20*1024];
int cnt;
while ((cnt=fileInputStream.read(buffer,0,buffer.length))!=-1){
fileOutputStream.write(buffer,0,cnt);
}
fileInputStream.close();
fileOutputStream.close();
}
/**
* 输出每行数据
* @param filePath
* @throws IOException
*/
public void readFileContent(String filePath) throws IOException{
FileReader reader = new FileReader(filePath);
BufferedReader bufferedReader = new BufferedReader(reader);
String line;
while ((line = bufferedReader.readLine()) != null){
System.out.println(line);
}
bufferedReader.close();
}
/**
* 从 URL 中读取字节流数据。
* @throws IOException
*/
public void read() throws IOException {
URL url = new URL("http://www.baidu.com");
/*字节流*/
InputStream inputStream = url.openStream();
/*字符流*/
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"utf-8");
/*提供缓存功能*/
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine()) != null){
System.out.println(line);
}
bufferedReader.close();
}
/**
* 通过NIC(块)快速复制文件
* @param
* @throws IOException
*/
public void fastCopy(String src,String dist) throws IOException{
/*获得源文件的输入字节流*/
FileInputStream fileInputStream = new FileInputStream(src);
/* 获取输入字节流的文件通道 */
FileChannel inChannel = fileInputStream.getChannel();
/* 获取目标文件的输出字节流 */
FileOutputStream fileOutputStream = new FileOutputStream(dist);
/* 获取输出字节流的文件通道 */
FileChannel outChannel = fileOutputStream.getChannel();
/* 为缓冲区分配 1024 个字节 */
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
while (true){
/* 从输入通道中读取数据到缓冲区中 */
int r = inChannel.read(byteBuffer);
/* read() 返回 -1 表示 EOF */
if (r==-1){
break;
}
/* 切换读写 */
byteBuffer.flip();
/* 把缓冲区的内容写入输出文件中 */
outChannel.write(byteBuffer);
/* 清空缓冲区 */
byteBuffer.clear();
}
}
/**
* 套接字 NIO 实例
* @param
* @throws IOException
*/
public void NIOServer() throws IOException {
Selector selector = Selector.open();
ServerSocketChannel channel = ServerSocketChannel.open();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_ACCEPT);
ServerSocket serverSocket = channel.socket();
InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1",8080);
serverSocket.bind(socketAddress);
while (true){
selector.select();
Set<SelectionKey> selectionKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()){
SelectionKey selectionKey = iterator.next();
if (selectionKey.isAcceptable()){
ServerSocketChannel serverSocketChannel = (ServerSocketChannel)selectionKey.channel();
// 服务器会为每个新连接创建一个 SocketChannel
SocketChannel socketChannel = serverSocketChannel.accept();
socketChannel.configureBlocking(false);
// 这个新连接主要用于从客户端读取数据
socketChannel.register(selector,SelectionKey.OP_ACCEPT);
}else if (selectionKey.isReadable()){
SocketChannel socketChannel = (SocketChannel)selectionKey.channel();
System.out.println(readDataFromSocketChannel(socketChannel));
}
iterator.remove();
}
}
}
public static String readDataFromSocketChannel(SocketChannel socketChannel) throws IOException{
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
StringBuilder stringBuilder = new StringBuilder();
while (true){
byteBuffer.clear();
int n = socketChannel.read(byteBuffer);
if (n==-1){
break;
}
byteBuffer.flip();
int limit = byteBuffer.limit();
char[] dst = new char[limit];
for (int i = 0;i<dst.length;i++){
dst[i] = (char)byteBuffer.get(i);
}
stringBuilder.append(dst);
byteBuffer.clear();
}
return stringBuilder.toString();
}
public void NIOClient() throws IOException{
Socket socket = new Socket("127.0.0.1",8008);
OutputStream outputStream = socket.getOutputStream();
String s = "Hello word";
outputStream.write(s.getBytes());
outputStream.close();
}
public static void main(String[] args) throws IOException {
Test2 test2 = new Test2();
test2.copyFile("D:\\file\\123456.txt","D:\\file\\123.txt");
test2.readFileContent("D:\\file\\123456.txt");
test2.read();
test2.fastCopy("D:\\file\\123456.txt","D:\\file\\123.txt");
test2.readFileContent("D:\\file\\123.txt");
test2.NIOServer();
test2.NIOClient();
}
}
摘自GitHub文档,链接地址https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20IO.md