学习记录——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 }
上一篇: Struts2工作原理和框架扩展点