1 初识Java IO
IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。
Java 中是通过流处理IO 的,那么什么是流?
流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。
当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。
一般来说关于流的特性有下面几点:
一:先进先出:最先写入输出流的数据最先被输入流读取到。
二:顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外)
三:只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。
1、输入流与输出流
输入与输出是相对于应用程序而言的,比如文件读写,读取文件是输入流,写文件是输出流,这点很容易搞反。
字节输入输出流:
字节流用于处理二进制数据的读取和写入,它以字节为单位,InputStream类和OutputStream类是字节流的抽象类,它们定义了数据流读取和写入的基本方法。各个子类会根据其特点实现或覆盖这些方法。
1、字节数入流抽象类InputStream
InputStream 类是字节输入流的抽象类,定义了操作输入流的各种方法,这些方法如下:
返回方法说明intavailable()返回当前输入流的数据读取方法可以读取的有效字节数量
Abstract intread()从当前数据流中读取一个字节。若已达到流结尾,则返回-1
intread(byte[ ] bytes)从当前输入流读取一定的byte数据,并存取在数组中,然后返回读取的byte数据的数量,若已到达流结尾,则返回-1。
voidreset()将当前的输入流重新定位到最后一次调用mark()方法时的位置
voidmark(int readlimit)在当前输入流中做标记位置,当调用reset()方法时将返回到该位置,从标记位置开始,到再读入readlimit个字符为止,这个标记都维持有效。
BooleanmarkSupported()测试当前输入流是否支持mark()和reset()方法,只要其中一个不支持,则返回false
longskip(long n)跳过和丢弃当前输入的n个字节数据\n\nvoidclose()关闭当前输入流,并释放任何与之相关联的系统资源
InputStream 类是抽象类,不能通过new关键字来创建该实例对象,需要其子类创建该实例对象。
2、字节输出流抽象类OutputStream类
OutputStream定义了输出流的各种方法,如下表:
返回方法说明voidwrite(byte[ ] b)将byte[ ] 数组中的数据写入当前输出流
voidwrite(byte[] b ,int off, int len)将byte[ ]数组下标off开始的len长度的数据写入当前输出流
Abstract voidwrite(int b)写入一个byte数据到当前输出流\n\nvoidflush()刷新当前输出流,并强制写入所有缓冲的字节数据
voidclose()关闭当前输出流
和InputStream类一样,OutputStream 类是抽象类,不能通过new关键字来创建该实例对象,需要其子类创建该实例对象。
文件的复制:
代码如下:
package com.huanxiao.test07;
import java.io.*;
public class CopyFileTest {
public static void main(String[] args) throws IOException {
//1.定义源文件和目标文件的File对象
File f1=new File("D:/oo/来自爱你的一个表白.txt");
File newFile=new File("D:/aa/newFile.txt");
//2.定义输出流关联文件
InputStream in=new FileInputStream(f1);
OutputStream out=new FileOutputStream(newFile);
// //3.使用输入流读取内容,然后把读取的内容写入目标文件中
// int n;
// while ((n=in.read())!=-1) {
// out.write(n);
// }
// byte[] b=new byte[10];
// while (true){
// int n=in.read();
// if(n!=-1){
// out.write(b,0,n);
// }else {
// break;
// }
// }
byte[] buffer=new byte[1024];
int n;
while ((n=in.read(buffer))!=-1){
out.write(buffer,0,n);
}
}
}