【黑马程序员】第三篇_关于I/O的总结

来源:互联网 发布:证大财富淘宝贷假不假 编辑:程序博客网 时间:2024/04/30 13:43

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

Java I/O主要包括如下几个层次:

1. File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。

2. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。

3. OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。


File类:

a.一个File类的对象,表示了磁盘上的文件或目录
b.File类提供了与平台无关的方法来对磁盘上的文件或目录进行操作
c.File类直接处理文件和文件系统。
d.File类没有指定信息怎样从文件读取或向文件存储

e.File类的直接父类是Object类。


下面的构造方法可以用来生成File 对象:
–File(String directoryPath)File(String directoryPath, String filename)File(File dirObj, String filename)
这里,directoryPath是文件的路径名,filename 是文件名,dirObj 是一个指定目录的File 对象


举例说明:
File myFile = new File(" myfile. txt");
File myDir = new File(" MyDocs");
File myFile = new File( myDir, "myfile. txt");
这些构造方法取决于访问文件的方式。例如,若在应用程序里只用一个文件,第一种创建文件的结构是最容易的。但若在同一目录里打开数个文件,则后种方法更好一些。


File类中的常用方法
String getName()
String getPath()
String getAbsolutePath()
String getParent()
boolean renameTo( File newName)
long length()
boolean delete()
boolean mkdir()
String[] list()

boolean exists()
boolean canWrite()
boolean canRead()
boolean isFile()
boolean isDirectory()


例子如下:

package com.knowyou.io;import java.io.File;import java.util.ArrayList;/** * 以树的形式获取磁盘某个目录 *  * @author byr216 *  */public class GetFileTree {public static void main(String[] arges) {File file = new File("E:/联通/联通集采");getTree(file);}private static int time;// 用于获取需要几个空格,下级目录相对于上级目录多个空格/** * 利用递归获取目录树 * @param file */public static void getTree(File file) {//如果目录下无文件或没有此file是文件不是目录则返回,递归出口if (file.isFile() || file.listFiles().length == 0) {return;} else {File[] files = file.listFiles();files = getFiles(files);for (File f : files) {// System.out.println(f.getName());if (f.isFile()) {System.out.println(getTime(time) + f.getName());}if (f.isDirectory()) {System.out.println(getTime(time) + f.getName() + "\\");time++;//每次进入一个目录,则加一个空格getTree(f);time--;//目录出来后,空格减一}}}}    /** * 重新排列目录里的文件,文件夹在文件的前面 * @param files * @return */private static File[] getFiles(File[] files) {ArrayList<File> arr = new ArrayList<File>();for (File f : files) {if (f.isDirectory()) {arr.add(f);}}for (File f : files) {if (f.isFile()) {arr.add(f);}}return arr.toArray(new File[arr.size()]);}/** * 获取某级目录前的空格数 * @param time * @return */private static String getTime(int time) {String s = "";for (int i = 0; i < time; i++) {s += '\t';}return s.toString();}}

字节流:

字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStreamInputStream

 

字节输出流:OutputStream

OutputStream是整个IO包中字节输出流的最大父类,此类的定义如下:

public abstract class OutputStream extends Object implements Closeable,Flushable

从以上的定义可以发现,此类是一个抽象类,如果想要使用此类的话,则首先必须通过子类实例化对象,那么如果现在要操作的是一个文件,则可以使用:FileOutputStream类。通过向上转型之后,可以为OutputStream实例化

Closeable表示可以关闭的操作,因为程序运行到最后肯定要关闭

下面是一个字节流输入的的例子:

<span style="color:#330033;">public static void main(String[] args) throws IOException {FileInputStream fs = new FileInputStream("c:/file.txt");byte[] bts = new byte[200];int lenth = 0;while (-1!=(lenth = fs.read(bts,0,200))) {String s = new String(bts,0,lenth);System.out.println(s);}fs.close();}</span>

I/O中包括一些过滤流,通过装饰模式在进行包装节点流以增加一些功能,如下,FilterInputStream类下的全都是过滤流。


ByteArrayInputStream:


ByteArrayInputStream是把字节数组当成源的输入流。该类有两个构造方法,每个构造方法需要一个字节数组提供数据源
–ByteArrayInputStream(byte array[ ])
–ByteArrayInputStream(byte array[ ], intstart, intnumBytes)
–这里,array是输入源。第二个构造方法创建了一个InputStream类,该类从字节数组的子集生成,以start指定索引的字符为起点,长度由numBytes决定


如下:

public class BufferedOutputStreamTest {public static void main(String[] arges) throws IOException {FileOutputStream fos = new FileOutputStream("tt.txt");BufferedOutputStream bos = new BufferedOutputStream(fos);//过滤流byte[] bts = "Hello word".getBytes();ByteArrayInputStream bis = new ByteArrayInputStream(bts);int lenth = 0;byte[] bt = new byte[2];lenth = bis.read(bt, 0, 2);bos.write(bt, 0, lenth);bos.flush();fos.close();bis.close();}}


字符流:

在程序中一个字符等于两个字节,那么java提供了ReaderWriter两个专门操作字符流的类。


字符输出流:Writer

Writer本身是一个字符流的输出类,此类的定义如下:

public abstract class Writer extends Object implements AppendableCloseableFlushable

此类本身也是一个抽象类,如果要使用此类,则肯定要使用其子类,此时如果是向文件中写入内容,所以应该使用FileWriter的子类。

FileWriter类的构造方法定义如下:

public FileWriter(File file)throws IOException

字符流的操作比字节流操作好在一点,就是可以直接输出字符串了,不用再像之前那样进行转换操作了


import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;public class Test16 {public static void main(String[] args) throws IOException {File f = new File("d:" + File.separator + "test.txt");Writer out = new FileWriter(f);String str = "Hello World";out.write(str);out.close();}}

字节流与字符流的区别

字节流和字符流使用是非常相似的,那么除了操作代码的不同之外,还有哪些不同呢?

1、字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的

2、字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容


那开发中究竟用字节流好还是用字符流好呢?

在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。











0 0
原创粉丝点击