Java I/O 操作
2016年5月11日
9:27
|
细管道(字节) |
粗管道(字符) |
源是程序--输出流 |
字节输出流 |
字符输出流 |
目的也是程序--输入流 |
字节输入流 |
字符输入流 |
Input和 Output
Stream流模型
源是程序--输出流
目的也是程序--输入流
try{
// 创建流对象
fin= new FileInputStream("E:/lileihanmeimei.mp3");
fout= new FileOutputStream("D:/new.mp3");
//操作流
//每次读取1个字节,为什么返回int而不是byte?
byte[] buffer = new byte[1024];//做为缓冲的容器
intlength = 0;
while((length= fin.read(buffer)) != -1){
fout.write(buffer, 0, length);//length每次写入这么多个
fout.flush();
}
}
字节流
InPutStream输入流
OutputStream输出流
都是抽象类需要实现类来实现
对象序列化:将对象以二进制流的形式输出。
对象反序列化:将输入的二进制流转化为对象。
创建一个流,一定要关闭
Tcp 套接字更为安全,三次握手机制,UDP传输速度更快,但是安全性差,现多用于在线直播。
模拟服务器传值
//服务器
ServerSocket server= null;
try{
// 产生一个ServerSocket对象
server= new ServerSocket(9527);
while(true) {
System.out.println("开始监听......");
// 开始监听,一旦得到消息就会返回给我们一个Socket对象
Socketsocket = server.accept();
MessageThreadth = new MessageThread(socket);
th.start();
}
}
//客户端Client
Socket socket =null;
BufferedWriterbw = null;
try{
//产生Socket对象,产生时告知IP地址和端口号
socket= new Socket("127.0.0.1", 9527);
//通过输出流操作,发送信息。
// socket.getOutputStream().write(message.getBytes());
bw= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write(message);
bw.flush();
}
//处理线程
public void run(){
// 从Socket里面取消息
BufferedReaderbr = null;
try{
br= new BufferedReader(new InputStreamReader(socket.getInputStream()));
Stringstr = br.readLine();
System.out.println("客户端说:" + str);
}catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
常用流:
ObjectStream
ByteStream
charStream
Reader
InputStreamReader是字节流通向字符流的桥梁
FileReader用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在FileInputStream 上构造一个 InputStreamReader。
BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。