欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

学习记录——Java网络编程——输出流

程序员文章站 2022-05-13 17:34:09
输出流 网络程序所作的很大一部分工作都是简单的输入和输出,Java的I/O建立于流之上。输入流读取数据,输出流写入数据。 Java的基本输出流类是java.io.OutputStream。 OutputStream的基本方法是write(int b)。该方法接收一个0~255之间的整数作为参数,将对 ......

输出流

网络程序所作的很大一部分工作都是简单的输入和输出,Java的I/O建立于流之上。输入流读取数据,输出流写入数据。

Java的基本输出流类是java.io.OutputStream。

OutputStream的基本方法是write(int b)。该方法接收一个0~255之间的整数作为参数,将对应字节写入到输出流中。当使用write(int b)将int写入一个网络连接时,如果将一个超出0~255的int传入write(int b),将写入这个数的最低字节,其他3字节将被忽略。

字符生成器协议定义了一个发出ASCII文本的服务器。这个协议最流行的变体是发送72个字符的文本行,其中包含可显示的ASCII字符,是33~126之间的字符,不包含空白符合控制字符。

ASCII是一个7位字符集,所以每个字符都可作为单字节发送。因此,这个协议可以直接使用基本write()方法实现。

 1 public static void generateCharacters(OutputStream out) throws IOException
 2 {
 3     int firstPrintableCharacter = 33;
 4     int numberOfPrintbableCharacters = 94;
 5     int numberOfCharactersPerLine = 72;
 6     int start = firstPrintableCharacter;
 7     while(true)
 8     {
 9         for(int i =start;i<start+numberOfCharactersPerLine;i++)
10         {
11             out.write(((i-firstPrintableCharacter)%numberOfCharacers)+firstPrintbaleCharacter);
12         }
13         out.write('\r');
14         out.write('\n');
15         start = ((start+1)-firstPrintableCharacter)%numberOfPrintableCharacters+firstPrintableCharacter;
16     }
17 }                            

一次写入1个字节效率不高。大多数TCP/IP实现都会在某种程度上缓存数据,它们在内存中积累数据字节,只有积累到一定量的数据后,或者经过一定的时间后,才将所积累的数据发动到最终目的地。下面将整行打包在一个字节数组中,一次发送一行。

 1 public static void generateCharacters(OutputStream out) throws IOException
 2 {
 3     int firstPrintableCharacter = 33;
 4     int numberOfPrintableCharacters = 94;
 5     int numberOfCharactersPerLine = 72;
 6     
 7     int start = firstPrintableCharacter;
 8     byte[] line = new byte[numberOfCharactersPerLine+2];
 9     
10     while(true)
11     {
12         for(int i =start;i<start+numberOfCharactersPerLine;i++)
13         {
14             line[i-start] = (byte)((i-firstPrintableCharacter)%numberOfPrintableCharacters+firstPrintableCharacter);
15         }
16         line[72] = (byte)'\r';
17         line[73] = (byte)'\n';
18         out.write(line);
19         start = ((start + 1)-firstPrintableCharacter)%numberOfPrintableCharacters+firstPrintableCharacter;
20     }
21 }