黑马程序员——IO流的常用基本操作

来源:互联网 发布:php在线插件 编辑:程序博客网 时间:2024/05/22 05:18

—— android培训、java培训、期待与您交流! ——

            IO流常用基本操作

io流用来处理设备之间的数据传输
java对数据的操作时通过流的方式(硬盘文件件,内存数据)
java用于操作流的对象都在io包中
流按照操作数据分为两种:字节流和字符流(早期是字节流)
流按照流向分为:输入流。输出流
字符流的由来:字符流的这些对象里边融合了编码表
只有文字涉及到编码。

字节流的两个抽象基类:
InputStream OutputStream
字符流的抽象基类:
Reader,Writer
注:有这个四个类派生的子类名称都是以其父类名作为子类名的后缀
如:InputStream的子类FileInputStream
如:Reader的子类FileReader.//前缀名是该流对象功能

字符流的特点:
IO流用于操作数据。
数据最常见体现形式是:文件

            *Writer类演示*

演示操作文件
需求:硬盘上创建一个文件并写入一些数据
Writer/OutputStreamWriter/FileWriter:用来写入字符文件的操作类
没有空参数的构造函数(被创建就有要被操作的数据文件)

import java.io.*;class  FileWriterDemo{    public static void main(String[] args) throws IOException    {        //创建一个FileWriter对象。该对象一被初始化,必须要明确被操作的文件        //而且该文件会被创建的指定目录下。如果该目录下已有同名文件,将被覆盖        //其实该步就是在明确数据要存放的目的地。        FileWriter fw=new FileWriter("demo.txt");        //调用Write方法,将字符串写入到流中        fw.write("abcde");        //刷新流对象中的缓冲中的数据        //将数据刷到目的地中。        fw.flush();        fw.write("你在说什么我真不知道啊");        fw.flush();        //关闭流资源、但是关闭之前会刷新一次内部的缓冲中的数据。        //将数据刷到目的地中。        //和flash的区别:falsh刷新后流可以继续使用,close刷新后可以将流关闭。        //调用claose,会调用flush先刷新一下。        fw.close();        //都涉及到了IO异常    }}

Io异常的处理方式。
思路:
FileWriter fw=new FileWriter(“demo.txt”);
fw.write(“abcde”);
fw.close()
这三部每一步都会发生异常
注意fw.close()一定要执行
所以放在finally中
并且它也会发生异常所以finally中在定义他的异常处理方式
注意fw初始化在外面,finally才能使用他
finally才能使用他时候要判断fw不为null
示例如下:

import java.io.*;class FileWriterDemo2 {    public static void main(String[] args)     {        FileWriter fw=null;        try        {            fw=new FileWriter("demo.txt");            //fw=newFileWriter("k:\\demo.txt");            //java.io.FileNotFoundException:            fw.write("abcde");          //这是IO异常的子类            //fw.close();关流动作一定要执行  放在finally当中        }        catch (IOException e)        {            System.out.println("catch:="+e.toString());        }        finally        {            try            {                if(fw!=null)                fw.close();            }            catch (IOException e)            {                System.out.println(e.toString());            }        }    }}

需求:对已有文件数据续写,在原有数据上继续加数据
代码如下:

import java.io.*;class FileWriterDemo3{    public static void main(String[] args) //throws IOException    {        FileWriter fw=null;        try        {            //传递一个true参数,代表不覆盖已有的文件            //并在已有的文件末尾处进行数据续写            fw=new FileWriter("demo.txt",true);            //fw.write("原来是这样的情况"); //在之前文字末尾处。没有换行             fw.write("\r\nhello,word\r\n换到下一行");            //"\r\n"在txt文件中会判断为换行        }        catch (IOException e)        {            System.out.println("catch:="+e.toString());        }        finally        {            try            {                if(fw!=null)                fw.close();            }            catch (IOException e)            {                System.out.println(e.toString());            }        }    }}
            *Reader类演示*

public class FileReader:用来读取字符文件的便捷类。
- - - - -extends InputStreamReader

读取单个字符示例:

import java.io.*;class  FileReadDemo{    public static void main(String[] args) //throws IOException    {        FileReader fr=null;        try        {               //创建一个文件读取流对象,和指定名称的文件相关联。            //要保证该文件已经存在,如果不曾在,会发生FileNontFoundException            fr=new FileReader("demo.txt");                //调用读取流对象的Read方法,读单个字符                //将字符读入数组或读入数组的某一部分,试图将字符读入字符缓冲区            //int ch1=fr.read();            //System.out.println("ch="+ch1);//注意:打印的是该字符的ascII值             //如果达到流的末尾为返回-1;            /*while(true)            {                int ch=fr.read();                if(ch==-1)                    break;                System.out.println("ch="+(char)ch);            }            */            int ch=0;            while((ch=fr.read())!=-1)            {                System.out.println("ch="+(char)ch);            }        }        catch (IOException e)        {            System.out.println("catch="+e.toString());//抛出异常        }        finally        {            if(fr!=null)            try            {                fr.close();            }            catch (IOException e)            {                System.out.println(e.toString());//抛出异常            }        }    }}

显示在控制台的结果:换行符打印,但没有显示字符


第二种方式:将字符读入数组

import java.io.*;class  FileReadDemo2{    public static void main(String[] args) //throws IOException    {        FileReader fr=null;        try        {               fr=new FileReader("demo.txt");            char[] buf=new char[3];            //int num=fr.read(buf);//read(char[])返回获取数组字符的长度            int num=0;            while((num=fr.read(buf))!=-1)            {                System.out.println(new String(buf,0,num));            }            System.out.println("num="+num+"..."+new String(buf));        }        catch (IOException e)        {            System.out.println("catch="+e.toString());//抛出异常        }        finally        {            if(fr!=null)            try            {                fr.close();            }            catch (IOException e)            {                System.out.println(e.toString());//抛出异常            }        }    }}

打印在控制台的结果:


将指定文件打印在控制台:

import java.io.*;class FileReadDemo3 {    public static void main(String[] args)     {        FileReader t=null;        try        {            t=new FileReader("DateDemo.java");            char[] in=new char[1024];            //数组in占用1024个字节的内存,最长可以保存长度是1023的字符串            int ch=0;            while((ch=t.read(in))!=-1)            {                System.out.println(new String(in,0,ch));            }        }        catch (IOException e)         {            System.out.println(e.toString());        }        finally        {            if(t!=null);            try            {                t.close();              }            catch (IOException e)            {                System.out.println(e.toString());            }        }    }}

需求:将D盘文件复制到c盘.

复制的原理
是将c盘下的文件数据存储到d盘的文件中
步骤:
1,在D盘创建一个文件
2,定义一个读取流和c盘文件关联
3.通过不断的读写完成数据存储
4.关闭资源
代码如下:

import java.io.*;class FileReadDemo4 {    public static void main(String[] args) throws IOException    {        copy_2();    }    public static void copy_2() throws IOException    {        FileWriter fw=null;        FileReader fr=null;        try        {               fw=new FileWriter("c:\\DateDemo_copy.txt");            fr=new FileReader("demo.txt");            char[] buf=new char[1024];//定义一个数组做缓冲区            //int num=fr.read(buf);//read(char[])返回获取数组字符的长度            int len=0;            while((len=fr.read(buf))!=-1)            {                fw.write(buf,0,len);//每读一次,往缓冲区数据存一次                //System.out.println(new String(buf,0,num));            }            //System.out.println("num="+num+"..."+new String(buf));        }        catch (IOException e)        {            throw new RuntimeException("读写数据失败");            //System.out.println("catch="+e.toString());//抛出异常        }        finally        {            //多重流要分开try            if(fr!=null)            try            {                fr.close();            }            catch (IOException e)            {                System.out.println(e.toString());//抛出异常            }            if(fw!=null)            try            {                fw.close();            }            catch (IOException e)            {                System.out.println(e.toString());//抛出异常            }        }    }    //从c盘读取一个字符,然后往D盘读写一个字符    public static void copy_1() throws IOException    {        //创建目的地        FileWriter fw=new FileWriter("DateDemo_copy.txt");        //与已有的文件关联        FileReader fr=new FileReader("DateDemo.java");        int ch=0;        while((ch=fr.read())!=-1)//读一次        {            fw.write(ch);//写一次        }        fw.close();        fr.close();    }}
0 0