Java基础--Java IO中部分对象介绍(1)
2013-04-05 19:50
477 查看
Java IO可以分为两大类,一个是字节流对象,一个是字符流对象。字节流对象读取的是一个一个的字节,即以字节为单位进行读取。而字符流对则是以字符为单位进行读取。一般来说,字符流的效率要高些。但为什么还要有字节流对象呢?
这是因为流对象的表现形式有很多种。如果仅仅是文本数据,则单单用一个字符流对象就可以了。但是很多时候我们操作的是图片、电影、mp3等这样的数据,就只能用字节流对象了。因为字符流对象在操作的过程中会用当前系统指定的编码格式进行编码和解码。所以就不能操作那些非文本数据了。
要想把Java的IO对象全部说完,短时间内是不可能的。也没有必要。那些很常见的一般大家都很熟悉了。也就没必要再重复了。我就介绍几个比较独特,有特定适用环境的流对象吧。
PipedInputStream和PipedOutputStream
PipedInputStream
管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从
PipedOutputStream
可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入
文档
注意到文档中的一句话,“不建议对这两个对象尝试使用单个线程,因为这样可能会造成该线程死锁。”也就是说应该在多线程环境下使用这两个对象。多线程下的话我们就可以利用它们进行线程间的通信。PipedOutputStream 负责发送信息,PipedInputStream 负责接收信息,如果发送方的信息没有发送来的话,接收方就会处于阻塞状态,一直等待。
Demo:
PipedInputStream
/**
*Apr 5, 2013
*Copyright(c)JackWang
*All rights reserve
*@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.myjava.function;
import java.io.IOException;
import java.io.PipedInputStream;
public class PipedIn implements Runnable{
PipedInputStream pipIn = new PipedInputStream();
/**
* @param pipIn
*/
public PipedIn(PipedInputStream pipIn) {
this.pipIn = pipIn;
}
@Override
public void run() {
byte[] buf = new byte[1024];
try {
int len = pipIn.read(buf);
System.out.println(new String(buf,0,len));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
pipIn.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
PipedOutputStream
/**
*Apr 5, 2013
*Copyright(c)JackWang
*All rights reserve
*@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.myjava.function;
import java.io.IOException;
import java.io.PipedOutputStream;
public class PipedOut implements Runnable {
PipedOutputStream pipOut = new PipedOutputStream();
/**
* @param pipOut
*/
public PipedOut(PipedOutputStream pipOut) {
this.pipOut = pipOut;
}
@Override
public void run() {
String str = "嘿嘿,我来啦!!!";
try {
Thread.sleep(5000); //模拟线程阻塞
pipOut.write(str.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
pipOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Test
/**
*Apr 5, 2013
*Copyright(c)JackWang
*All rights reserve
*@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.myjava.function;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipedIOTest {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
PipedInputStream in = new PipedInputStream(); //管道输入流
PipedOutputStream out = new PipedOutputStream(); //管道输出流
in.connect(out); //连接管道
PipedIn pIn = new PipedIn(in);
PipedOut pOut = new PipedOut(out);
new Thread(pIn).start();
new Thread(pOut).start();
}
}
例子中采用Thread.sleep(5000)的方式模拟线程阻塞。
------------------------------------------------------------------------------
这是因为流对象的表现形式有很多种。如果仅仅是文本数据,则单单用一个字符流对象就可以了。但是很多时候我们操作的是图片、电影、mp3等这样的数据,就只能用字节流对象了。因为字符流对象在操作的过程中会用当前系统指定的编码格式进行编码和解码。所以就不能操作那些非文本数据了。
要想把Java的IO对象全部说完,短时间内是不可能的。也没有必要。那些很常见的一般大家都很熟悉了。也就没必要再重复了。我就介绍几个比较独特,有特定适用环境的流对象吧。
PipedInputStream和PipedOutputStream
PipedInputStream
管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从
PipedInputStream对象读取,并由其他线程将其写入到相应的
PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。--------Java文档
PipedOutputStream
可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入
PipedOutputStream对象,并由其他线程从连接的
PipedInputStream读取。不建议对这两个对象尝试使用单个线程,因为这样可能会造成该线程死锁。如果某个线程正从连接的管道输入流中读取数据字节,但该线程不再处于活动状态,则该管道被视为处于毁坏状态。-----Java
文档
注意到文档中的一句话,“不建议对这两个对象尝试使用单个线程,因为这样可能会造成该线程死锁。”也就是说应该在多线程环境下使用这两个对象。多线程下的话我们就可以利用它们进行线程间的通信。PipedOutputStream 负责发送信息,PipedInputStream 负责接收信息,如果发送方的信息没有发送来的话,接收方就会处于阻塞状态,一直等待。
Demo:
PipedInputStream
/**
*Apr 5, 2013
*Copyright(c)JackWang
*All rights reserve
*@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.myjava.function;
import java.io.IOException;
import java.io.PipedInputStream;
public class PipedIn implements Runnable{
PipedInputStream pipIn = new PipedInputStream();
/**
* @param pipIn
*/
public PipedIn(PipedInputStream pipIn) {
this.pipIn = pipIn;
}
@Override
public void run() {
byte[] buf = new byte[1024];
try {
int len = pipIn.read(buf);
System.out.println(new String(buf,0,len));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
pipIn.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
PipedOutputStream
/**
*Apr 5, 2013
*Copyright(c)JackWang
*All rights reserve
*@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.myjava.function;
import java.io.IOException;
import java.io.PipedOutputStream;
public class PipedOut implements Runnable {
PipedOutputStream pipOut = new PipedOutputStream();
/**
* @param pipOut
*/
public PipedOut(PipedOutputStream pipOut) {
this.pipOut = pipOut;
}
@Override
public void run() {
String str = "嘿嘿,我来啦!!!";
try {
Thread.sleep(5000); //模拟线程阻塞
pipOut.write(str.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
pipOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Test
/**
*Apr 5, 2013
*Copyright(c)JackWang
*All rights reserve
*@Author <a href="mailto:wangchengjack@163.com">JackWang</a>
*/
package com.myjava.function;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipedIOTest {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
PipedInputStream in = new PipedInputStream(); //管道输入流
PipedOutputStream out = new PipedOutputStream(); //管道输出流
in.connect(out); //连接管道
PipedIn pIn = new PipedIn(in);
PipedOut pOut = new PipedOut(out);
new Thread(pIn).start();
new Thread(pOut).start();
}
}
例子中采用Thread.sleep(5000)的方式模拟线程阻塞。
------------------------------------------------------------------------------
相关文章推荐
- 黑马程序员 java基础_IO_流对象介绍
- [零基础学JAVA]Java SE面向对象部分-17.面向对象高级(05)
- java基础之IO转换流--OutputStreamWriter(字符流通往字节流,可以指定字符编码的IO流对象)
- [零基础学JAVA]Java SE面向对象部分-08.面向对象基础(03)
- [零基础学JAVA]Java SE应用部分-31.Java IO操作(05)IO操作实例讲解之实现简单MIS 推荐
- 黑马程序员——JAVA基础——IO(一)---流概述,节点流、处理流、转换流与标准输入输出流、打印流、File文件对象、合并流
- 黑马程序员--面向对象第二部分-内部类、异常--java学习日记6(基础知识)
- [零基础学JAVA]Java SE应用部分-30.Java IO操作(04) 推荐
- [零基础学JAVA]Java SE面向对象部分-12.面向对象基础(07) 推荐
- (java基础)java面向对象部分笔记
- [零基础学JAVA]Java SE面向对象部分-11.面向对象基础(06) 推荐
- [零基础学JAVA]Java SE面向对象部分.面向对象基础(05)
- 黑马程序员——java基础——IO流(2)File类,IO常用流对象及IO包中其他类
- [零基础学JAVA]Java SE面向对象部分-17.面向对象高级(05) 推荐
- JAVA基础知识之IO——对象序列化
- 黑马程序员-15-java基础-面向对象(1)-概念介绍与类、对象、构造方法
- JAVA基础IO介绍
- [零基础学JAVA]Java SE面向对象部分-16.面向对象高级(04) 推荐
- 2018/01/03JAVA 基础 / 类和对象 / JAVA的四种访问属性修饰符private、protected、default、public介绍
- [零基础学JAVA]Java SE面向对象部分.面向对象基础(01)