• 【Java】流与文件(端口 & 文件读写对象)


    概述:

    1、input和output是相对于内存而言的。输入(input)就是写入到内存里,输出(output)就是把内存里的东西写到外面。

    2、操作内存里的东西非常便利,要么声明变量,要么new对象,而对于内存外的东西就没那么方便了。

    3、写入写出(io流)骨子里一定要清楚的“三步操作”:a、定位。从哪里input(哪个文件、哪个端口)、output到哪里(端口or文件or数据库...)。b、建立管道。c、操作管道。

    例如,向端口8000写东西,首先需要知道是往端口8000output,其次需要建立从端口8000到内存的input管道,最后,需要读多少数据呢?以什么形式读呢?叫做操作管道。

    4、需要注意的是:1所有离开内存的操作都是有风险的,一定要用try catch保护风险代码。2用指针理解stream的概念,例如,每read一次指针就往沿着文本往下移动,前面的数据就“流走”了。

    补充:

    1、java byte类型,8位二进制为一个字节,一个英文字母占1byte,一个汉字占2byte。

    文件读写的read有多个重载函数,既可以一个字节一个字节的读,无参read();也可以多个字节的读到一个byte型数组中read(new byte[size]);

    2、io流的加密偶尔会涉及到“数据的溢出”。

    3、使用io流通常需要分段捕获各个类型的异常:filenotfound、ioexception...

    4、一定要记住的:

    a、最底层的、最基本io流方法是读写字节而不是字符:InputsStream...is.read()、is.read(byte[])

    b、为了处理方便有了字符流:Reader....read(char[])

    c、为了提高性能,例如一次读一行,就有了BufferReader等高级流,但是BufferReader是建立在基础reader之上的!

    d、常常用PrintWriter代替BufferWriter,理由是增强在各个平台的兼容性。

    e、再往上走就有专门读写object的流了。

    f、不考虑性能的情况下,哪个方便就用哪一个。

    g、无法通过socket直接获得字符流(文件可以直接获得),必须通过字节流--InputStreamReader-->字符流---->高级流

    参考:

    1、java io最详解:http://blog.csdn.net/yczz/article/details/38761237

    2、 java 字节流与字符流的区别:http://blog.csdn.net/cynhafa/article/details/6882061

    3、为什么一定要关闭流?:http://www.iteye.com/problems/25486 个人认为一个两个iosteam不关闭也没什么问题。。但是量一多就会出问题。。另外如果不调用close,flush()一定是要调用的。。这样才能确保“效果正确”。

    4、Socket与ServerSocket:http://www.cnblogs.com/rond/p/3565113.html(有些东西可能不需要了解细节。。但是随手查查心里比较有底。。。)

    参考代码:

    ObjectOutputStream需要的参数是OutputStream,所以传入的参数只要是OutputStream或者OutputStream的子类都可以。。。

     

    按照需要传入就可以了。

    文件io:

    package com.xkfx.io;
    
    import com.xkfx.qq.tools.transmit.User;
    
    import java.io.*;
    
    public class FileIOTest {
        public static void main(String[] args) {
            ObjectOutputStream os = null;
            ObjectInputStream is = null;
            try {
                // 定位与建立管道
                os = new ObjectOutputStream(new FileOutputStream("d:/labs/test.txt"));
                is = new ObjectInputStream(new FileInputStream("d:/labs/test.txt"));
    
                // 操作管道
                os.writeObject(new User("xkfx", "a123456"));
                User user = (User)is.readObject();// 读到的是Obj类对象,需要强制转换
    
                System.out.println(user);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    os.close();
                    is.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    网络io:

     server:

    package com.xkfx.qq.server;
    
    import com.xkfx.qq.tools.transmit.User;
    
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
        public static void main(String[] args) throws IOException{
            ServerSocket server = null;
            server = new ServerSocket(8000); // 向操作系统注册服务
            Socket socket = server.accept(); // 从连接队列中取出一个连接,如果没有则等待
            ObjectInputStream is = null;
            try {
                is = new ObjectInputStream(socket.getInputStream());
                User user = (User)is.readObject();
                System.out.println(user);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    client:

    package com.xkfx.io;
    
    import com.xkfx.qq.tools.transmit.User;
    
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    
    public class SocketTest {
        public static void main(String[] args) {
            Socket socket = null;
            ObjectOutputStream os = null;
            try {
                socket = new Socket("localhost", 8000);
    
                os = new ObjectOutputStream(socket.getOutputStream());
                os.writeObject(new User("qjlsd", "a123456"));
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
  • 相关阅读:
    HDU-1225 Football Score
    HDU-3854 LOOPS
    HDU-3863 No Gambling
    poj-2096 Collecting Bugs
    HDU-4336 Card Collector
    HDU-4405 Aeroplane chess
    2010上交:最小面积子矩阵
    VijosP1443:银河英雄传说
    VijosP1250:分组背包
    Vijos1221:神秘的配方
  • 原文地址:https://www.cnblogs.com/xkxf/p/6781864.html
Copyright © 2020-2023  润新知