java的IO主要包括两种IO操作:输入流和输出流。每种输入,输出流又可以分为字节流和字符流两大类。其中字节流以字节为单位来处理输入、输出操作,而字符流则以字符来处理输入、输出操作。
1.1 File 类:File类是java.io包下代表与平台无关的文件和目录,也就是说如果希望在程序中操作文件和目录都可以通过File类来完成,值得指出的是不管文件,还是目录都是使用File来操作的,File能新建,删除和重命名文件和目录,File不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入输出流。
1.1.1 对文件的而操作:
1.访问文件名的相关方法:String getName():返回此File对象的所表示的文件名或路径名(如果是路径名的话,返回最后一级子路径名) Sting getPath():返回此File对象所对应的路径名。 StringgetAbsolutePath():返回此File对象所对应的绝对路径名。 String getParent():返回此File对象对应目录(最后一级子目录)的父目录名。 boolean renameTo(File newName):重命名此File对象多对应的文件或目录,重命名成功返回true,否则返回false。
2.文件检测相关的方法:boolean exists():判断File对象对应的文件或者目录是否存在。 boolean canRead():判断File对象所对应的文件和目录是否可读。boolean canWrite():判断File对象多对应的文件和目录是否可写。boolean isFile():判断File对象所对应的是否是文件。boolean isAbsolute():判断File对象所对应的文件或目录是否是绝对路径。
3.获取常规文件信息:long lastModified():返回文件的最后修改时间。long length():返回文件内容的长度。
4.文件操作相关方法:boolean createNewFile():当此File对象多对应的文件不存在时,该方法将新建一个File对象所指定的新文件,创建成功返回true,否则返回false。 boolean delete():删除File对象所对应的文件或路径。void deleteOnExit():注册一个删除标记,指定当java虚拟机退出时,删除File对象所对应的文件和目录。
5.目录操作的相关方法:boolean mkdir():试图创建一个File对象所对应的目录,如果成功返回true,否则返回false。调用该方法时File对象必须对应yield路径,而不是文件。
1.2 输入输出:两种基本的流是:输入流(Input Stream)和输出流(Output Stream)。可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称为输出流。流的分类:节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。
1.2.1 java IO 对象:
1.输入字节流InputStream:InputStream 是所有的输入字节流的父类,它是一个抽象类。ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据。ObjectInputStream 和所有FilterInputStream 的子类都是装饰流。
2.输出字节流OutputStream:OutputStream 是所有的输出字节流的父类,它是一个抽象类。ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据。ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。
3.字符输入流Reader:Reader 是所有的输入字符流的父类,它是一个抽象类。CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。
4.字符输出流Writer:Writer 是所有的输出字符流的父类,它是一个抽象类。CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。PipedWriter 是向与其它线程共用的管道中写入数据。BufferedWriter 是一个装饰器为Writer 提供缓冲功能。PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类。功能和使用和OutputStream 极其类似。
1.3字符流与字节流的转换:
转换流的特点:
- 其是字符流和字节流之间的桥梁
- 可对读取到的字节数据经过指定编码转换成字符
- 可对读取到的字符数据经过指定编码转换成字节
何时使用转换流?
- 当字节和字符之间有转换动作时;
- 流操作的数据需要编码或解码时。
具体的对象体现:
- InputStreamReader:字节到字符的桥梁
- OutputStreamWriter:字符到字节的桥梁
这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。
1.4RandomAccessFile类:
该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区(字符数组),通过内部的指针来操作字符数组中的数据。 该对象特点:
- 该对象只能操作文件,所以构造函数接收两种类型的参数:a.字符串文件路径;b.File对象。
- 该对象既可以对文件进行读操作,也能进行写操作,在进行对象实例化时可指定操作模式(r,rw)
注意:该对象在实例化时,如果要操作的文件不存在,会自动创建;如果文件存在,写数据未指定位置,会从头开始写,即覆盖焉有的内容,可以用于多线程下载或多个线程同时写数据到文件。
------- android培训、java培训、期待与您交流! ----------