1.1、概念
开发中经常要进行输入输出操作,掌握Java中的IO流显得非常必要。
流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。
一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。
流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。
实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。
形象的比喻——水流 ,文件======程序,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出。便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。
Java流操作有关的类或接口:
Java IO流的结构图:
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
1.2、IO流的分类
根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流
1.2.1、字符流和字节流
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:
读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。
1.2.2、输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
二、File类
2.1、简介
File类是io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建、删除、重命名文件等。File类的对象主要用来获取文件本身的一些信息,如文件所在目录、文件的长度、文件读写权限等。数据流可以将数据写入到文件中,而文件也是数据流最常用的数据媒体。
提供定位本地文件系统、描述文件和目录的功能
是 java.io 包中引用实际磁盘文件的唯一对象
File类对象描述文件路径、名字、长度、可否读写等属性,可用来命名文件、查询文件属性和处理目录,但不读写文件。
解决程序与文件系统的沟通
各种文件系统提供的基本服务一样,但实现细节互不兼容
构造函数
File(String pathname);
File(String dir, String subpath);
File(File dir, String subpath);
File(String path) 文件(相对路径),移植性较好: File f1 = new File(“mydir\\myfile.txt”); 目录(绝对路径): File f2 = new File(“d:\\mydir\\dir1”); File(String parent, String child ) 文件路径以及文件名: File f3 = new File(“d:\\d1” , “a.java”) File(File dir, String name) 文件对象与文件名:File f4 = new File(f2 , “myfile.txt”);
常用方法
canRead()、canWrite()、delete()、equals(object)、exists() getAbsolutePath() 和 length()
| 方法 | 描述 |
| String getName() | 获取文件的名称 |
| boolean canRead() | 判断文件是否是可读的 |
| boolean canWrite() | 品判断文件是否可被写入 |
| boolean exits() | 判断文件长度是否存在 |
| int length() | 获取文件的长度(以字节为单位) |
| String getAbsolutePath() | 获取文件的绝对路径 |
| String getParent() | 获取文件的父路径 |
| boolean isFile() | 判断此抽象路径名表示的文件是否为普通文件 |
| boolean isDirectory() | 判断此抽象路径名表示的是否是一个目录 |
| boolean isHidden | 判断文件是否是隐藏文件 |
| long lastModified() | 获取文件最后修改时间 |
| Boolean canExecute() |
测试应用程序是否可以执行此抽象路径名表示的文件。
|
| boolean createNewFile() | 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 |
| boolean delete() | 删除由此抽象路径名表示的文件或目录。 |
| File[] listFiles() | 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 |
| String[] list() | 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 |
| boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。可创建多层文件包 |
| boolean mkdir() | 创建由此抽象路径名命名的目录。只能创建一层文件包 |
| boolean reNameTo(File dest) | 重命名由此抽象路径名表示的文件。 |
| boolean setReadOnly() |
标记由此抽象路径名命名的文件或目录,以便只允许读取操作。
|
| boolean setWritable(boolean writable) |
一种方便的方法来设置所有者对此抽象路径名的写入权限。
|
2.2、文件操作示例
创建与删除文件:
package com.io; import java.io.File; import java.io.IOException; public class IODemo1 { public static void main(String[] args) throws IOException { File file=new File("d:"+File.separator, "file1.txt"); if(file.exists()){ file.delete(); System.out.println("删除成功!"); }else{ file.createNewFile(); System.out.println("创建成功!"); } } }
常见文件操作:
package com.file; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class IODemo1 { public static void main(String[] args) throws IOException { //创建方法 /* @SuppressWarnings("unused") File file = new File("F:\\a.txt"); //System.out.println("创建成功了吗?"+file.createNewFile()); //System.out.println("单级文件夹创建成功了吗?"+file.mkdir()); //System.out.println("多级文件夹创建成功了吗?"+file.mkdirs()); //File dest = new File("F:\\电影\\c.txt"); //System.out.println("重命名成功了吗?"+file.renameTo(dest)); */ /* //删除方法 File file = new File("F:\\电影"); System.out.println("删除成功了吗?"+file.delete()); file.deleteOnExit(); */ //判断方法 /* File file = new File("F:\\a.txt"); System.out.println("文件或者文件夹存在吗?"+file.exists()); System.out.println("是一个文件吗?"+file.isFile()); System.out.println("是一个文件夹吗?"+file.isDirectory()); System.out.println("是隐藏文件吗?"+file.isHidden()); System.out.println("此路径是绝对路径名?"+file.isAbsolute()); */ //获取方法 /* File file = new File("f:\\a.txt"); System.out.println("文件或者文件夹得名称是:"+file.getName()); System.out.println("绝对路径是:"+file.getPath()); System.out.println("绝对路径是:"+file.getAbsolutePath()); System.out.println("文件大小是(以字节为单位):"+file.length()); System.out.println("父路径是"+file.getParent()); //使用日期类与日期格式化类进行获取规定的时间 long lastmodified= file.lastModified(); Date data = new Date(lastmodified); SimpleDateFormat simpledataformat = new SimpleDateFormat("YY年MM月DD日 HH:mm:ss"); System.out.println("最后一次修改的时间是:"+simpledataformat.format(data)); */ //文件或者文件夹的方法 File[] file = File.listRoots(); System.out.println("所有的盘符是:"); for(File item : file){ System.out.println("\t"+item); } File filename =new File("F:\\Java workspace\\Java"); String[] name = filename.list(); System.out.println("指定文件夹下的文件或者文件夹有:"); for(String item : name){ System.out.println("\t"+item); } File[] f = filename.listFiles(); System.out.println("获得该路径下的文件或文件夹是:"); for(File item : f){ System.out.println("\t"+item.getName()); } } }