Java——流(Stream)、⽂件(File)和IO
⼀.  什么是 IO
Java中 I/O 操作主要是指使⽤ Java 进⾏输⼊,输出操作。 Java所有的I/O机制都是基于数据流进⾏输⼊输出,这些数据流表⽰了字符或者字节数据的流动序列。
Java 的 I/O 流提供了读写数据的标准⽅法。任何Java中表⽰数据源的对象都会提供以数据流的⽅式读写它的数据的⽅法。
⼆.  数据流的基本概念
基本流:⼀组有序,有起点和终点的字节的数据序列。包括输⼊流和输出流。
输⼊流:程序从输⼊流读取数据源。数据源包括外界(键盘、⽂件、⽹络…),即是将数据源读⼊到程序的通信通道。
输出流:程序向输出流写⼊数据。将程序中的数据输出到外界(显⽰器、打印机、⽂件、⽹络…)的通信通道。
为什么设计成数据流呢?
InputStream不关⼼数据源来⾃何种设备(键盘,⽂件,⽹络)
OutputStream不关⼼数据的⽬的是何种设备(键盘,⽂件,⽹络)
采⽤数据流的⽬的就是使得输出输⼊独⽴于设备。
三.  I/O体系结构
在整个Java.io包中最重要的就是5个类和⼀个接⼝。5个类指的是File、OutputStream、InputStream、Writer、Reader;⼀个接⼝指的是Serializable.
Java I/O主要包括如下⼏个层次,包含三个部分:
1.流式部分――IO的主体部分;
2.⾮流式部分――主要包含⼀些辅助流式部分的类,如:File类、RandomAccessFile类和FileDescriptor等类;
3.其他类–⽂件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的⽂件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。
1.  流式部分
Java中字符是采⽤Unicode标准,⼀个字符是16位,即⼀个字符使⽤两个字节来表⽰。为此,JAVA中引⼊了处理字符的流。
a.  对⽂件进⾏操作
FileInputStream(字节输⼊流),FileOutputStream(字节输出流),FileReader(字符输⼊流),FileWriter(字符输出流)
b. 对管道进⾏操作
PipedInputStream(字节输⼊流),PipedOutputStream(字节输出流),PipedReader(字符输⼊流),PipedWriter(字符输出流)PipedInputStream的⼀个实例要和PipedOutputStream的⼀个实例共同使⽤,共同完成管道的读取写⼊操作。主要⽤于线程操作。
c.  字节/字符数组
ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在内存中开辟了⼀个字节或字符数组。
d.  Buffered缓冲流
BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是带缓冲区的处理流。
缓冲区的作⽤的主要⽬的是:避免每次和硬盘打交道,提⾼数据访问的效率。
e.  转化流
InputStreamReader/OutputStreamWriter,把字节转化成字符。
f.  数据流
DataInputStream,DataOutputStream。
因为平时若是我们输出⼀个8个字节的long类型或4个字节的float类型,那怎么办呢?
可以⼀个字节⼀个字节输出,也可以把转换成字符串输出,但是这样转换费时间,若是直接输出该多好啊,因此这个数据流就解决了我们输出数据类型的困难。
数据流可以直接输出float类型或long类型,提⾼了数据读写的效率。
g.  打印流
printStream,printWriter,⼀般是打印到控制台,可以进⾏控制打印的地⽅。
h.  对象流
ObjectInputStream,ObjectOutputStream,把封装的对象直接输出,⽽不是⼀个个在转换成字符串再输出。
i.  序列化流
SequenceInputStream。
对象序列化:把对象直接转换成⼆进制,写⼊介质中。
【注】
使⽤对象流需要实现Serializable接⼝,否则会报错。
⽽若⽤transient关键字修饰成员变量,不写⼊该成员变量,若是引⽤类型的成员变量为null,值类型的成员变量为0.
2.  ⾮流式部分主要类
File(⽂件特征与管理):⽤于⽂件或者⽬录的描述信息,例如⽣成新⽬录,修改⽂件名,删除⽂件,判断⽂件所在路径等。
RandomAccessFile(随机⽂件操作):它的功能丰富,可以从⽂件的任意位置进⾏存取(输⼊输出)操作。
File类:
在Java语⾔的java.io包中,由File类提供了描述⽂件和⽬录的操作与管理⽅法。
但File类不是InputStream、OutputStream或Reader、Writer的⼦类,因为它不负责数据的输⼊输出,⽽专门⽤来管理磁盘⽂件与⽬录。
作⽤:File类主要⽤于命名⽂件、查询⽂件属性和处理⽂件⽬录。
a.  File类
共提供了四个不同的构造函数,以不同的参数形式灵活地接收⽂件和⽬录名信息。构造函数:
1)File (String pathname)
通过将给定路径名字符串转换成抽象路径名来创建⼀个新 File 实例。
File  f1=new File(""); //创建⽂件对象f1,f1所指的⽂件是在当前⽬录下创建的
2)File(URI uri)
通过将给定的 file: URI 转换成⼀个抽象路径名来创建⼀个新的 File 实例。
3)File (String parent , String child)
根据 parent 路径名字符串和 child 路径名字符串创建⼀个新 File 实例。
// 注意:D:\\dir1⽬录事先必须存在,否则异常
File f2=new  File(“D:\\dir1","");
4)File (File parent , String child)
通过给定的⽗抽象路径名和⼦路径名字符串创建⼀个新的File实例。
File  f4=new File("E:\\dir3");
File  f5=new File(f4,"");  //在如果 E:\\dir3⽬录不存在则需要先使⽤f4.mkdir()先创建
java stream⼀个对应于某磁盘⽂件或⽬录的File对象⼀经创建, 就可以通过调⽤它的⽅法来获得⽂件或⽬录的属性。
序号⽅法描述
1public String getName()
返回由此抽象路径名表⽰的⽂件或⽬录的名称。
2public String getPath()
将此抽象路径名转换为⼀个路径名字符串。
3public String getAbsolutePath()
返回抽象路径名的绝对路径名字符串。
4public boolean exists()
测试此抽象路径名表⽰的⽂件或⽬录是否存在。
5
public boolean isDirectory()
测试此抽象路径名表⽰的⽂件是否是⼀个⽬录。
6public boolean isFile()
测试此抽象路径名表⽰的⽂件是否是⼀个标准⽂件。
7public long length()
返回由此抽象路径名表⽰的⽂件的长度。
8public boolean delete()
删除此抽象路径名表⽰的⽂件或⽬录。
9public String[] list()
返回由此抽象路径名所表⽰的⽬录中的⽂件和⽬录的名称所组成字符串数组。
10public File[] listFiles()
返回⼀个抽象路径名数组,这些路径名表⽰此抽象路径名所表⽰⽬录中的⽂件。
11public boolean mkdir()
创建此抽象路径名指定的⽬录。
12public boolean mkdirs()
创建此抽象路径名指定的⽬录,包括创建必需但不存在的⽗⽬录。
13public boolean renameTo(File dest) 重新命名此抽象路径名表⽰的⽂件。
14public boolean equals(Object obj)
测试此抽象路径名与给定对象是否相等。
15public String toString()
返回此抽象路径名的路径名字符串。
【例】输出⼀个⽬录中的所有⽂件名(⽬录可能是多级⽬录,如a⽬录中有b、c⽬录。。。)
package  h;
import java.io.File;
import java.io.IOException;
class FileList{
public static void listDir( String dir)  throws IOException{
File file = new File(dir);
// 传进来的可能不是⼀个路径
if(!file.isDirectory()){
throw new IOException(dir + "不是⽬录");
}
// 传进来的可能是⼀个错误的路径
if(file == null){
throw new IOException("没有此路径");
}
File[] files = file.listFiles();
for(File f:files){
// 有可能是⼀个多级⽬录,递归调⽤
if(f.isDirectory()){
AbsolutePath());
}else{
// 是⽂件就直接输出该⽂件的绝对路径
System.out.AbsolutePath());
}
}
}
}
public class Test{
public static void main(String[] args) throws  IOException{
FileList.listDir("E:/aa");
}
}
执⾏结果:
E:\
E:\
E:\aa\
E:\aa\
四.  常⽤流类
1.  InputStream 抽象类
InputStream 为字节输⼊流,它本⾝为⼀个抽象类,必须依靠其⼦类实现各种功能,此抽象类是表⽰字节输⼊流的所有类的超类。 继承⾃InputStream 的流都是向程序中输⼊数据的,且数据单位为字节(8bit);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。