Java I/O概述
- 通过不同输入输出设备间的数据传输抽象为流。
- 运行在内存中的应用程序,如果想从一些地方来获得数据例如文件,则可以使用上述来源创建输入流,并从其中读取数据。
- 同理,内存中的应用程序可以通过输出流把数据输出到指定的目的地,包括显示器,文件等。其中输出到显示器为标准输出。
- 流的内容是二进制序列的称为字节流或二进制流。
- 流的内容是字符的称为字符流
- 有关类在java.io和java.nio包中。
- I/O流类可以分为字节流和字符流,字节流可分为InputStream和OutputStream,字符流可以分为Reader和Writer。
- 上述四个类都是I/O的核心类都是抽象类。
- 无论是访问本地的输入输出设备还是其他计算机上的资源,都需要使用Java I/O类。
字节流
- 所有的字节输入流都继承InputStream抽象类
- 所有的字节输出流都继承outputStream抽象类
InputStream的read()方法
public abstract int read() throws IOException
- 该方法从来源输入流中读取数据的下一个字节到Java程序中
- 该方法返回值是从0到255的int类型的值
- 如没有可用的字节,则已经达到输入流的末尾,则返回-1
- 该方法调用时只读取一个字节,因此往往放在while之后的条件判断中,例如:
while((len=inputstream.read())!=-1)
- 批量读取字节的read方法:
public int read(byte[ ] b) throws IOException
- 该方法从来源输入流中读取一定数量的字节数,并存到数组b中,返回值为实际读取的一定数量的字节数。Java会尽可能读取的字节数时b的长度,但有时也可能会少于。
- 如没有可用的字节,则已经达到输入流的末尾,则返回-1
public int read(byte[ ] b,int off,int len) throws IOException
- off是存储到数组b中时元素下标的偏移量,len是要读取的字节数
outputStream的write()方法
public void write(int b);
//输出流中写入一个字节bvoid write(byte b[ ]);
//输出流中写入一个字节数组bvoid write(byte b[ ],int off,int len);
//把数组b中下标off开始,长度为len的字节写入到输出流public void flush()
//刷空输出流并输出所有被缓存的字节public void close();
//关闭输出流,如果不关可能会产生异常,为确保此方法会被调用一般放在finally语句块中调用。
字符流
- ASCll以一个字节表示一个字符,Unicode编码用两个字节表示一个字符
Reader类
Reader类提供了多个从字符输入流的方法:
-
public int read();
//该方法读取一个字符,范围在0和65535之间的int值。如果达到输入流的末尾,则返回-1. -
public int read(char[ ] cbuf);
//该方法与InputStream的read()方法类似,只不过是char数组。 -
public int read(char [ ]cbuf,int off,int len);
//读取len个存到数组从off开始的位置中。 - Reader作为抽象类,有多个非抽象的子类,其中最常用的包括FileReader、BufferedReader等
- FileReader类从InputStreamReader类继承而来,该类按字符读取流中数据
- FileReader类并未包含从文件中读取一行的方法,BufferedReader类却可以。
public String readLine() throws IOException
该方法读取一个文本行。通过下列字符之一即可认为某行已经终止:换行(’\n)、回车(’\r’)或回车后直接跟换行。方法返回包含该行内容的字符串,不包含任何终止符,若到流末尾则返回null. - 若想按行读取纯文本,把FileReader、BufferedReader两个类结合使用
- 因此BufferedReader提供了下列构造方法
public BufferedReader(Reader in)
- 该构造方法创建一个默认大小输入缓冲区的缓冲字符输入流,因此可以通过如下代码来结合使用上述两个类:
BuffferedReader br=new BufferedReader(new FileReader("d.txt")) ;
- 上述多个类结合的方式在Java输入输出中很常见,这种方式是设计模式中的装饰模式
- 上述代码中,对创建得到的FileReader对象使用BufferedReader对象进行了装饰和增强,从而可以对已有的FileReader对象来调用readLine这个FileReader类没有定义的方法。
- 装饰设计模式的特点是,装饰类与被装饰类都必须属同一个接口或父类。
Writer类
public void write(String str);
void write(byte b[ ]);
void write(String str,int off,int len);
public void flush();
public void close();
文件处理
File类是java.io包中唯一代表磁盘文件的对象,File类定义了一些与平台无关的方法,通过调用File类的各种方法能够实现创建、删除、重命名文件等操作。File类不仅可以代表文件也可以代表文件夹