Java的基本输出流类是Java.io.OutputStream;
这个类提供了写入数据的基本方法:
它的子类
FileOutputStream使用这些方法将数据写入文件.
TelnetOutputStream使用这些方法将数据写入网络连接.
ByteArrayOutputStream使用这些方法将数据写入可扩展的字节数组.
在原生的write(int b)方法中int只接受0到255之间的整数.,若大于255,将该数转为二进制,取低八位.
字符生成器协议定义了一个发出ASCII文本的服务器.这个最流行的变体是发送72个字符的文本行,其中包含可显示的ASCII字符.
可显示的ASCII字符是33到126之间的字符.
由于ASCII是7位字符集,因此1个字节就能正确显示一个ASCII字符.
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++){
out.write(((i-firstPrintableCharacter)%numberOfPrintableCharacters)+firstPrintableCharacter)
}
out.write('\r');
out.write('\n');
start=((start+1)-firstPrintableCharacter)%numberOfPrintableCharacters+firstPrintableCharacter;
}
}
一次写入1字节通常效率不高,我们可以试着多字节一次性发送:
在写入数据完成后,刷新(flush)输出流非常重要.例如,假设已经向使用HTTP1.1服务器写入300字节的请求,通常你会等待响应,然后再发送更多的数据.
如果输出流有一个1024字节的缓冲区,那这个流在发送缓冲区中的数据之前会等待更多的数据到达.
在服务器响应到达之前不会向流写入数据,由于请求还没发送,响应永远不会到来.
而flush()方法可以强迫缓冲的流发送数据,即使缓冲区还没满.
由于system.out会缓冲数据,最好用flush()将数据从缓冲区中取出.
在关闭流之前也应该立即刷新输出所有流避免缓冲区的数据丢失.
早期的释放模式要求在finally块中关闭流.在try块之外声明流变量,在try块之内完成初始化.为了避免nullpointerException异常,在关闭流之前检查流变量是否为null:
新的释放模式允许在try块中声明变量:
并且不再需要finally子句,因为Java7会对try块参数表中声明的所有AutoCloseable对象自动调用close().
Java的基本输入类是Java.io.InputStream.
read()的标准用法:
inputstream类还有三个不太常用的方法,允许程序备份和重新读取已经读取的数据.
为了重新读取数据,要用mark()方法标记流的当前位置.在以后某个时刻,可以用reset()方法把流重置到之前标记的位置.接下来的读取操作会返回从标记位置开始的数据.
注意:回溯的时候能回溯的字节数是由mark()的readAheadLimit参数确定的.
一个流在任何时候都只能有一个标记.
支持标记的输入流是BufferedInputStream和ByteArrayInputStream.
Java提供了很多过滤器类,可以附加到原始流中,在原始字节和各种格式之间来回转换.
过滤器以链的形式进行组织.
链中的每个环节都接收前一个过滤器或流的数据,并把数据传递给链中的下一个环节.
如果使用println()方法,在UNIX下是换行符(\n),在MAC OS9下是回车符(\r),在windows下是(\r\n).这会带来什么问题?
所有数据都以big-endian格式写入.整数用尽可能少的字节书写为2的补码.因此,byte会写为1字节,short写为2字节,int写为4字节,long写为8字节,浮点数(flaot)写为4字节的IEEE 754格式,双精度数(double)写为8字节的IEEE 754格式,boolean写为1字节,char写为2个无符号字节.
java.io.Reader类指定读取字符的API.
java.io.Writer指定写字符的API.
对应输入和输出流使用字节的地方,阅读器和书写器会使用Unicode字符.