---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
黑马程序员 IO/输入输出流
一、概念和作用
概念:指应用程序对设备的输入输出
作用:用于设备之间数据的传输
二、分类
根据数据处理类型的不同:字节流和字符流
根据数据流向不同:输入流和输出流
按照流是否直接与特定的设备相连分为:节点流和处理流
三、节点流:程序用于直接操作目标设备
抽象类InputStream/OutputStream和Reader、Writer
1、文件流:FileInputStream/OutputStream和FileReader/FileWriter,对文件进行处理。
实例:
public class FileStream {
public static void main(String[] args) {
File f=new File("F://hello.txt");
try {
FileOutputStream out=new FileOutputStream(f);
byte buf[] ="heimachengxuyuan.com".getBytes();
out.write(buf);
out.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
try {
FileInputStream in=new FileInputStream(f);
byte [] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
文注:FileReader/FileWriter的实例同上,FileWriter使用了缓冲区,而FileOutputStream没有使用缓冲区
2、管道流:PipedInputStream/PipedOutputStream和PipedWriter/PipedReader,主要用来完成线程之间的通信。
实例:
public class Sender extends Thread{
private PipedOutputStream out=new PipedOutputStream();
public PipedOutputStream getOutputStream() {
return out;
}
public void run(){
String s=new String("hello ,heima.com");
try {
out.write(s.getBytes());
out.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
public class Receiver extends Thread{
private PipedInputStream in=new PipedInputStream();
public PipedInputStream getInputStream() {
return in;
}
public void run(){
byte [] buf=new byte[1024];
try {
int len=in.read(buf);
System.out.println(new String(buf,0,len));
in.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
public class PipeStreamTest {
public static void main(String[] args) {
try {
Sender t1=new Sender();
Receiver t2=new Receiver();
PipedOutputStream out=t1.getOutputStream();
PipedInputStream in=t2.getInputStream();
out.connect(in);
t1.start();
t2.start();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
文注:PipedWriter和PipedReader用于字符文本的管道通信
3、数组流:ByteArrayInputStream/ByteArrayOutputStream和StringWriter/StringReader,用于对数组的读写。
实例:
public class ByteArrayTest {
public static void main(String[] args) {
String tmp="asdfsdafdujoehjh";
byte[] src=tmp.getBytes();
ByteArrayInputStream input=new ByteArrayInputStream(src);
ByteArrayOutputStream output=new ByteArrayOutputStream();
new ByteArrayTest().transform(input, output);
byte [] result=output.toByteArray();
System.out.println(new String(result));
}
public void transform(InputStream in, OutputStream out){
int c=0;
try {
while ((c=in.read())!=-1) {
int C=Character.toUpperCase((char)c);
out.write(C);
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
四、处理流:对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写
1、缓冲流(BufferedInPutStream/BufferedOutPutStream和BufferedWriter/BufferedReader)他可以提高对流的操作效率。
写入缓冲区对象:
BufferedWriter bufw=new BufferedWriter(new FileWriter("buf.txt"));
读取缓冲区对象:
BufferedReader bufr=new BufferedReader(new FileReader("buf.txt"));
文注:特有方法readLine(),一次读一行。
2、数据流(DataInputStream/DataOutputStream)该数据流可以方便地对一些基本类型数据进行直接的存储和读取,不需要再进一步进行转换,通常只要操作基本数据类型的数据,就需要通过DataStream进行包装。
3、打印流(PrintStream/PrintWriter)
4、对象流(ObjectInputStream/ObjectOutputStream)该类型的流可以把类作为一个整体进行存取。
5、转换流(InputStreamReader/OutputStreamWriter) 该类型时字节流和字符流之间的桥梁,该流对象中可以对读取到的字节数据进行指定编码的编码转换
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------