java从零开始系列(四)IO基础

luoyjx · 2014-10-05 19:40 · 922次阅读

Java中的IO也是在javase实际应用中使用比较多的部分,Java中的IO大方向有两个。

  • 根据处理数据类型不同分为:字节流和字符流。
  • 根据数据流向不同分为:输入流和输出流。

目录

 什么是文件?
 File 类和过滤
 Java 流输入 / 输出原理
 Java 流的分类

什么是文件?> 文件可认为是相关记录或放在一起的数据的集合

文件一般存储在哪里?

JAVA程序一般通过什么去访问文件属性?   

     JAVA API :java.io.File 类

File 类

File类是“文件和目录路径名的抽象表示”。 而不是指文件的内容。

File类定义了一些与平台无关的方法操作,如:创建、删除文件和重命名等。

Java中目录被看成是一个特殊的文件。List()方法可以返回目录中所有的子目录和文件。

在unix下路径分隔符为(/),而在windos中则是为(),在java中可以正确的处理不同系统中的分隔符。 

File类中的主要方法

File的使用

  1. 创建文件对象
  2. 判断文件后缀
  3. 创建文件、文件夹
  4. 删除文件
  5. 给定一个路径,如果此文件存在,删除此文件;如果文件不存在,则创建一个新的文件。 
  6. 列出指定目录的全部文件 
  7. 判断一个给定的路径是否是目录  

小测试:下面程序结果是什么?

File f = new File("mytest.txt");
System.out.println("文件或目录是否存在?“ + f.exists());
System.out.println("是文件么?" + f.isFile());
System.out.println("是目录么?" + f.isDirectory());
System.out.println("名称:"+f.getName());
System.out.println("路径:"+f.getPath());
System.out.println("绝对路径:"+f.getAbsolutePath());
System.out.println("最后修改时间:"+f.lastModified());
System.out.println("文件大小:"+f.length()+"字节");

FilenameFilter

FilenameFilter:实现此接口的类实例可用于过滤器文件名。
class MyFilenameFilter implements FilenameFilter { private String strFilter = null; MyFilenameFilter(String strFilter) { this.strFilter = strFilter; } public boolean accept(File arg0, String arg1) { return arg1.endsWith("." + strFilter); } }

Java 流输入 / 输出原理 流是从起源到接收的有序数据。

在Java程序中,对于数据的输入 / 输出操作以流的方式进行;
JDK提供了各种各样的流类,用以获取不同种类的数据;
Stream:one dimension one direction

输入 / 输出流的分类 java.io包中定义了多种流类型来实现输入/输出功能;可以从不同的角度进行分类:

  • 按数据流的方向不同:可以分为输入流和输出流
  • 按处理数据单位不同:可以分为字节流和字符流

按功能不同:可以分为节点流和处理流

JDK所提供的各种流,都是继承以下四种抽象类:

输入 / 输出流的模型

输入 / 输出流的体系

节点流和处理流

节点流可以从一个特定的数据源(节点:文件、内存)读写数据;
处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更加强大的读写能力。

InputStream

InputStream的链接

InputStream的方法
三个方法访问它的数据:

  • int read():简单读方法,返回一个int值,它是从流里读出的一个字节。如果遇到文件结束则返回-1。
  • int read(byte[] buffer):将数据读入到字节数组中,并返回所读的字节数。
  • int read(byte[] buffer, int offset,int length) 将数据读入到字节数组中,并返回所读的字节数。offset是数组的偏移量,length是读取的长度。 

InputStream其它方法:

  • void close()
  • int available()
  • skip(long n)
  • boolean markSupported()
  • void mark(int readlimit)
  • void reset() 

java API文档中表述  mark(int readlimit)标记InputStream的当前位置,并保证mark以后最多可以读取readlimit个字节,这个mark仍然有效。
但是,值得注意的是:mark标记是否有效,不但和readlimit参数有关,还和缓冲区大小有关,最根本的还是缓冲区大小有关!

OutputStream
继承OutputStream的流都是向程序中输出数据,且数据的单位为字节(8 bit);
下图中红框着色为节点流,黑框着色为处理流:

OutputStream的链接

OutputStram方法

三个基本的write()方法

  • int write(int c)
  • int write(byte[] buffer)
  • int write(byte[] buffer, int offset,int length)

其他方法

  • void close()
  • void flush()

Reader

继承Reader的流都是向程序中输入数据,且数据的单位为字符(16 bit);
下图中红框着色为节点流,黑框着色为处理流:

Reader方法
三个基本的read()方法

  • int read()
  • int read(char[] cbuffer)
  • int read(char[] cbuffer, int offset ,int length )

其它方法

  • void close()
  • int available()
  • skip(long n)
  • boolean markSupported()
  • void mark(int readlimit)
  • void reset()

Writer

继承Writer的流都是向程序中输出数据,且数据的单位为字符(16 bit);
下图中红框着色为节点流,黑框着色为处理流:

基本write方法:

  • void write(int c)
  • void write(char[] cbuf)
  • void write(char[] cbuf, int offset, int length)
  • void write(String string)
  • void write(String string, int offset,int length)

其它方法:

  • void close()
  • void flush()
收藏

暂无评论

登录后可以进行评论。没有账号?马上注册