1.编程实现:1.1 线程A,从控制台读取用户输入的内容,并且把内容写入到管道流中。1.2 线程B,从管道流中读取内容,并且把内容再写入到一个本地文件中。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipeTest {
public static void main(String[] args) {
PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = null;
try {
in = new PipedInputStream(out);
Thread a = new A(in);
Thread b = new B(out);
a.start();
b.start();
a.join();
b.join();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
if(out!=null) {
out.close();
}
if(in!=null) {
in.close();
}
System.out.println("程序运行结束!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
class A extends Thread {
private PipedInputStream in;
public A(PipedInputStream in) {
this.in = in;
}
@Override
public void run() {
File file=new File("D:\\JD2109-workspace\\java_demo\\src\\com\\briup\\day20\\pipe.txt");
FileOutputStream out=null;
try {
out=new FileOutputStream(file);
int len = -1;
while ((len = in.read()) != -1) {
System.out.write(len);
System.out.flush();
}
System.out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
class B extends Thread {
private OutputStream out;
public B(OutputStream out) {
this.out = out;
}
@Override
public void run() {
InputStream in=System.in;
int len=-1;
try {
while((len=in.read())!=-1) {
if (len == 10) {
return;
}
out.write(len);
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2. 字符流和字节流有什么区别?
- 处理单元:
(1)字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串。 (2)字节流处理单元为1个字节,操作字节和字节数组。 - 适用情况:
(1)字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好。如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。 (2)所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。 - 处理的对象:
(1)字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; (2)字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。 - 字节流与字符流主要的区别是他们的的处理方式:
(1)Java的字节流:InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。 (2)Java的字符流:Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
注意: InputStream,OutputStream,Reader,writer都是抽象类,所以不能直接new。 通常说,字节流的功能比字符流的功能强大,因为计算机中所有的数据都是二进制的,而字节流可以处理所有的二进制文件。但如果使用字节流来处理文本文件,则需要使用合适的方式把这些字节转换成字符,增加了编程的难度。所以通常有一个规则:如果进行输入/输出的内容是文本内容,则应该考虑使用字符流;如果进行输入/输出的内容是二进制内容,则应该考虑使用字节流。所有能用记事本打开并看到其中字符内容的文件称为文本文件,反之称为二进制文件。本质上计算机所有文件都是二进制文件,文本文件只是二进制文件的一种特例,当二进制文件的内容恰好能被正常解析成字符时,则该二进制文件就编程了文本文件。
|