JAVA中有好多流!
1.字节流(以Stream结尾的)
2.字符流(以Reader,Writter结尾的)
3.过滤流(最常用的是DataInputStream和DataOutputStream,BufferedInputStream,BufferedOutputStream)
4.字节和Unicode字符的桥梁:InputStreamReader、OutputStreamWriter
以下摘自互联网:
3、字节流:
程序运行中常的I/O操作包括向标准设备输入输出数据和文件输入输出。对于前者,java定义了三个直接使用的流对象:System.err(标准错误输出)、System.out(标准输出)和System.in(标准输入);对于后者,可以使用FileOutputStream和FileInputStream。
code:
import java.io.*;
public class Test
{
static final String file1="D:\\javaprogram\\w1.txt";
static final String file2="E:\\database\\w2.txt";
static final String file3="E:\\wmpub\\w3.txt";
public static void main(String args[])throws IOException
{
/*//关于System.in
int data;
while ((data=System.in.read())!=-1)//Ctrl+c结束输入
{
System.out.write(data);
}*/
//下面的程序段用以向file1文件写入,把其内容的一部分复制到file2
//再把file2文件完整地复制到file3,并打印出来
FileOutputStream fos1=new FileOutputStream(file1);
FileOutputStream fos2=new FileOutputStream(file2);
FileOutputStream fos3=new FileOutputStream(file3);
fos1.write("今天是2008年8月3号,离北京奥运会还有5天,心里非常激动啊.".getBytes());
fos1.close();
FileInputStream fis1=new FileInputStream(file1);
fis1.skip(19);//跳过19个字节
byte[] buf=new byte[fis1.available()];
fis1.read(buf);
fis1.close();
System.out.println(new String(buf));
fos2.write(buf);
fos2.close();
FileInputStream fis2=new FileInputStream(file2);
while(fis2.available()>0)
{
byte[] b=new byte[fis2.available()];
int let=fis2.read(b);
if(let==-1)break;
fos3.write(b,0,let);
}
System.out.println("复制成功!");
fis2.close();
fos3.close();
//以下程序段实现了一个图像文件的复制
FileInputStream a=new FileInputStream("4.jpg");
FileOutputStream b=new FileOutputStream("3.jpg");
byte c[]=new byte[a.available()];
a.read(c);
b.write(c);
a.close();
b.close();
}
}
4、字符流(FileWriter and FileReader)
import java.io.*;
public class Test
{
public static void main(String args[])
{
//本程序完成从控制台读入文件名,并实现复制
int length;
char buf[]=new char[100];
try
{
FileReader in=new FileReader(args[0]);
FileWriter out=new FileWriter(args[1]);
length=in.read(buf);
while(length!=-1)
{
out.write(buf,0,length);
//字符流读取通过read()的返回值判断是否读到文件末尾
//我刚才忘记加这条语句,文件被一直写,都死机了,重启后一看,写了2.6G
length=in.read(buf);
}
in.close();
out.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
5、过滤流之一
Java利用过滤流可以在读写数据的同时对数据进行处理,以达到性能的改善,提高程序执行效率。将过滤流和某个输入流或输出流(节点流)连接。连接是通过在过滤流的构造方法中指定入口参数——节点流来实现的。
§BufferedInputStream:
FileInputStream fis=new FileInputStream("w1.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
byte[] buf=new byte[100];
int len=bis.read(buf,0,len);
System.out.println(new String(buf,0,len));
bis.close();
§BufferedOutputStream:
FileOutStream fos=new FileOutputStream("w2.txt");
BufferedOutputStream bos=new BufferedOutputStream(bos);
bos.write("好好学习,天天向上".getBytes());
bos.flush();
bos.close();
也可以是匿名创建:如:BufferedOutputStream bos=new BufferedOutputStream(new FileInputStream("w2.txt"));
BufferedReader和BufferedWirter与此类似,不过是分别指定Writer和Reader类型的参数罢了。
一个实例程序:
import java.io.*;
public class Test
{
public static void main(String[] args)
{
try
{
FileInputStream in=new FileInputStream(args[0]);
BufferedInputStream bufIn=new BufferedInputStream(in);
int limit;
bufIn.mark(limit=bufIn.available());//在当前位置打上标记
for(int i=0;i<limit;i++)
System.out.print((char)(bufIn.read()));
System.out.println();
bufIn.reset();//reset缓冲区标志
int c;
while((c=bufIn.read())>=0)System.out.print((char)c);
bufIn.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
5、过滤流之二基本类型数据传输:DataInputStream和DataOutputStream
import java.io.*;
public class Test
{
public static void main(String args[])
{
try
{
DataOutputStream dos=new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(
"d://javaprogram//w.txt")));
dos.writeInt(5);
dos.writeUTF("你好");
dos.writeBoolean(true);
dos.writeDouble(3.1415926);
dos.writeBytes("ok!");
dos.writeChars("bye bye");
dos.close();
DataInputStream dis=new DataInputStream(
new BufferedInputStream(new FileInputStream(
"d://javaprogram//w.txt")));
//读出的顺序应与写入的顺序一致
System.out.println(dis.readInt());
System.out.println(dis.readUTF());
System.out.println(dis.readBoolean());
System.out.println(dis.readDouble());
byte b[]=new byte[3];
dis.readFully(b);
for(int j=0;j<3;j++)System.out.print((char)b[j]);
System.out.println();
StringBuffer st3=new StringBuffer();
for(int j=0;j<7;j++)st3.append(dis.readChar());
System.out.println(st3.toString());
dis.close();
}
catch (IOException e)
{
System.err.println(e.toString());
}
}
}
6、过滤流之三:I/O流的链接图:
7、字节和Unicode字符的桥梁:InputStreamReader、OutputStreamWriter
code:
import java.io.*;
public class Test
{
public static void main(String[] args)throws IOException
{
//文件读写
FileOutputStream fos=new FileOutputStream("w.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos);
BufferedWriter bw=new BufferedWriter(osw);
bw.write("今天是2008年8月3日,离北京奥运还有5天!");
bw.close();
FileInputStream fis=new FileInputStream("w.txt");
InputStreamReader isr=new InputStreamReader(fis);
BufferedReader br=new BufferedReader(isr);
System.out.println(br.readLine());
br.close();
//控制台读写
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw1=new BufferedWriter(new OutputStreamWriter(System.out));
String strLine,str="";
while((strLine=br1.readLine())!=null)//Ctrl+c结束输入
{
str+=strLine;
System.out.println(strLine);
}
br1.close();
bw1.write(str,0,str.length());
bw1.write((int)('\n')); //将回车符输入bw1
bw1.flush();
bw1.close();
}
}
8、管道流:PipedInputStream、PipedOutputStream
作用:用于线程间的通信,一个线程的pipedInputStream对象从另一个线程的PipedOutputStream对象读取输入,要使管道流有用,必须同时构造管道输入流和管道输出流。
例子(孙鑫老师的例子):
import java.io.*;
class Producer extends Thread
{
private PipedOutputStream pos;
public Producer(PipedOutputStream pos)
{
this.pos=pos;
}
public void run()
{
try
{
pos.write("Hello,welcome you!".getBytes());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
class Consumer extends Thread
{
private PipedInputStream pis;
public Consumer(PipedInputStream pis)
{
this.pis=pis;
}
public void run()
{
try
{
byte[] buf=new byte[100];
int len=pis.read(buf);
System.out.println(new String(buf,0,len));
pis.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
public class Test
{
public static void main(String args[])
{
PipedOutputStream pos=new PipedOutputStream();
PipedInputStream pis=new PipedInputStream();
try
{
pos.connect(pis);
new Producer(pos).start();
new Consumer(pis).start();
}
catch (Exception e)
{
e.printStackTrace();
}
}
} |
|