您的位置:首页 > 职场人生

黑马程序员—IO流

2015-07-04 22:40 344 查看
 ------- android培训、java培训、期待与您交流! ----------

IO流用来处理设备之间的数据传输,java对数据的传输是通过流的方式

流按操作数据分为两种:字节流和字符流

流按流向分为:输入流和输出流

字节流的抽象基类:InputStream读 OutputStream写

字符流的抽象基类:Reader读 Writer写

字节流和字符流的主要区别是什么呢?

一.字节流在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。

二.在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成。

下面为这些基类的继承关系:







IO操作的基本步骤:

1、使用File找到一个文件

2、使用字节流或字符流的子类为OutputStream、InputStream、Writer、Reader进行实例化操作

3、进行读写的操作

4、关闭:close(),在流的操作中最终必需进行关闭。

一、 字符流

创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件

FileWriter fw=new FileWriter("buf.txt");

fw.write("abcde");调用write方法,将字符串写入到流中

fw.close();关闭资源,但是关闭资源之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中

close和flush的区别:flush刷新后,流可以继续使用;close刷新后,会将流关闭。

创建一个文件读取流对象,和指定名称的文件相关联。要保证该文件是已经存在的,如果不存在,会发生异常

FileNotFoundException

第一种方式:一个个读取

FileReader fr=new FileReader("buf.txt");

int ch=0;

while((ch=fr.read())!=-1)调用读取流对象的read方法,read():一次读一个字符,而且会自动往下读

{

System.out.println((char)ch);

}

fr.close();

第二种方式:通过字符数组进行读取

FileReader fr=new FileReader("buf.txt");

char[] buf=new char[1024];定义一个字符数组用于存储读到字符

int num=0;

while((num=fr.read(buf))!=-1)

{

System.out.println(new String(buf,0,num));

}

fr.close();

二、字符流的缓冲区:为了提高数据的读写效率 。记住:在创建缓冲区之前必须要有流对象

对应类:BufferedWriter :将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

例如:

import java.io.*;

public static void main(String[] args) throws IOException{抛出IO异常
FileWriter fw=new FileWriter("buf.txt");创建一个字符写入流对象
为了提高字符写入流效率。加入了缓冲技术。只要将需要被提高效率的流对象传递给缓冲区的构造函数即可
BufferedWriter bufw=new BufferedWriter(fw);
for(int x=1;x<5;x++)
{
bufw.write("abcd"+x);
bufw.newLine();该缓冲区提供了一个跨平台的换行符newLine()
bufw.flush();只要用到缓冲区,就要刷新
}
bufw.close();关闭缓冲区就是关闭缓冲区中流对象,所以不用写fw.close()
}

FileReader fr=new FileReader("buf.txt");创建一个读取流对象和文本相关联
BufferedReader bufr=new BufferedReader(fr);
String line=null;
while((line=bufr.readLine())!=null)
{
System.out.printn(line);
}
bufr.close();

readLine方法返回的时候只返回回车符之前的数据内容,并不返回回车符。

readline方法原理:无论是读一行,或者读取多个字符。其实最终都是在在硬盘上一个一个读取。所以最终使用的还是read方法一次第一个的方法。

三、字节流

用FileOutputStream写文件

import java.io.*;引入相关的包

outputStream fos=new FileOutputStream("Text.txt");构造一个文件输出流对象

注意:用FileOutputStream创建对象时,如果文件不存在,则会创建一个新文件,如果文件已存在,使用重写方式则会覆盖原有数据

String str="好好学习java";利用文件输出流的方法写文本文件

byte[] words=str.getBytes();

fos.write(words,0,words.length);

fos.close();关闭文件输出流

用FileInputStream读文件

import java.io.*;引入相关的包

FileInputStream fis=new FileInputStream("Text.txt");构造一个文件输入流对象

利用文件输入流的方法读取文本文件

fis.available();可读取的字节数

fis.read();读取文件的数据

fis.close();关闭文件输入流对象

例如:

public static void main(String[] args) throws IOException{

readFile1();
}
public static void readFile1() throws IOException
{
FileInputStream fis=new FileInputStream("fos.txt");
byte[] buf=new byte[fis.available()];可读取的字节数,不用再循环了
fis.read(buf);
System.out.println(new String(buf));
fis.close();
}

public static void readFile2() throws IOException
{
FileInputStream fis=new FileInputStream("fos.txt");
byte[] buf=new byte[1024];

int len=0;

while((len=fis.read(buf))!=-1)

{

System.out.println(new String(buf,0,len));

}

fis.close();

}
public static void writeFile()throws IOException
{
FileOutputStream fos=new FileOutputStream("fos.txt");
fos.write("abcde".getBytes());
fos.close();
}

四、字节流的缓冲区:增加了内存缓冲区,允许java程序一次不只操作一个字节,从而提高了程序的性能

注意:必须将缓冲流和某个输入流或输出流连接

BufferedInputStream:可以成批地读取字符而不会每次都引起直接对数据源的读操作。数据输入时,首先被放入缓冲区,随后的读操作就是对缓冲区中的内容进行访问。

BufferedOutputStream:只有在缓冲区已满或清空(flush)缓冲区时,数据才会输出到数据目的地。

例如:

public static void main(String[] args) throws IOException{

copy();
}
public static void copy() throws IOException通过字节流的缓冲区完成复制
{
BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("c:\\1.mp3"));
BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("c:\\2.mp3"));
int by=0;
while((by=bufis.read())!=-1)
{
bufos.write(by);
}
bufos.close();
bufis.close();
}
public static void writeFile()throws IOException
{
FileOutputStream fos=new FileOutputStream("fos.txt");
fos.write("abcde".getBytes());
fos.close();
}

五、总结

流操作的基本规律: 最痛苦的就是流对象有很多,不知道该用哪一个。
通过三个明确来完成。
1、明确源和目的。 源:输入流。 InputStream Reader
目的:输出流。 OutputStream Writer。
2、操作的数据是否纯文本。
是:字符流。 不是:字书流。
3、当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: