java从零开始系列(五)IO节点流

luoyjx · 2014-10-06 11:42 · 881次阅读

1 节点流类型
JDK中有三种基本类型的节点:

  • 文件(file)
  • 内存(memory)
  • 管道(pipe)

文件流
FileInputStream和FileOutputStream 这两个节点流用来操作磁盘文件。
这两类的构造函数允许我们指定它所连接的文件。
要构造一个FileInputStream,所关联的文件必须存在而且是可读的。
如果我们要构造一个FileOutputStream而输出文件已经存在,则它将被覆盖。
在实例化FileInputStream 和FileOutputSteam 流时要用try - catch 语句处理其可能抛出的FileNotFoundException。
在读写数据时也要用try - catch 语句处理可能抛出的IOException。
FileNotFoundException 是 IOException 的子类。

FileInputStream 字节读

import java.io.*;
public class FileInput {
	public static void main(String[] args) {
		try {
			FileInputStream in = new FileInputStream(
				"D:\\workspaceUML\\FileInput.java");			
			int b = 0;
			while ((b = in.read()) != -1) {
				// 如是中文
				System.out.print((char)b);
			}

			in.close();
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		}	
	}
}

FileOutputStream 字节写

import java.io.*;
public class FileCopy {
	public static void main(String[] args) {
		try {
		     FileInputStream in = new FileInputStream(
				"D:\\workspaceUML\\FileInput.java");
		     FileOutputStream out = new FileOutputStream(
				"D:\\workspaceUML\\Copy.java");		
		     int b = 0;
		     while ((b = in.read()) != -1) {
			out.write(b);
		     }
		     in.close()
                        out.flush();
		     out.close();
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}
}
注:FileOutputStream 在文件没有的情况下,会自动新建一个。

FileReader 字符读

import java.io.*;
public class FileReaderTest {
	public static void main(String[] args) {
	         try {
			FileReader in = new FileReader(
				"D:\\workspaceUML\\FileInput.java");
			int b = 0;
			while ((b = in.read()) != -1) {
				System.out.print((char)b);
			}
			in.close();
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		}		
	}
}

FileWriter 字符写

import java.io.*;
public class FileWriterTest {
	public static void main(String[] args) {
		try {
			FileWriter out = new FileWriter(
				"D:\\workspaceUML\\FileInfor.java");
			out.write("我自愿当中国人民的仆人");
                          out.flush();
			out.close();
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		}	
	}
}

字节数组流(内存操作流)
构造函数

  • ByteArrayOutputStream() 内存中分配了一个字节数组。
  • ByteArrayOutputStream(int size)  创建一个新的 byte 数组输出流,它具有指定大小的缓冲区容量(以字节为单位)。
  • ByteArrayInputStream(byte[] buf)  创建一个ByteArrayInputStream,使用 buf 作为其缓冲区数组 
  • ByteArrayInputStream(byte[] buf, int offset, int length) 

 数据操作流和字节数组流示例

import java.io.*;
public class DataStream {
	public static void main(String[] args) {
	     try {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		DataOutputStream dos = new DataOutputStream(baos);
		dos.writeDouble(0.1125D);
		dos.writeBoolean(false);

		ByteArrayInputStream bais = new 	ByteArrayInputStream(baos.toByteArray());
		DataInputStream dis = new DataInputStream(bais);

		System.out.println(dis.readDouble());
		System.out.println(dis.readBoolean());

		dis.close();
		dos.close();
	     } catch (IOException ex) {
	     }
	}
}

管道流
PipedInputStream和PipedOutputStream
   管道流用来在线程间进行通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须有一个输入方和一个输出方。

import java.io.*;
public class PipedStream {

/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Sender t1=new Sender();
Receiver t2=new Receiver();
PipedInputStream in=t2.getIntputStream();
PipedOutputStream out=t1.getOutPutStream();
out.connect(in);
t1.start();
t2.start();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}


}

}
class Sender extends Thread{

private PipedOutputStream pos=new PipedOutputStream();
public PipedOutputStream getOutPutStream(){
return pos;
}
public void run(){
String s=new String("hello world,how are you?");
try {
pos.write(s.getBytes());
pos.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}

class Receiver extends Thread{
PipedInputStream pis=new PipedInputStream();
public PipedInputStream getIntputStream(){
return pis;
}
public void run(){
String s=null;
byte[] buf=new byte[1024];
try {
int len=pis.read(buf);
s=new String(buf,0,len);
System.out.println("收到:"+s);
pis.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}

对整个文档复制
package com.itjob.io;
import java.io.*;
public class PipedStream {
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
Sender s=new Sender("c:\\bb.txt");
Recicer r=new Recicer("c:\\aa\\bb.txt");
PipedInputStream in=r.getInputStream();
PipedOutputStream out=s.getOutputStream();
try {
in.connect(out);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
s.start();
r.start();
}

}
//接受(保存文件)
class  Recicer extends Thread{
PipedInputStream pis;
File file;
FileOutputStream fos;

public Recicer(String filepath){
pis=new PipedInputStream();
file=new File(filepath);
try {
fos=new FileOutputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public PipedInputStream getInputStream(){
return pis;
}

public void run(){
int b;
try {
while((b=pis.read())!=-1){//从管道里面读
fos.write(b);
}
//System.out.println(b[0]);
//System.out.println("接受值:"+new String(b));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(pis!=null){
try {
pis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}
}

//发送(读取文件)
class Sender extends Thread{

PipedOutputStream pos;
File file;
FileInputStream fis;
public Sender(String filepath){
pos=new PipedOutputStream();
file=new File(filepath);
try {
fis=new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public PipedOutputStream getOutputStream(){
return pos;
}

public void run(){

//String string="hello world ,how are you?";
int b;
try {
while((b=fis.read())!=-1){//文件读 :输入
pos.write(b);//把文件字节流写入管道:
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(pos!=null){
try {
pos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
收藏

暂无评论

登录后可以进行评论。没有账号?马上注册