java文件流

文件流 --分类

Java流分为两种流,

1、字节流:可以用于读写二进制文件及文件类型文件(byte)

2、字符流:可以用于读写文本文件,不能操作二进制文件

                   字节流            字符流

输入          InputStream      Reader

输出          OutputStream    Writer

 

标准I/O流与文件 

_______ 输入 __________ 
| |――――> | | 
| JVM | | 数据资源 | 
|_______| <――――|_________| 
输出 

对文件的操作 
File类(java.io.File)可表示文件或者目录(在JAVA中文件和目录都属于这个类中,而且区分不是非常的明显)。 

File下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文件的内容。 

注意:File类的对象实施表示一个文件并不是真正的文件,只是一个代理而已,通过这个代理来操作文件创建一个文件对象和创建一个文件在JAVA中是两个不同的概念。前者是在虚拟机中创建了一个文件,但却并没有将它真正地创建到OS的文件系统中,随着虚拟机的关闭,这个创建的对象也就消失了。而创建一个文件才是在系统中真正地建立一个文件。 
例如:File f=new File(11.txt);//创建一个名为11.txt的文件对象 
   f.CreateNewFile();//真正地创建文件 

File类的方法 

Boolean createNewFile() //创建文件         
     Boolean mkdir() //创建目录         
     Boolean mkdirs() //创建多个目录         
     Boolean delete() //删除文件,删除的是创建File对象时指定与之关联创建的那个文件。         
     Boolean deleteOnExit(); //在JVM进程退出的时候删除文件,通常用在临时文件的删除。         
     String[] List()://返回当前File对象下所以显文件和目录名(相对路径)         
     File[] ListFiles()://返回当前File对象(目录)中所有Files对象,用getName()来获得文件名。         
     isDirectory()和isFile()//来判断究竟是目录还是文件。         
     String getParent()//得到父类文件名,只有在构造对象时传入了Parent对象才有。         
     File getParentFile()//父路径名的抽象路径名,如果没有指定Parent对象,则返回 null。         
     String getPath()//获得相对路径。         
     exists() 判断文件或文件夹是否存在。
getAbsolutePath() //获得文件的绝对路径    


处理跨平台性
对于命令:File f2=new file(d:\\abc\\789\\1.txt) 
这个命令不具备跨平台性,因为不同的OS的文件系统的分隔符是不相同。 
使用file类的separtor属性,返回当前平台文件分隔符。 

File newD = new File("aa"+File.separator+"bb"+File.separator+"cc");
       File newF = new File(newD,"mudi.txt");
                   try{
       newD.mkdirs();
       newF.createNewFile();
       }catch(Exception e)
       {
}


Java中的I/O 

使用I/O流访问file中的内容。 
JVM与外界通过数据通道进行数据交换。 
分类:按流分为输入流和输出流,按传输单位分为字节流和字符流,还可以分为节点流和过滤流。 

节点流:负责数据源和程序之间建立连接。 
过滤流:用于给节点增加功能。在关闭流时如果使用了过滤流,只需关闭最外层的流就可以了。 

过滤流的构造方式是以其他流为参数构造(这样的设计模式称为装饰模式)并且过滤流本身不能使用,他的作用只是增强节点流的功能。 



字节输入流: 
InputStream类(抽象类) 

io包中的InputStream为所有字节输入流的父类。 
int read();读入一个字节(每次一个); 
可先使用newbyte[]=数组,调用read(byte[] b),byte[]数组长度决定了可以读取到的最大字节数,用来调整效率。read(byte[])返回值可以表示有效数;read (byte[])返回值为-1表示结束。 

字节输出流:

io包中的OutputStream位所有字节输入流的父类。

Write和输入流中的read相对应。 

在流中close()方法由程序员控制。因为输入输出流已经超越了VM的边界,所以有时可能无法回收资源。 
原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。 
以Stream结尾的类都是字节流。 
如果构造FileOutputStream的同时磁盘会建立一个文件。如果创建的文件与磁盘上已有的文件名重名,就会发生覆盖。 
用FileOutputStream中的boolean,则视添加情况,将数据覆盖重名文件还是将输入内容放在文件的后面。(编写程序验证) 

