初学Java之干货理论篇_输入,输出流


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的子类,
它可以将一个字节输入流包装成字符输入流,方便直接读取字符。

在这里插入图片描述

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章