为进行数据的输入/输出操作,Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream)。
Stream是从起源(source)到接收(sink)的有序数据
java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能。
两种基本的流:输入流和输出流
输入流:只能从中读取字节数据,而不能向其写出数据
输出流:只能向其写字节数据,而不能从中读取数据
按照流所处理的数据类型划分,可以分为:
字节流:用于处理字节数据。
字符流:用于处理Unicode字符数据。
可以从/向一个特定的IO设备(如磁盘、网络)读/写数据的流,称为节点流。节点流也被称为低级流。
实现对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读/写功能的流,称为处理流。处理流也被称为高级流。
InputStream/OutputStream用于处理字节数据。它们读/写流的方式都是以字节为单位进行的。
§三个基本的read方法: •int read():读取一个字节,并将它返回。 •int read(byte[] buffer):将数据读入一个字节数组,同时返回读取的字节数。 •int read(byte[] buffer, int offset, int length):将数据读入一个字节数组,放到数组的offset指定的位置开始,并用length来指定读取的最大字节数。 § 其它方法: •void close():关闭流。 •int available():返回可以从中读取的字节数。 •long skip(long n):在输入流中跳过n个字节,将实际跳过的字节数返回。 •boolean markSupported():判断流是否支持标记功能。 •void mark(int readlimit):在支持标记的输入流的当前位置设置一个标记。 •void reset():返回到流的上一个标记。注意必须流支持标记功能。 |
低级InputStream类: InputStream ByteArrayInputStream PipedInputStream FileInputStream 高级InputStream类: DataInputStream BufferedInputStream |
Demo1
package com.zgd; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class Demo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { FileInputStream fis = new FileInputStream("D:/hello.txt"); int c = fis.read(); int a = fis.read(); System.out.println((char)c); System.out.println((char)a); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
Demo2
package com.zgd; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class Demo1 { public static void main(String[] args) { // TODO Auto-generated method stub try { FileInputStream fis = new FileInputStream("D:/hello.txt"); int i = -1; while((i=fis.read())!=-1){ //int c = fis.read(); System.out.print((char)i); } fis.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
•通过FileInputStream从源文本文件中读出数据,然后通过FileOutputStream写入到另外一个文本文件中
三个基本的write方法: void write(int c) void write(byte[] buffer) void write(byte[] buffer, int offset, int length) 其它方法 void close() void flush() |
低级OutputStream OutputStream ByteArrayOutputStream PipedOutputStream 高级OutputStream DataOutputStream BufferedOutputStream |
Demo3
直接读一个字节很慢
package com.zgd; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo3 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //复制文件 FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("D://1.avi"); fos = new FileOutputStream("D://2.avi"); int i = 0; while((i=fis.read())!=-1){ fos.write(i); } fis.close(); fos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
Demo4
读1024个字节速度快
package com.zgd; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo4 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //复制文件 FileInputStream fis = null; FileOutputStream fos = null; try { System.out.println(System.currentTimeMillis()); fis = new FileInputStream("D://1.avi"); fos = new FileOutputStream("D://2.avi"); byte [] b = new byte[1024]; int i = 0; while((i=fis.read(b))!=-1){ //fos.write(b); fos.write(b,0,i); } fis.close(); fos.close(); System.out.println(System.currentTimeMillis()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
Reader/Writer处理的是字符类型的数据。它处理流的方式是以字符为单位进行的。
Reader/Writer和InputStream/OutputStream一样,也分为节点流(低级流)和处理流(高级流)。
Reader和InputStream一样,用于从流中读取数据。它和InputStream的区别在于,InputStream以字节为单位操作流,而Reader以字符为单位操作流。
读取方法: int read():用于从流中读出一个字符,并将它返回。 int read(char[] buffer):将从流中读出的字符放到字符数组buffer中,返回读出的字符数。 int read(char[] buffer,int offset,int length):将读出的字符放到字符数组的指定offset开始的空间,每次最多读出length个字符。 其他方法: void close():关闭Reader流。 boolean ready():判断流是否已经准备好被读取。 skip(long n):跳过指定的n个字符。 boolean markSupported():和InputStream中的markSupported方法类似。 void mark(int readAheadLimit):和InputStream中的mark方法类似。 void reset():和InputStream中的reset方法类似。 |
低级Reader类: CharArrayReader StringReader PipedReader FileReader 高级Reader类 BufferedReader InputStreamReader LineNumberReader |
Demo5
读取字符汉字
package com.zgd; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Demo5 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int c; try { FileReader fr = new FileReader("D:/hello.txt"); while((c = fr.read())!=-1){ System.out.print((char)c); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
写入方法: void write(int c):将参数c的低16位组成字符写入到流中。 void write(char[] buffer):将字符数组buffer中的字符写入到流中。 void write(char[] buffer, int offset, int length):将字符数组buffer中从offset开始的length个字符写入到流中。 void write(String string):将string字符串写入到流中。 void write(String string, int offset, int length):将字符string中从offset开始的length个字符写入到流中。 其他方法: void close():和OutputStream的close方法类似。 void flush():和OutputStream的flush方法类似。 |
低级Writer类: CharArrayWriter StringWriter PipedWriter FileWriter 高级Writer类: BufferedWriter OutputStreamWriter PrintWriter |
Demo6
package com.zgd; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo6 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { System.out.println(System.currentTimeMillis()); BufferedInputStream bis = null; BufferedOutputStream bos = null; bis = new BufferedInputStream(new FileInputStream("D://1.avi")); bos = new BufferedOutputStream(new FileOutputStream("D://2.avi")); int i = 0; while((i= bis.read())!= -1){ bos.write(i); } bos.flush(); bis.close(); bos.close(); System.out.println(System.currentTimeMillis()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |