---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、IO流的作用
IO流用来处理设备之间的数据传输,比如查看图片、播放歌曲、拷贝文件等操作。
三、字符流的使用
字符读取流的常用方法:
int read():读取单个字符。
int read(char[] cbuf):将字符读入数组。
abstract void close():关闭该流并释放与之关联的所有资源。
通过下面的代码演示字符读取流的操作:
package demo4;
import java.io.*;
/*
演示读取指定的文件
*/
class FileReaderDemo
{
public static void main(String[] args) throws IOException
{
//创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件是已经存在的,如果不存在,会发生异常:FileNotFoundException
FileReader fr=new FileReader("demo1.txt");
//调用读取流对象的read方法
//read():一次读一个字符,而且会自动往下读
//返回读取到的字符的ASCII码值
//int ch=fr.read();
int ch=0;
while((ch=fr.read())!=-1)
{
System.out.print((char)ch);
}
//关闭该流并释放与之关联的所有资源。
fr.close();
}
}
字符输出流的常用方法:
void write(char[] cbuf):写入字符数组。
abstract void write(char[] cbuf,int off,int len):写入字符数组的某一部分。
void write(int c):写入单个字符。
abstract void flush():刷新该流的缓冲。如果不刷新的话,保存在字符数组中的数据会被覆盖。
abstract void close():关闭此流,但要先刷新它。
下面通过一个示例演示字符输出流的操作:
package demo1;
import java.io.*;
/*
需求:在硬盘上,创建一个文件并写入一些文字数据。
找到一个专门用于操作文件的Writer子类对象:FileWriter。
后缀名是父类名,前缀名是该流对象的功能。
*/
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象。该对象一经初始化就必须要明确被操作的文件。
//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
//其实该步就是在明确数据要存放的目的地。
FileWriter fw=new FileWriter("demo1.txt");
//调用writer方法,将字符串写入到流中。
fw.write("abcdefg");
fw.write("hijklmn");
//刷新流对象缓冲中的数据。
//将数据刷到目的地中。
//fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部缓冲中的数据。
//将数据刷到目的地中。
//和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
fw.close();
}
}
四、字符流的缓冲区
缓冲区的出现提高了对数据的读写效率。将数据读取或写入到缓冲区中,然后一次性写入或者读取出来。
对应类:
•BufferedWriter:字符写入流缓冲区。
该缓冲区提供了一个一次读一行的方法:readLine(),方便于对文本数据的读取。当返回null时,表示读到文件末尾。
package demo1;
import java.io.*;
/*
字节流:InputStream OutputStream
需求:想要操作图片数据,这时就要用到字节流。
*/
class FileStreamDemo
{
public static void fileWriter()throws IOException
{
//创建字节写入流对象,并指定文件的名称和路径
FileOutputStream fos=new FileOutputStream("demo1.txt");
//向指定文件中写入数据
//由于只能写入字节类型,所以要转换一下
fos.write("abcedfg".getBytes());
//关闭字节写入流
fos.close();
}
public static void fileReader_1()throws IOException
{
//创建字节读取流对象,并和指定名称的文件相关联
FileInputStream fis=new FileInputStream("demo1.txt");
//从指定文件中读取数据
int num=0;
//一次读取一个字节
while((num=fis.read())!=-1)
{
System.out.println((char)num);
}
//关闭流并释放与之关联的所有资源
fis.close();
}
public static void fileReader_2()throws IOException
{
FileInputStream fis=new FileInputStream("demo1.txt");
int num=0;
//把读取到的数据临时存放到缓冲区中(byte[])
byte[] b=new byte[1024];
while((num=fis.read(b))!=-1)
{
System.out.println(new String(b,0,num));
}
fis.close();
}
public static void fileReader_3()throws IOException
{
FileInputStream fis=new FileInputStream("demo1.txt");
//返回下一次对此输入流调用的方法可以不受阻塞地
//从此输入流读取(或跳过)的估计剩余字节数。
//通俗来讲,就是得到文件中的字节数。
//int len=fis.available();
//System.out.println(len);
//定义一个长度与文件字节数刚刚好的字节数组
//切记:文件字节数不可过大,否则内存溢出异常!
//java虚拟机默认占用内存空间64MB!
byte[] b=new byte[fis.available()];
//既然长度刚刚好,那就不用循环了,一次性读完
fis.read(b);
System.out.println(new String(b));
fis.close();
}
public static void main(String[] args) throws IOException
{
//fileWriter();
//fileReader_1();
//fileReader_2();
fileReader_3();
}
}
public static void copy()
{
BufferedInputStream bufis=null;
BufferedOutputStream bufos=null;
try
{
//创建字节读取流缓冲区对象,
//并把字节读取流对象当做参数传递给字节读取流缓冲区对象的构造函数
bufis=new BufferedInputStream(new FileInputStream("Before - Moderndog.mp3"));
//创建字节写入流缓冲区对象,
//并把字节写入流对象当做参数传递给字节写入流缓冲区对象的构造函数
bufos=new BufferedOutputStream(new FileOutputStream("Before - Moderndog_copy.mp3"));
int by=0;
//循环 读取单个字节
while((by=bufis.read())!=-1)
{
//循环 将指定的字节写入此缓冲的输出流。
bufos.write(by);
}
}
catch (IOException e)
{
throw new RuntimeException("赋值MP3失败!");
}
finally
{
try
{
if(bufis!=null)
bufis.close();
}
catch (IOException e)
{
throw new RuntimeException("字节读取流关闭失败!");
}
try
{
if(bufos!=null)
bufos.close();
}
catch (IOException e)
{
throw new RuntimeException("字节写入流关闭失败!");
}
}
}
八、标准输入输出流
System.in:对应的是标准输入设备:键盘。
详细请查看:<a href="http://edu.youkuaiyun.com" target="blank">http://edu.youkuaiyun.com</a>