Java IO一些理解和demo

来源:互联网 发布:上海汇纳网络信息科技 编辑:程序博客网 时间:2024/05/15 11:28

IO常见可以分为磁盘和网络读写,因此在这就讲讲file和socket,仅作为自己复习总结

File

1.数据在磁盘的唯一最小描述就是文件,也就是说上层应用程序只能通过文件来操作磁盘上的数据,文件也是操作系统和磁盘驱动器交互的一个最小单元。

2.值得注意的是 Java 中通常的 File 并不代表一个真实存在的文件对象,当你通过指定一个路径描述符时,它就会返回一个代表这个路径相关联的一个虚拟对象,这个可能是一个真实存在的文件或者是一个包含多个文件的目录。

3.设计的原因:因为大部分情况下,我们并不关心这个文件是否真的存在,而是关心这个文件到底如何操作。例如我们手机里通常存了几百个朋友的电话号码,但是我们通常关心的是我有没有这个朋友的电话号码,或者这个电话号码是什么,但是这个电话号码到底能不能打通,我们并不是时时刻刻都去检查,而只有在真正要给他打电话时才会看这个电话能不能用。也就是使用这个电话记录要比打这个电话的次数多很多。

4.何时真正会要检查一个文件存不存?就是在真正要读取这个文件时,例如 FileInputStream 类都是操作一个文件的接口,注意到在创建一个 FileInputStream 对象时,会创建一个 FileDescriptor 对象,其实这个对象就是真正代表一个存在的文件对象的描述,当我们在操作一个文件对象时可以通过 getFD() 方法获取真正操作的与底层操作系统关联的文件描述。例如可以调用 FileDescriptor.sync() 方法将操作系统缓存中的数据强制刷新到物理磁盘中。

Socket 

1.Socket 这个概念没有对应到一个具体的实体,它是描述计算机之间完成相互通信一种抽象功能。打个比方,可以把 Socket 比作为两个城市之间的交通工具,有了它,就可以在城市之间来回穿梭了。
2.交通工具有多种,每种交通工具也有相应的交通规则。Socket 也一样,也有多种。大部分情况下我们使用的都是基于 TCP/IP 的流套接字,它是一种稳定的通信协议。
3.Java为TCP协议提供了两个类:Socket类和ServerSocket类。一个Socket实例代表了TCP连接的一个客户端,而一个ServerSocket实例代表了TCP连接的一个服务器端。
3.每个 Socket 实例都有一个 InputStream 和 OutputStream,正是通过这两个对象来交换数据。

阻塞IO:不管是磁盘 I/O 还是网络 I/O,数据在写入 OutputStream 或者从 InputStream 读取时都有可能会阻塞,一旦有线程阻塞将会失去 CPU 的使用权。

例子:

1.文件读写
/**简单一个demo**/
public class NormalIO {
    public static void main(String[] args) throws Exception {
        FileOutputStream fos = new FileOutputStream("fan.txt");//fos在有fan.txt,则不创建。否则会创建
        fos.write("你好".getBytes());
        fos.close();
        FileInputStream fis = new FileInputStream("huang.txt");//事先建好huang.txt
        byte[] bytes = new byte[100];
        while (fis.read(bytes) != -1) {
            System.out.println(new String(bytes));
        }
        fis.close();
    }
}

2.socket
/**客户端发送请求**/
public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 8096);
        socket.setSoTimeout(10000);//read的超时时间
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));  //获取键盘输入
        //获取Socket的输出流和输入流---发送数据到服务端,接收从服务端发送过来的数据
        PrintStream out = new PrintStream(socket.getOutputStream());
        BufferedReader buf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        boolean flag = true;
        while (flag) {
            System.out.print("输入信息:");
            String str = input.readLine();
            out.println(str); //发送数据到服务端
            if ("bye".equals(str)) {
                flag = false;
            } else {
                try {
                    String echo = buf.readLine();
                    System.out.println(echo);
                } catch (SocketTimeoutException e) {
                    System.out.println("Time out, No response");
                }
            }
        }
        input.close();
        if (socket != null) {
            //如果构造函数建立起了连接,则关闭套接字,如果没有建立起连接,自然不用关闭  
            socket.close(); //只关闭socket,其关联的输入输出流也会被关闭  
        }
    }
}

/**服务端处理请求线程**/
public class ServerThread implements Runnable {
    private Socket client = null;
    public ServerThread(Socket client) {
        this.client = client;
    }
    @Override
    public void run() {
        try {
            //获取Socket的输出流,用来向客户端发送数据
            PrintStream out = new PrintStream(client.getOutputStream());
            //获取Socket的输入流,用来接收从客户端发送过来的数据
            BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
            boolean flag = true;
            while (flag) {
                //接收从客户端发送过来的数据
                String str = buf.readLine();
                if (str == null || "".equals(str)) {
                    flag = false;
                } else {
                    if ("bye".equals(str)) {
                        flag = false;
                    } else {
                        //将接收到的字符串前面加上echo,发送到对应的客户端
                        out.println("输出信息:" + str);
                    }
                }
            }
            out.close();
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**测试程序**/
public class TestSocket {
    public static void main(String[] args) throws Exception {
        //服务端在8096端口监听客户端请求的TCP连接
        ServerSocket server = new ServerSocket(8096);
        Socket client = null;
        boolean f = true;
        while (f) {
            client = server.accept();
            System.out.println("与客户端连接成功!");
            new Thread(new ServerThread(client)).start();
        }
        server.close();
    }
}

0 0
原创粉丝点击