Java网络之输入输出流简介

前言

网络程序员很大部分的工作都是简单的输入输出,就是将数据字节从一个系统移动到另一个系统。字节就是字节,服务器发给你的数据和读取文件没有什么区别。但是java的输入输出流和大多数语言都不太一样。java的i/o建立于流之上。输入流读取数据,输出流写入数据。

输出流

Java的基本输出流是OutputStream,里面提供了一些操作输出流的方法。下面是其简单的使用。

public static void generateCharacters(OutputStream out)throws IOException {
        // 第一次开始写入的字符位置
        int firstPrintableCharacter = 33;
        int numberOfPrintableCharacters = 94;
        int numberOfCharactersPerLine = 72;
        int start = firstPrintableCharacter;
        while(true){
            for (int i = start; i < start + numberOfCharactersPerLine; i++) {
                // ((i - firstPrintableCharacter) % numberOfPrintableCharacters) + firstPrintableCharacter 
                out.write(
                        ((i - firstPrintableCharacter) % numberOfPrintableCharacters) + firstPrintableCharacter);
            }
            out.write('\r');
            out.write('\n');
            start = ((start + 1) - firstPrintableCharacter) % numberOfPrintableCharacters + firstPrintableCharacter;
        }
    }

上面这个方法,就是将ascii码33到94对应的字符,循环写入到文本文件中,也可以将将这些字节,发送到其他服务器。
除了这种一个一个字节的写入,我们也可以一整个字节数组写入。如下面代码

public static void generateCharacterss(OutputStream out)throws IOException {
        int frstPrintableCharacter =33;
        int number0fPrintableCharacters =94;
        int number0fCharactersPerLine =72;
        int start =frstPrintableCharacter;
        byte[] line = new byte[number0fCharactersPerLine +2];//+2对应回车和换行
        while(true){
            /*无限循环*/
            for (int i = start; i < start + number0fCharactersPerLine; i++){
                line[i - start] =(byte) ((i - frstPrintableCharacter)% number0fPrintableCharacters + frstPrintableCharacter);
            };
        line[72]=(byte)'\r';// 回车
        line[73]=(byte)'\n';//换行
        out.write(line);
        start = ((start + 1) - frstPrintableCharacter)%number0fPrintableCharacters + frstPrintableCharacter;
    }
    }
}

相比较上面的那个数组效率可能会更高一点。
与硬件缓存一样,流还可以在软件中缓存,即直接使用java代码缓存。因此写入数据之后,刷新输出流非常的重要。
例如,你向http服务器写了300字节的请求,通常需要等待相应,等待更多的数据写入,然后一起发送。但是你直接刷新输出流,它会强制发送。
当然强制刷新输出流的好处不止这一点,所以希望大家可以养成,随手刷新输出流的习惯,当然在流使用完成之后,要及时的关闭流。

输入流

Java输入流的基本类是InputStream,这个类同样的提供了一些基本的方法。输入流的简单使用如下

// 一个字节一个字节读取
    public static byte[] getInputStreame(InputStream in) throws IOException {
        byte[] input = new byte[10];
        for (int i = 0; i < input.length; i++) {
            int b = in.read();
            if(b == -1){
                break;
            }

            input[i] = (byte)b;

        }
        return input;
    }
    // 读取指定长度
    public static byte[] getInputStreameAll(InputStream in) throws IOException {
       int byteRead = 0;
       int bytesToRead = 1024;
       byte[] input = new byte[bytesToRead];
       while (byteRead < bytesToRead){
           // 这里有个问题,可能你读的流可能没有这么长的字节内容,或者有一部分字节永远读不到,这个时候就会报错
           // 长度够了,或者比你读的长,就没事
           byteRead += in.read(input,byteRead,bytesToRead - byteRead);
           System.out.println("看下返回值是什么:" + byteRead );
       }
        return input;
    }
    // 读取可利用长度
    public static byte[] getInputStreameAvaliable(InputStream in) throws IOException {
        int avaliable = in.available();
        byte[] input = new byte[avaliable];
        int start = 0;
        start += in.read(input,start,avaliable);
        System.out.println("---------------------------------" + start);
        return input;
    }

上面是输入流的基本使用,第一个是一个一个字节的读取,第二个是读取指定长度的数据。第三个是读取可利用的长度的字节。

总结

上面介绍java基本的输入输出流,同时举了几个简单的例子,对输入输出流的基本使用做了一个展示,希望可以对大家有所帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mark---小鑫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值