IO
1.流的概念和作用
流:代表任何有能力产出数据源对象或者是有能力接受数据的接收对象
流的本质:数据传输,根据数据传输性将流抽象为各种类,方便更直观的进行数据操作
流的作用:为数据源和目的地建立一个输送通道。
2.java中的节点流:
节点流分为字节流和字符流。 (1)字节流为FileInputStream(输入)和FileOutputStream(输出)两个类。在字节流中,我们通常用字节数组(byte[ ])来作为运输这些字节流的载体。 (2)字符流为FileReader(读入)和FileWriter(写出)两个类。在字符流中,我们通常用字符数组(char[ ])来作为运输这些字节流的载体。
3.特性:
相对于程序来说,输出流是往存储介质或数据通道写入数据,而输入流是从存储介质或数据通道中读取数据,一般来说关于流的特性有下面几点:
1、先进先出,最先写入输出流的数据最先被输入流读取到。
2、顺序存取,可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile可以从文件的任意位置进行存取(输入输出)操作)
3、只读或只写,每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。
outputStream中的三个基本的写方法
abstract void write(int?b):往输出流中写入一个字节。
void write(byte[]?b) :往输出流中写入数组b中的所有字节。
void write(byte[]?b, int?off, int?len) :往输出流中写入数组b中从偏移量off开始的len个字节的数据。
其它方法
void flush() :刷新输出流,强制缓冲区中的输出字节被写出。
void close() :关闭输出流,释放和这个流相关的系统资源。
一个对应于某磁盘文件或目录的File对象一经创建, 就可以通过调用它的方法来获得文件或目录的属性。
1)public boolean exists( ) 判断文件或目录是否存在
2)public boolean isFile( ) 判断是文件还是目录
3)public boolean isDirectory( ) 判断是文件还是目录
4)public String getName( ) 返回文件名或目录名
5)public String getPath( ) 返回文件或目录的路径。
6)public long length( ) 获取文件的长度
7)public String[ ] list ( ) 将目录中所有文件名保存在字符串数组中返回。
File类中还定义了一些对文件或目录进行管理、操作的方法,常用的方法有:
1) public boolean renameTo( File newFile ); 重命名文件
2) public void delete( ); 删除文件
3) public boolean mkdir( ); 创建目录
三.字节流和字符流
字节流:InputStream和OutputStream是java按照最小字节单位读取的流,每次都读取一个字节。
字符流:是以字符为单位进行数据处理的IO流。
字节流与字符流之间的区别?
1.读取的单位不同:字节流是以字节为单位(8位2进制),字符流是以字符为单位,根据码表来映射字符
2.处理对象不同:字节流可以处理所有类型的数据(如图片,avi等),字符流只可以处理字符类型的数据
四.节点流
1.文件:FileInputStream,FileOutputStream
```java
public class IODemo2 {
//声明输入流,输出流
staticInputStream in = null;
staticOutputStream os = null;
publicstatic void main(String[] args) {
//创建流
try{
in= new FileInputStream("D:/text.txt");
//如果输出流中没有该文件,java会自动帮你创建该路径文件
os= new FileOutputStream("E:/text.txt");
//字节数据
byte[]b = new byte[1024];
//长度
intlen=0;
//读取文件内容并写入
while((len=in.read(b))!=-1){
//写入,如果写读取长度范围,就会一次性读取1024范围,造成空间浪费读取
os.write(b,0,len);
}
//清理缓冲
os.flush();
}catch (FileNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}finally{
//关闭资源
//判断是否存入的流对象为空
try{
if(in!=null){ //防止空指针异常
in.close();
}
if(os!=null){ //防止空指针异常
os.close();
}
}catch(IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
```
##### 2.FileReader,FileWriter
```
public class Test01 {
publicstatic void main(String[] args) throws IOException {
//输入流,输出流
Readerrd = new FileReader("D:/text.txt");
Writerwt = new FileWriter("D:/hao.txt");
//字符数组
char[]car = new char[1024];
//个数
intlen=-1;
while(-1!=(len=rd.read(car))){
wt.write(car,0,len);
System.out.println("完成拷贝!");
}
//刷出
wt.flush();
//关闭资源
wt.close();
rd.close();
}
}
```
#### 五.对象(功能)流
1.ObjectOutputStream(对象输出流)
2.ObjectInputStream(对象输入流)
```java
//对象输出流
publicstatic void getWrite(String name) throws IOException {
ObjectOutputStreamos = new ObjectOutputStream(new FileOutputStream(name));
os.writeBoolean(false);
os.writeChar(97);
os.writeObject(newPerson("李杨",22));
os.writeUTF("UTF-8");
//刷出
os.flush();
//关闭资源
os.close();
}
//对象输入流
publicstatic void getRead(String name) throws IOException, ClassNotFoundException {
ObjectInputStreamois = new ObjectInputStream(new FileInputStream(name));
booleanb = ois.readBoolean();
charc = ois.readChar();
Objecto = ois.readObject();
System.out.println(b+"---->"+c+"----->"+o);
//关闭资源
ois.close();
}