黑马程序员——IO

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


  本文是关于java中IO的学习,Java 的IO是实现程序数据输入和输出的基础。在程序中所有的数据都是以流的方法进行传输和保存的。Java把所有传统的流类型(类或抽象类)都放在java.io包中,用以实现输入输出功能。

  输入和输出是一个相对的概念,我们一般站在程序的角度来分析和处理问题的。

程序需要数据 : 读进来    --> 输入

程序保存数据 : 写出去    --> 输出

  按不同角度分类,流可以分为多种:

  按流动方向的不同可以分为输入流和输出流;

  按处理数据的单位不同分为字节流和字符流;

  按功能的不同可分为节点流和处理流;

那什么是字节流和字符流呢?顾名思义,字节流传输的是字节,字符流传输的是字符。InputStream和OutputStream就是字节流,Reader和Writer就是字符流。

  其中InputStream下面有几个重要一点子类:ByteArrayInputStream、FileInputStream、ObjectInputstream;

  OutputStream下面几个重要子类:ByteArrayOutputStream、FileOutputStream、ObjectOutputstream;

  Reader下面几个重要子类:InputStreamReader、BufferedReader、CharArrayReader

  Writer下面的几个重要子类:OutputStreamReader、Bufferedwriter、CharArrayWriter

  那么我们时候使用字节流什么时候使用字符流呢?当我们要读取的是图片、视频等时我们就要用字节流;但我们读取字符类的文件时就应该用字符流。当我们读取字符类文件时使用字节流的时候,有可能会造成乱码,因为有可能刚好一个是两个字节的字符只被读到了一个字节,这种情况就会出现乱码。同样当我们读取图片这些时,因为图片不是一个个字符组成的,所以也可能会出现错误。

  InputStream的主要方法:

  int available() throws IOException:文件大小

  abstract void close() throws IOException:关闭流

  int read() throws IOException:从输入流中读取单个字节,返回该字节。

  int read(byte[] b) throws IOException:从输入流中读取

  OutputStream的重要方法:

  void flush() throws IOException:清空缓冲区

  abstract void close() throws IOException:关闭输出流

  void write(int c) throws IOException:将一个字节写到输出流中。

  void write(byte[] b) throws IOException:将一个byte数组写出。

  void write(byte[] b,int off,int len) throws IOException:将字节数组从off位置开始,长度为len的字节写入到输出流中。

  需要注意的点:

  1.最后一定要记得把流给close掉,不然就会读取不到内容或写不到内容,另外一方面,不关掉流,会造成性能损耗。

  2.对于流的关闭,应是先开后关,后开先关。

  3.注意使用IO时记得IO异常的抛出和捕获。

  IO使用例子:

  将a.txt里的内容复制到b.txt文件中,代码如下:

package io;
 
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
import org.omg.CORBA.Environment;
 
public class CopyFile {
public static void main(String[] args) throws IOException {
//获得文件输入流
FileInputStream fis=new FileInputStream(new File("a.txt"));
//获得文件输出流
FileOutputStream fos=new FileOutputStream(new File("b.txt"));
byte[] buf=new byte[1024];
int len=0;
while((len=fis.read(buf))!=-1)
{
fos.write(buf, 0, len);
fos.flush();
}
//关闭文件输出流
fos.close();
//关闭文件输入流
fis.close();
}
}  

节点流:直接操作目标设备,例如:磁盘或一块内存区域。

  处理流:通过操作节点流,从而间接完成输入或输出功能的流。处理流是的存在是建立在一个已经存在的输入流或输出流的基础之上的。处理流中,比较重要的就是缓冲流:BufferedReader、

Bufferedwriter、BufferedInputStream、BufferedOutputStream。缓冲流能更高效地传输数据,故一般程序与文件交互数据时都用到缓冲流。

  缓冲流的例子:

  将a.txt里的内容复制到b.txt文件中,代码如下:


package io;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class BufferedIO {
public static void main(String[] args) throws IOException {
//获得缓冲输入流
BufferedReader br=new BufferedReader(
//字节流转为字符流
new InputStreamReader(new FileInputStream(new File("a.txt"))));
//获取缓冲输出流
BufferedWriter bw=new BufferedWriter(
//字节流转为字符流
new OutputStreamWriter(new FileOutputStream(new File("b.txt"))));
String line=null;
while((line=br.readLine())!=null)
{
bw.write(line);
}
bw.close();
br.close();
}
}


 

  

 

 

  

 

你可能感兴趣的:(黑马程序员——IO)