1、输入、输出流总结一、理解数据流流一般分为输入流(Input Stream)和输出流(Output Stream)两类。二、Java 的标准数据流标准输入输出指在字符方式下(如 DOS) ,程序与系统进行交互的方式,分为三种:标准输入 studin,对象是键盘。标准输出 stdout,对象是屏幕。标准错误输出 stderr,对象也是屏幕。三、字节流方法字节流:从 InputStream 和 OutputStream 派生出来的一系列类。这类流以字节(byte)为基本处理单位。InputStream、OutputStreamFileInputStream、FileOutputStreamPiped
2、InputStream、PipedOutputStreamByteArrayInputStream、ByteArrayOutputStreamFilterInputStream、FilterOutputStreamDataInputStream、DataOutputStreamBufferedInputStream、BufferedOutputStream1、 InputStream 和 OutputStream read():从流中读入数据skip():跳过流中若干字节数available():返回流中可用字节数mark():在流中标记一个位置reset():返回标记过得位置markSupp
3、ort():是否支持标记和复位操作close():关闭流int read() :从输入流中读一个字节,形成一个 0255 之间的整数返回(是一个抽象方法) 。int read(byte b) :读多个字节到数组中。int read(byte b, int off, int len):从输入流中读取长度为 len 的数据,写入数组 b 中从索引 off 开始的位置,并返回读取得字节数。write(int b) :将一个整数输出到流中(只输出低位字节,抽象)write(byte b) :将字节数组中的数据输出到流中write(byte b, int off, int len) :将数组 b 中从
4、off 指定的位置开始,长度为 len 的数据输出到流中flush():刷空输出流,并将缓冲区中的数据强制送出close():关闭流例: 打开文件。本例以 FileInputStream 的 read(buffer)方法,每次从源程序文件 OpenFile.java 中读取 512 个字节,存储在缓冲区 buffer 中,再将以 buffer 中的值构造的字符串 new String(buffer)显示在屏幕上。程序如下:import java.io.*;public class OpenFile public static void main(String args) throws IOEx
5、ceptiontry /创建文件输入流对象FileInputStream rf = new FileInputStream(“OpenFile.java“);int n=512;byte buffer = new byten;while (rf.read(buffer,0,n)!=-1) System.out.println();rf.close(); /关闭输入流catch (IOException ioe)System.out.println(ioe);catch (Exception e)System.out.println(e);例 : 写入文件。本例用 System.in.read(
6、buffer)从键盘输入一行字符,存储在缓冲区 buffer 中,再以FileOutStream 的 write(buffer)方法,将 buffer 中内容写入文件 Write1.txt 中,程序如下:import java.io.*;public class Write1 public static void main(String args)trySystem.out.print(“Input: “);int count,n=512;byte buffer = new byten;count = System.in.read(buffer); /读取标准输入流FileOutputStre
7、am wf = new FileOutputStream(“Write1.txt“);/创建文件输出流对象wf.write(buffer,0,count); /写入输出流wf.close(); /关闭输出流System.out.println(“Save to Write1.txt!“);catch (IOException ioe)System.out.println(ioe);catch (Exception e)System.out.println(e);2、管道流 管道用来把一个程序、线程和代码块的输出连接到另一个程序、线程和代码块的输入。java.io 中提供了类 PipedInpu
8、tStream 和 PipedOutputStream 作为管道的输入/输出流管道输入流作为一个通信管道的接收端,管道输出流则作为发送端。管道流必须是输入输出并用,即在使用管道前,两者必须进行连接管道输入/输出流可以用两种方式进行连接:在构造方法中进行连接PipedInputStream(PipedOutputStream pos);PipedOutputStream(PipedInputStream pis);通过各自的 connect()方法连接在类 PipedInputStream 中,connect(PipedOutputStream 在类 PipedOutputStream 中,co
9、nnect(PipedInputStream pis);例: 管道流。本例例管道流的使用方法。设输入管道 in与输出管道 out 已连接,Send 线程向输出管道 out 发送数据,Receive 线程从输入管道 in 中接收数据。程序如下:import java.io.*;public class Pipedstreampublic static void main (String args)PipedInputStream in = new PipedInputStream();PipedOutputStream out = new PipedOutputStream();tryin.co
10、nnect(out);catch(IOException ioe) Send s1 = new Send(out,1);Send s2 = new Send(out,2);Receive r1 = new Receive(in);Receive r2 = new Receive(in);s1.start();s2.start();r1.start();r2.start();class Send extends Thread /发送线程PipedOutputStream out;static int count=0; /记录线程个数int k=0;public Send(PipedOutputS
11、tream out,int k)this.out= out;this.k= k;this.count+; /线程个数加 1public void run( )System.out.print(“rnSend“+this.k+“: “+this.getName()+“ “);int i=k;try while (i f2.lastModified() copy(f1,f2); /复制getinfo(f1);getinfo(child);elseSystem.out.println(f1.getName()+“ file not found!“);public void copy(File f1,
12、File f2) throws IOException /创建文件输入流对象FileInputStream rf = new FileInputStream(f1);FileOutputStream wf = new FileOutputStream(f2);/创建文件输出流对象int count,n=512;byte buffer = new byten;count = rf.read(buffer,0,n); /读取输入流while (count != -1)wf.write(buffer,0,count); /写入输出流count = rf.read(buffer,0,n);System
13、.out.println(“CopyFile “+f2.getName()+“ !“);rf.close(); /关闭输入流wf.close(); /关闭输出流public static void getinfo(File f1) throws IOException SimpleDateFormat sdf;sdf= new SimpleDateFormat(“yyyy年 MM 月 dd 日 hh 时 mm 分 “);if (f1.isFile()System.out.println(“t“+f1.getAbsolutePath()+“t“+f1.length()+“t“+sdf.forma
14、t(new Date(f1.lastModified();elseSystem.out.println(“t“+f1.getAbsolutePath();File files = f1.listFiles();for (int i=0;ifiles.length;i+)getinfo(filesi);例 : 随机文件操作。本例对一个二进制整数文件实现访问操作当以可读写方式“rw“打开一个文件”prinmes.bin“时,如果文件不存在,将创建一个新文件。先将 2 作为最小素数写入文件,再依次测试 100 以内的奇数,将每次产生一个素数写入文件尾。程序如下:import java.io.*;pu
15、blic class PrimesFile RandomAccessFile raf;public static void main(String args) throws IOException(new PrimesFile(). createprime(100);public void createprime(int max) throws IOExceptionraf=new RandomAccessFile(“primes.bin“,“rw“);/创建文件对象raf.seek(0); /文件指针为 0raf.writeInt(2); /写入整型int k=3;while (k=max)
16、if (isPrime(k)raf.writeInt(k);k = k+2; output(max);raf.close(); /关闭文件public boolean isPrime(int k) throws IOExceptionint i=0,j;boolean yes = true;tryraf.seek(0); int count = (int)(raf.length()/4); /返回文件字节长度while (i=count) elsei+;raf.seek(i*4); /移动文件指针 catch(EOFException e) /捕获到达文件尾异常return yes;publi
17、c void output(int max) throws IOExceptiontryraf.seek(0); System.out.println(“2“+max+“中有 “+(raf.length()/4)+“ 个素数:“);for (int i=0;i(int)(raf.length()/4);i+)raf.seek(i*4); System.out.print(raf.readInt()+“ “);if (i+1)%10=0) System.out.println(); catch(EOFException e) System.out.println();程序运行时创建文件“prim
18、es.bin“,并将素数写入其中,结果如下:2100中有 25 个素数:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 六、 Java 中 Scanner 的用法Scanner 是 SDK1.5 新增的一个类,可是使用该类创建一个对象.Scanner reader=new Scanner(System.in); 然后 reader 对象调用下列方法 (函数),读取用户在命令行输入的各种数据类型 : next.Byte(),nextDouble(),nextFloat,nextInt(),nextLin
19、(),nextLong(),nextShot() 上述方法执行时都会造成堵塞,等待用户在命令行输入数据回车确认.例如,拥护在键盘输入12.34,hasNextFloat()的值是 true,而 hasNextInt()的值是 false. NextLine()等待用户输入一个文本行并且回车,该方法得到一个 String 类型的数据。下面是一个实例:import java.util.*;public class Examplepublic static void main(String args)System.out.println(“请输入若干个数,每输入一个数用回车确认“);System.o
20、ut.println(“最后输入一个非数字结束输入操作“);Scanner reader=new Scanner(System.in);double sum=0;int m=0;while(reader.hasNextDouble()double x=reader.nextDouble();m=m+1;sum=sum+x;System.out.printf(“%d 个数的和为%f/n“,m,sum);System.out.printf(“%d 个数的平均值是%f/n“,m,sum/m);七、JAVA 的三种标准输入方法例子 例:import java.io.BufferedReader;imp
21、ort java.io.InputStreamReader;import java.util.Scanner;public class SimpleIO public static void main(String args)throws Exceptionbyte b = new byte50;int num = System.in.read(b);/用普通的 System.in.read()读取;String sb = new String(b,0,num);System.out.println(sb);BufferedReader br = new BufferedReader(new InputStreamReader(System.in); /用缓冲流存放读取进来的String sbr = br.readLine();System.out.println(sbr);Scanner scan = new Scanner(System.in);/用扫描流对输入的数据 进行读取并进行咱存放。if(scan.hasNext()String ss = scan.next();System.out.println(ss);