首先说明:读取网络和读取磁盘没有什么区别,大部分都是字节的接收接收发送。
输出流抽象类类:OutputStream
常用方法:write(int b),write(byte[] data),write(byte[] data,int offset,int length),flush(),close()
它的具体子类可向具体子类写入数据,例如FileOutputStream向文件写入数据。
例如:
public class FileOutputStreamTest {
public static void main(String[] args) {
try {
File file = new File(save.txt);
OutputStream fileInputStream = new FileOutputStream(file); // 转换成字节
byte[] strByte = abc.getBytes();
fileInputStream.write(strByte);
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
基本方法write(int b)是写入0~255的int类型,当写入一个int时,其实是每一次写一个无符号字节,在线缆上放的就是一个8位字节。
这里就会出现int到byte的强制转换:java就没有无符号数据类型,所以要写的时候用四个字节的有符号int代替一个字节的有符号byte,因为一个无符号的范围为0~255,如果你int表示这个范围没有任何问题,但是超过了(正和负)就需要转换了,此时就会发int的高位三个字节忽略了,另外有符号和无符号的唯一区别在于看你怎么解释他,一个有符号转换为无符号的方法就是 无符号(223) = 最大范围(256) + 有符号(-33)。
如果有多字节要发送,使用write(byte[] data),write(byte[] data,int offset,int length)比一次写一个字节的write(int b)要快。
例如:for(int =0 ; i < 10 ; i++){
out.write(i);
}
改进为:
byte[] line = new byte[10]
for(int =0 ; i < 10 ; i++){
line[i] = (byte)i;
}
out.write(line);close()方法;当一个流操作结束时,需要用它关闭,然后会释放与这个流相关的所有资源,如果流来自一个网络连接,那么close后就会关闭这个连接。
常用做法:
OutputStream fileInputStream = null;
try {
File file = new File("save.txt");
fileInputStream = new FileOutputStream(file);
//...
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fileInputStream!=null){
try{
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
有时成为释放模式。
也可以:
try(OutputStream fileInputStream = new FileOutputStream(new File("save.txt"))){
//...
} catch (IOException e) {
e.printStackTrace();
}
java7中像这样不需要finally子句,并自动close()。