io输入输出流

Java中流的概念细分

• 按流的方向分类:
1. 输入流:数据流向是数据源到程序(以InputStream、Reader结尾的流)。
2. 输出流:数据流向是程序到目的地(以OutPutStream、Writer结尾的流)。

• 按处理的数据单元分类:
1. 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,如FileInputStream、FileOutputStream。
2. 字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流,如FileReader、FileWriter。
• 按处理对象不同分类:
1. 节点流:可以直接从数据源或目的地读写数据,如FileInputStream、FileReader、DataInputStream等。
2. 处理流:不直接连接到数据源或目的地,是”处理流的流”。通过对其他流的处理提高程序的性能,如BufferedInputStream、BufferedReader等。处理流也叫包装流。
节点流处于IO操作的第一线,所有操作必须通过它们进行;处理流可以对节点流进行包装,提高性能或提高程序的灵活性。

 文件专属:
java.io.FileInputStream(掌握)
java.io.FileOutputStream(掌握)
java.io.FileReader
java.io.FileWriter


转换流:(将字节流转换成字符流)
java.io.InputStreamReader
java.io.OutputStreamWriter


缓冲流专属:
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream


数据流专属:
java.io.DataInputStream
java.io.DataOutputStream


标准输出流:
java.io.PrintWriter
java.io.PrintStream(掌握)


对象专属流:
java.io.ObjectInputStream(掌握)
java.io.ObjectOutputStream(掌握)


File文件类
java.io.File

简单写的读取文本

public class TestIo {
    public static void main(String[] args) {
        FileInputStream fileInputStream = null;
        try {
             fileInputStream = new FileInputStream("d:/a.txt");
             int s = 0;
            while ((s=fileInputStream.read())!=-1){
                if (s >= 128) {
                    // 第一位不是0代表多字节
                    int byteCnt = Integer.toBinaryString(s).indexOf("0");
                    System.out.println("byteCnt"+byteCnt);
                    byte[] bytes = new byte[byteCnt];
                    System.out.println("bytes"+bytes);
                    bytes[0] = (byte) s;
                    for (int i = 1; i < byteCnt; i++) {
                        bytes[i] = (byte) fileInputStream.read();
                    }
                    System.out.print(new String(bytes));
                } else {
                    System.out.print((char) s);
                }
             }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                fileInputStream.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

io实现简单的交流

服务器端

public class ChatServer {
    public static void main(String[] args) {
        //需要一个地址端口号
        ServerSocket serverSocket = null;
        Socket accept=null;
        InputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream=null;
        try {
            //设置自己的端口
            serverSocket = new ServerSocket(9999);
            //等待客户连接过来
            //侦听socket连接 返回值为socket 这个就是连接过来的socket
            accept = serverSocket.accept();
            //读取客户端的消息
            inputStream = accept.getInputStream();
            //管道流 获取
            byteArrayOutputStream = new ByteArrayOutputStream();
            byte [] buffer = new byte[1024];
            int len;
            while((len=inputStream.read(buffer))!=-1){
                byteArrayOutputStream.write(buffer,0,len);
            }
            System.out.println(byteArrayOutputStream.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (byteArrayOutputStream!=null){
                try {
                    byteArrayOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream!=null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (accept!=null){
                try {
                    accept.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

发送消息端

public class ChatUser {
    public static void main(String[] args) {

        //需要知道要连接的地址和端口
        InetAddress inetAddress = null;
        Socket socket=null;
        try {
            //设置接收方的ip
            inetAddress=InetAddress.getByName("127.0.0.1");
            //设置接收方的断口号
            int port = 9999;
            //通过端口号和ip创建连接
            socket = new Socket(inetAddress,port);
            //创建字节流 我理解为建立流
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("这里是李佳琪".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

网上爬取文件

/**
 * @author : LeeGaki
 * @date : 2022/6/5 21:30
 * 面向面试编程 --> 李佳琪
 */
public class DownFile {
    public static void main(String[] args) throws Exception {
        //给到一个地址
        URL url = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F4k%2Fs%2F02%2F2109242306111155-0-lp.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1657028356&t=700bfd56a5a605b4a7d654331dbe7176");
        //开启连接
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        //开启输入流
        InputStream inputStream = urlConnection.getInputStream();
        //处理流包装
        FileOutputStream file = new FileOutputStream("a.jpg");
        //给到开辟空间
        byte [] bytes = new byte[1024];
        int len;
        //循环读出来
        while((len=inputStream.read(bytes))!=-1){
            file.write(bytes,0,len);
        }
        file.close();
        inputStream.close();
        urlConnection.disconnect();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LeeGaKi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值