所有字节输入流的父类 
如:FileInputStream,ObjectInputStream,PipedInputStrean都是InputStream类的子类。 

1) 三个基本的read()方法 
a. int read(): 从流里读出的一个字节或者-1; (实际读了多长) 
b. int read(byte[]):将数据读入到字节数组中,并返回所读的字节数; (期望读了多长) 
c. int read(byte[], int , int):两个int参数指定了所要填入的数组的子范围。
 
2) 其它方法 
a. void close(): 关闭流,如使用过滤器流,关闭最外部的流,会关闭其余的流。 
b. int available(): 返回可从流中读取的字节数。 
c. skip(long): 丢弃了流中指定数目的字符。 
d. boolean markSupported() 
e. void mark(int) 
f. void rese()
 

OutputStream类(抽象类) 
所有输出流的父类。 

1) 三个基本的write()方法 
a. void write(): 
b. void write(byte[]): 
c. void write(byte[], int , int)
 
2) 其它方法 
a. void close(): 关闭流,如使用过滤器流,关闭最外部的流,会关闭其余的流。 
b. void flush(): 允许你强制执行写操作。
 
注意:在流中close()方法由程序员控制。因为输入输出流已经超越了JVM的边界,所以有时可能无法回收资源。 
原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。 

基本输入输出所使用的类的介绍: 
FileInputStream和FileOutputStream(文件输入输出流) 

以上两个是字节流 
1) 结点流,可以对磁盘文件进行操作。 
2) 要构造一个FileInputStream,所关联的文件必须存在而且是可读的。 
3) 要构造一个FileOutputStream而输出文件已经存在,则它将被覆盖。 

FileInputStream infile = new FileInputStream("myfile.dat"); 
FIleOutputStream outfile = new FileOutputStream("results.dat"); 
FileOutputStream outfile = new FileOutputStream(results.dat,true); 
参数为true时输出为添加,为false时为覆盖。 

FileOutputStream类代码:(为什么能建文件) 

public FileOutputStream(String name){ 
this(name!=null?new File(String):null,false); 
} 


DataInputStream和DataOutputStream(字节流) 
以上两个是过滤流。通过流来读写Java基本类,注意DataInputStream和DataOutputStream的方法是成对的。支持直接输出输入各种数据类型。 

writeBoolean(boolean b),readBoolean() ------以1bit数据传送
writeByte(int),readInt()------以1 byte数据传送
writeBytes(String s),readLine() (已过时方法)将字符串按字节顺序写出到基础输出流中以byte序列数据传送
writeChar(int v),readChar()――――――以 2 byte             
writeChars(String s),readChar()-------------以 2 byte序列
writeDouble(double d),readDouble() -------以 8 byte            
writeInt(int v),readInt()
writeLong(long l),readLong()
writeShort(short s),readShort()
            writeUTF(String),readUTF()-----------能输出中文!    


注意:使用DataOutputStream/DataInputStream时,要注意写入顺序和读取顺序相同,否则会将没有分割写入的信息分割不正确而读取出错误的数据。 

BufferInputStream和BufferOutputStream(带缓存的字节流) 
以上两个是过滤流,可以提高I/O操作的效率 ,用于给节点流增加一个缓冲的功能。 

在JVM的内部建立一个缓冲区,数据先写入缓冲区,等到缓冲区的数据满了之后再一次性写出,效率很高。使用带缓冲区的输入输出流的速度会大幅提高,缓冲区越大,效率越高。(这是典型的牺牲空间换时间) 

切记:使用带缓冲区的流,如果数据数据输入完毕,使用flush()方法将缓冲区中的内容一次性写入到外部数据源。用close()也可以达到相同的效果,因为每次close()都会调用flush()。一定要注意关闭外部的过滤流 

管道流(和UnixC++中的FIFO相同) 

PipedInputStream和PipedOutputStream(字节流) 

这两个是节点流,注意,用来在线程间通信

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值