码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员——IO流——字符流

时间:2015-06-08 10:00:55      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

------ <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.comtarget="blank">

java培训</a>、期待与您交流! ---------


引言

IO流用来处理设备之间的数据传输

java对数据的操作是通过流的方式

java 用于操作流的对象都在IO包中

流按操作数据分为两种,字节流与字符流,

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

 将外设中的数据读取到内存中:输入。
   将内存的数写入到外设中:输出。

 IO流常用基类

      字节流的抽象基类:InputStream,OutputStream。

   字符流的抽象基类:Reader,Writer。


    由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
      如:InputStream的子类FileInputStream。
      如:Reader的子类FileReader。


例子:将文件写入指定目录下:

import java.io.FileWriter;
public class IoDemos {
         public static void main(String[] args) throws Exception
{
med();
}
private static void med() throws Exception
{
//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件,
//而且该文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖
//实际上就是明确数据要存放的目的地

          FileWriter fw = new FileWriter("E:\\java.txt");
//调用方法将字符串写入到流中
          fw.write("ssasdwa");
//刷新流对象中的缓冲中的数据,将数据刷到目的地中去
         fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中
        fw.close();
}

程序运行后,后在E盘目录下创建一个名为java的txt文档
}技术分享

技术分享

注:close只可以调用一次,调用后,不可能再写入数据

         如果在构造函数中写入true  则可以实现文件的续写,否则,将会覆盖前一个同名文件
public class IoDemos {
      public static void main(String[] args) throws Exception
     {
         med1();
      }
      private static void med1() 
      {
        FileWriter fw = null;
            try
             {
                     fw = new FileWriter("E:\\java.txt",true);
                     fw.write("4578954");
                     fw.flush();
               }
            catch(IOException e)
               {
                     System.out.println(e.toString());
              }
            finally
            {
                        try
                         {
                                    if(fw!=null)
                                     fw.close();
                         }
                        catch(IOException e)
                        {
                                     System.out.println(e.toString());
                       }
            }
}
运行程序后; 
技术分享

--------------------------------------------------------------------------------------------------------------

close  和  flush 的区别

          是:flush刷新后,流可以继续使用,close刷新后,会关闭流

----------------------------------------------------------------------------------------------------------------------------------------------

IO中异常处理方式:

技术分享

-------------------------------------------------------------------------------------------------------


private static void med1() {

try
{
  FileWriter  fw = new FileWriter("E:\\java.txt",true);
fw.write("4578954");
fw.flush();

}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fw!=null)
  fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}

}

这样创建是 错误的,因为fw是局部变量,不可以在try以外使用,所以可以改写成在外建立引用,在内部初使化

技术分享

----------------------------------------------------------------------------------------------------------------

运行程序会发生异常:


技术分享

----------------------------------------------------------------------------------------------------------------

那么改写程序:

private static void med1() {
// TODO Auto-generated method stub
FileWriter fw = null;
try
{
   fw = new FileWriter("E:\\java.txt",true);
fw.write("4578954");
fw.flush();

}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fw!=null)
  fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}

}

技术分享

运行程序,程序会正常运行

    注: 为防止异常运行时程序无法关闭,因此关闭流应该在finally中运行

----------------------------------------------------------------------------------------------------------------

读取某指定文件:

技术分享

编写相关代码:
    private static void med2()throws  IOException
{
// 创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException异常

FileReader  fr = new  FileReader("E:\\java.txt");

//调用读取流对象的read方法

int a = fr.read();
System.out.println((char)a);//s

//read()方法一次只可以读一个字符,而且会自动往下读

while(true)
{
int b = fr.read();
System.out.print((char)b);
if(b==-1)
break;
}
//或者第二种写法 
while((fr.read())!=-1)
{
int b = fr.read();
System.out.println((char)b);
}
}


技术分享

注:
  创建一个文件读取流对象,和指定名称的文件相关联
  要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException异常
  read()方法一次只可以读一个字符,而且会自动往下读

读取文件的第二种方式,通过字符数组

技术分享
     private static void med3()throws  IOException {

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

FileReader  fr = new  FileReader("E:\\IoDemos.java");

char[]   arr  = new char[1024];

//调用读取流对象的read方法

int num = 0;
while((num=fr.read(arr))!=-1)
{
System.out.print(new String(arr,0,num));
}

//read()方法一次只可以读一个字符,而且会自动往下读
fr.close();
}

其中read(arr)返回的是读到的字符个数
----------------------------------------------------------------------------------------------------------------------------------------------

读取文件练习:

读取E盘中的文件IoDemoes.java

private static void med3()throws  IOException {

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

      FileReader  fr = new  FileReader("E:\\IoDemos.java");

      char[]   arr  = new char[1024];

      //调用读取流对象的read方法

      int num = 0;

      while((num=fr.read(arr))!=-1)
       {
            System.out.print(new String(arr,0,num));
       }

      //read()方法一次只可以读一个字符,而且会自动往下读
       fr.close();
}


技术分享

技术分享


技术分享

----------------------------------------------------------------------------------------------------------------

拷贝文件

E盘中的文件IoDemoes.java拷贝一个复件到当前目录下

技术分享

技术分享



第一种方式
             private static void med4() throws  IOException 
            {

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

            FileReader  fr = new  FileReader("E:\\IoDemos.java");

//创建 个写入的目的地
            FileWriter  fw  = new FileWriter("E:\\IoDemos_rr.txt");
            int num = 0;
//读一个数据,写一个数据
            while((num = fr.read())!=-1)
            {
                        fw.write(num);
            }
            fr.close();
            fw.close();
}




