java IO简单总结

前言

在涉及IO流之前需要知道文件的概念。文件是数据源(保存数据的的地方)的一种,比如word文件、txt文件。他既可以保存一张图片,也可以保存视频、声音。。。等等
文件流
Alt text
文件在程序中是以流的形式来操作的
流:数据在数据源(文件)和程序(内存)之间经历的路径
输入流:数据从数据源到内存的路径
输出流:数据从内存到数据源的路径

IO流分类

1.根据处理数据类型的不同分为:字符流和字节流
字节流:可以用于读写二进制文件及任何类型的byte,也就是一个字节一个的读
字符流:可以用于读写文本文件,不能操作二进制文件,也就是两个字节两个字节的读
2.根据数据流向不同分为:输入流和输出流
3。节点流和处理流
节点流:直接与数据源相连,读入或读出,可以发现使用该流过于频繁操作硬件,从而使读写很不方便
常用的结点流:

父类:InputStream、OutputStream、Reader、Writer
文件 :FileInputStream 、 FileOutputStrean 、FileReader、FileWriter 文件进行处理的节点流
数 组 :ByteArrayInputStream、 ByteArrayOutputStream、 CharArrayReader 、CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)
字符串 :StringReader、 StringWriter 对字符串进行处理的节点流
管 道 :PipedInputStream 、PipedOutputStream 、PipedReader 、PipedWriter 对管道进行处理的节点流

处理流:处理流和节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
Alt text
常用的处理流:

缓冲流:BufferedInputStrean 、BufferedOutputStream、 BufferedReader、 BufferedWriter 增加缓冲功能,避免频繁读写硬盘
转换流:InputStreamReader 、OutputStreamReader实现字节流和字符流之间的转换
数据流: DataInputStream 、DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来

Alt text

文件File类

File常用方法

创建:
createNewFile()在指定位置创建一个空文件,成功就返回true,如果已存在就不创建,然后返回false。
mkdir() 在指定位置创建一个单级文件夹。
mkdirs() 在指定位置创建一个多级文件夹。
renameTo(File dest)如果目标文件与源文件是在同一个路径下,那么renameTo的作用是重命名, 如果目标文件与源文件不是在同一个路径下,那么renameTo的作用就是剪切,而且还不能操作文件夹。
删除:
delete() 删除文件或者一个空文件夹,不能删除非空文件夹,马上删除文件,返回一个布尔值。
deleteOnExit()jvm退出时删除文件或者文件夹,用于删除临时文件,无返回值。
判断:
exists() 文件或文件夹是否存在。
isFile() 是否是一个文件,如果不存在,则始终为false。
isDirectory() 是否是一个目录,如果不存在,则始终为false。
isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。
isAbsolute() 测试此抽象路径名是否为绝对路径名。
获取:
getName() 获取文件或文件夹的名称,不包含上级路径。
getAbsolutePath()获取文件的绝对路径,与文件是否存在没关系
length() 获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。
getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。
lastModified()获取最后一次被修改的时间。
文件夹相关:
static File[] listRoots()列出所有的根目录(Window中就是所有系统的盘符)
list() 返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。
listFiles() 返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。
list(FilenameFilter filter)返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
listFiles(FilenameFilter filter)返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//创建一个文件对象
File f1=new File("e:\\aa.txt");
//得到文件的路径
System.out.println("文件路径"+f1.getAbsolutePath());
//得到文件的大小,字节数
System.out.println("文件的大小"+f1.length());
//创建文件夹
File f3=new File("e:\\ff");
//判断文件夹是否存在
if(f3.isDirectory()){
System.out.println("文件夹存在,不能创建!");
}else{
//创建文件夹
f3.mkdir();
}
//创建文件和创建文件夹
File f2=new File("e:\\ff\\zwl.txt");
//判断文件是否存在
if(!f2.exists())//可以创建
try {
f2.createNewFile();//创建一个新文件
} catch (Exception e) {
e.printStackTrace();
}
else{
System.out.println("文件存在,不能创建!");
}
//列出一个文件夹下面的所有文件
File f4=new File("e:\\ff");
//判断文件夹是事存在
if(f4.isDirectory()){
//将文件夹的文件,传给lists数组
//将文件夹的文件,传给lists数组
File lists[]=f4.listFiles();
//遍历数组
for(int i=0;i<lists.length;i++){
//输出文件夹下所有文件文件名
System.out.println("显示出文件名是"+lists[i].getName());
}
}

对应的结果:

文件路径e:\aa.txt
文件的大小0
显示出文件名是zwl.txt

文件字节与字符流

InputStream常用方法

public abstract int read() throws IOException:从输入流中读取数据的下一个字节,到达末尾,返回-1;
public int read(byte[] b)throws IOException:从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
public int read(byte[] b,int off,int len)throws IOException:将输入流中最多 len 个数据字节读入 byte 数组
public void close() throws IOException:关闭此输入流并释放与该流关联的所有系统资源

OutputStream常用方法

public void flush()throws IOException:刷新此输出流并强制写出所有缓冲的输出字节
public abstract void write(int b)throws IOException:将 b.length 个字节从指定的 byte 数组写入此输出流。
public void write(byte[] b, int off, int len)throws IOException:将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
public void write(byte[] b)throws IOException:将指定的字节写入此输出流。

Reader与Writer和上述方法基本类似,只不过它操作的是字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int b=0;
//FileInputStream in=null;
FileReader in=null;
FileOutputStream out=null;
try {
in=new FileReader("E:\\php练习\\readmeFirst.txt");
out=new FileOutputStream("E:\\php练习\\ttl.txt");
} catch (Exception e) {
System.out.println("not file");
System.exit(-1);
}
try {
long num=0;
while((b=in.read())!=-1){
System.out.print((char)b);
//out.write(b);;
num++;
}
in.close();
out.close();
System.out.println();
System.out.println("共读取了"+num+"个字符");
} catch (Exception e) {
System.out.println("error!");
System.exit(-1);
}
System.out.println("copy ok");

上面程序是将已存在的一个文件复制到另一个文件中

缓冲字节与字符流
它是在原来节点流基础上增加了一根管道,用于缓存数据,用法基本类似,但是它的构造函数必须是结点流,同时在字符缓冲流中有一个可以读取或存取字符串的方法如:

public String readLine()throws IOException:读取一个文本行

Object流
Object流的意思将是像一根节点流插入一根Object流管道,专门操作Object,而它必须实现Serializable接口,该接口的意思是可序列化,就是说将一个对象流序列化成子节流写进网络或者文件,比如说游戏存盘,有各个游戏的记录,如果以面向对象来写进管道,它的各个成员变量,会在内存中被序列化成二进制写进去,而Serializable接口无方法,它只是个标记接口,编译器看到实现该接口的类就知道它应该被序列化,同样有一个transient关键字,是使可序列化的某个属性变成透明,也就是它不能变成字节写进去,那个属性只能为默认属性写进去
ok,接下来就来看看Object流相关常用方法

ObjectOutput:有一个void writeObject(Object obj) throws IOException:将对象写入底层存储或流。
ObjectInput:Object readObject()throws ClassNotFoundException,IOException:读取并返回对象

最后不得不说IO流是在太复杂,就是一根管道不断套接着另一根管道,但是IO流是非常有用的,不仅能帮助我们了解计算机底层,而且涉及到数据传输都离不开它。。

热评文章