1.程序在运行期间,可能需要从外部的存储媒介或其他程序中读入所需要的数据,
这就需要使用输入流对象。
2.输入流的指向称作它的源,程序从指向源的输入流中读取源中读取源中的数据。
3.程序在处理数据后,可能需要将处理的结果写入到永久的存储媒介中或传送给
其他的应用程序,这就需要使用输出流对象。
4.输出流的指向称作它的目的地,程序通过向输出流中写入数据把数据传送到目
的地。
5.在Java中,将通过不同输入/输出设备(键盘,内存,显示器,网络等)之间的数据
传输抽象表述为“流”。Java中的“流”都位于java.io包中,称为IO(输入/输出)流。
6.按照处理数据的单位不同分为字节流和字符流。
7.Java把处理二进制数据的流称为字节流,字节流每次处理一个字节的数据,
以Stream结尾,说明是字节流。(例如:处理英文字符)
8.把处理某种格式的特定数据称为字符流,字符流每次处理一个字符的数据。
以Reader / Writer结尾,说明是字符流。(例如:处理汉字)
File类
1.File类是java.io包中唯一处理磁盘文件和目录的类。它定义的对文件和目录操作的方法
都是与平台无关的,通过使用File类提供的各种方法能够创建、删除文件和目录,获取磁盘
上指定文件和目录的相关信息。
2.File类的常用方法
创建功能
public boolean createNewFile()
public boolean mkdir()
public boolean mkdirs()
删除功能
public boolean delete()
重命名功能
public boolean renameTo(File dest)
mkdir()
只能在已经存在的目录中创建创建文件夹。
mkdirs()
可以在不存在的目录中创建文件夹。诸如:a\\b,既可以创建多级目录。
3.在Unix/Linux操作系统下,路径分隔符为“/”,而在Windows和DOS下的路径分隔符为“\”。
Java对这两种分隔符都支持。但是如果使用“\”作为分隔符,注意要以转义字符“\\”来代替,
例如以“c:\\sun\\jdk”表示“c:\sun\jdk”。
4.使用File(String filename)创建文件,当filename是文件名字时,该文件被认为与
当前应用程序在同一目录中。
5.遍历目录下的文件:
如果希望得到指定类型的文件,如获取指定目录下所有的'.java'文件,则可以使用重载
的list(FilenameFilter filter)方法,该方法接收一个FilenameFilter类型的参数。
FilenameFilter是一个接口,被称作文件过滤器,其中定义了一个抽象的方法
accept(File dir,String name),在调用list()方法时,需要实现文件过滤器,
在accept()方法中做出判断,从而获取到指定类型的文件。
6.list(FilenameFilter filter)方法的工作原理如下:
1️⃣调用list()方法传入FilenameFilter文件过滤器对象;
2️⃣取出当前File对象所代表目录下的所有子目录和文件
3️⃣对于每一个子目录或文件,都会调用文件过滤器对象的accept(File dir,String name)
方法,并把代表当前目录的File对象以及这个子目录或文件的名称作为参数dir和name传递
给方法。
4️⃣如果accept()方法返回true,就将当前遍历的这个子目录或文件添加到数组中,如果
返回false,则不添加。
如何遍历指定目录下所有扩展名为.java的文件:
如果想得到所有子目录下的File类型对象,list()方法显然不能满足,这时,可
以使用listFiles()方法,该方法返回一个File对象数组。
在操作文件时,经常需要删除一个目录下的某个文件或者删除整个目录,这时,首先会想到File类的delete()方法,但该方法无法删除目录。
删除文件失败了。因为File类的delete()方法只是删除一个指定的文件,假如File对象代表目录,并且目录下包含子目录或文件,则File类的delete()方法不允许对这个目录直接删除。
定义了一个删除目录的静态方法deleteDir(),接收一个File类型的参数。在这个方法中,调用listFiles()方法把这个目录下所有的子目录和文件保存到一个File类型的数组files中,然后遍历files,如果是目录就重新调用deleteDir()方法进行递归,如果是文件就直接调用File的delete()方法删除。当删除完一个目录下的所有文件后,再删除当前这个目录,这样便从里层到外层递归的删除了整个目录。
需要注意的是,Java中删除目录是从虚拟机直接删除而不进入回收站。
运行可执行文件:
1.当要执行一个本地机上的可执行文件时,可以使用java.lang包中的Runtime类。
首先使用Runtime类声明一个对象。如:Runtime ec;
2.然后使用该类的getRuntime()静态方法创建这个对象:
ec=Runtime.getRuntime();
3.ec可以调用exec(String command)方法打开本地计算机的可执行文件或执行一个操作
//例如打开IE上搜狐:file=new File(“C:\\Program Files\\Internet Explorer”,
“IEXPLORE www.sohu.com”);
字节流与字符流
字节流
1.在JDK中,提供了两个抽象类InputStream和OutputStream,它们是字节流的
顶级父类,所有的字节输入流继承自InputStream,所有的字节输出流都继承自
OutputStream。
1.InputStream和OutputStream两个类虽然提供了一系列和读写数据相关的方法,但这两个
类是抽象类,不能被实例化。
2.针对文件的读写,JDK专门提供了两个类,分别是FileInputStream和FileOutputStream
,其中FileInputStream是InputStream的子类,它是操作文件的字节输入流,专门用于
读取文件中的数据。
字节流读写文件
1.与FileInputStream对应的是FileOutputStream
2.FileOutputStream是OutputStream的子类,它是操作文件的字节输出流,专门用于把
数据写入文件
3.long skip(long numBytes):输入流调用该方法跳过numBytes个字节,并返回实际
跳过的字节数目。
4.OutStream流以字节为单位顺序地写文件,只要不关闭流,每次调用write方法就顺序
地向目的地写入内容,直到流被关闭。
字节流缓冲区
为了提高拷贝文件的效率,可以定义一个字节数组作为缓冲区。在拷贝文件时,可以一次性读取多个字节的数据,并保存在字节数组中,然后将字节数组中的数据一次性写入文件。
字节缓冲流
在IO包中提供两个带缓冲的字节流,分别是BufferedInputStream和BufferdOutputStream,这两个流都使用了装饰设计模式。它们的构造方法中分别接收InputStream和OutputStream类型的参数作为被包装对象,在读写数据时提供缓冲功能。
字符流
字符流
1.同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader和Writer,只提供了
一系列用于字符流处理的接口。它们的方法与类InputStream和OutputStream类似,只不
过其中的参数换成字符或字符数组。
2.Reader是字符输入流,用于从某个源设备读取字符。
3.Writer是字符输出流,用于向某个目标设备写入字符。
4.字符流读取字符, 就要先读取到字节数据, 然后转为字符。 如果要写出字符, 需要把
字符转为字节再写出。
5.转换流是一种包装流,其中OutputStreamWriter是Writer的子类,可以将一个字节流
输出流包装成字符输出流,方便直接写入字符,而InputStreamReader是Reader的子类,
它可以将一个字节输入流包装成字符输入流,方便直接读取字符。