第二种方式

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IoDemos {


            public static void main(String[] args) throws Exception
            {
                        med5();
            }


            private static void med5() {
// 拷贝文件的第二种方式
// 创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException异常

            FileReader  fr = null;
            FileWriter  fw = null;

            try
            {
                        fr = new  FileReader("E:\\IoDemos.java");
//创建 个写入的目的地
                        fw  = new FileWriter("E:\\IoDemos_rr.txt");
                        int num = 0;
                        char[] arr = new char[1024];
                        while((num = fr.read(arr))!=-1)
                        {
                                    fw.write(arr);
                        }
            }
            catch(Exception e)
            {
                        System.out.println(e.toString());
            }
            finally
            {
                 try
                    {
                            if(fr!=null)
                            fr.close();
    
                   }
                catch(Exception e)
                 {
                           System.out.println(e.toString());
                 }
                try
                 {
                            fw.close();
                }
                catch(Exception e)
                 {
                System.out.println(e.toString());
                }
            }

}

------------------------------------------------------------------------------------------------------------------------------------
技术分享

字符缓冲区

   <1>缓冲区出现提高了对数据的读写效率

    <2> 对应类:    BufferedWriter

                    BufferedReader

   <3> 缓冲区结合流才可以使用

   <4>在流的基础上,对流的功能进行了增强

使用缓冲区写入指定目录下文件:

技术分享

     private static void med6() throws Exception
{
//创建一个字符定稿流对象
FileWriter  fw = new FileWriter("E:\\BufferDemos.txt");
//为了提高字符写入流效率,加入缓冲技术
BufferedWriter bufw = new BufferedWriter(fw);
bufw.write("dddddd");
bufw.flush();
fw.close();
bufw.close();
}

运行程序后会得到


技术分享

注:使用到缓冲区,就必须刷新


   缓冲区中的换行方法 newLine() 具有跨平台的换行符


使用缓冲技术读取文件

要读取的文件为  BufferDemos.txt

技术分享

设计程序代码

private static void med7() throws Exception
{
// 创建一个读取流对象与文件相关联
FileReader fr = new FileReader("E:\\BufferDemos.txt");
//加入缓冲技术
BufferedReader burd= new BufferedReader(fr);
String num = null;
//该缓冲区提供了一个一次读一行的方法readLine 方便于对文本数据的获取
//当返回null时,表示读到了文件末尾

while((num=burd.readLine())!=null)
{
String  s = burd.readLine();
System.out.println(s);
}

burd.close();

}

技术分享


注:             //该缓冲区提供了一个一次读一行的方法readLine 方便于对文本数据的获取
                //当返回null时,表示读到了文件末尾

------------------------------------------------------------------------------------------------------------------------------------

使用缓冲区拷贝文件

private static void med8() {
// 
BufferedWriter  bufw = null;
BufferedReader  bufr = null;
FileReader   fr = null;
FileWriter   fw = null;
try
{

fr = new FileReader("E:\\BufferDemos.txt");
bufr = new BufferedReader(fr);
fw = new FileWriter("E:\\myjava.txt");
bufw = new BufferedWriter(fw);
String num = null;
char[] arr=new char[1024];
while((num=bufr.readLine())!=null)
{
bufw.write(num);
bufw.newLine();
}
}catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(bufr!=null)
bufr.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
try
{
if(bufw!=null)
bufw.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}



}

------------------------------------------------------------------------------------------------------------------------------------

自定义一个读出一行数据的方法

import java.io.BufferedReader;

import java.io.BufferedWriter;
   import java.io.FileReader;

import java.io.FileWriter;
   import java.io.IOException;

class MyBufferedReader
    {
private FileReader fil;
MyBufferedReader(FileReader fil)
{
this.fil = fil;
}
//提供一个可以一次读一行的方法
public String myReadLine() throws Exception
{
//定义一个临时容器,原BufferReader封装的是字符数组
//这里可以使用一个StringBuilder容器

StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=fil.read())!=-1)
{
if(ch==‘\r‘)
continue;
if(ch==‘\n‘)
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
{
return sb.toString();
}
return null;

}
}

建立一个测试类
public class IoDemos {

public static void main(String[] args) throws Exception
{
med10();
}

private static void med10() throws Exception
{
FileReader  fr = new FileReader("E:\\BufferDemos.txt");
MyBufferedReader  my = new MyBufferedReader(fr);
System.out.println(my.myReadLine());
System.out.println(my.myReadLine());
}



LineNumberReader

import java.io.FileReader;
   import java.io.LineNumberReader;

public class LineNumberReaderDemos {

public static void main(String[] args) {
med1();
}
private static void med1() {
FileReader fr;
LineNumberReader lnr ;
try{
fr = new FileReader("E:\\IoDemos.java");
lnr = new LineNumberReader(fr);
String line = null;
lnr.setLineNumber(100);
while((line = lnr.readLine())!=null)
{
System.out.println(lnr.getLineNumber()+" "+line);
}
lnr.close();
}catch(Exception e)
{
System.out.println(e.toString());
}

}


}

技术分享

黑马程序员——IO流——字符流

标签:

原文地址:http://blog.csdn.net/zl18603543572/article/details/46403137

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!