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

------ <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());

}

}

}

时间: 2024-10-12 08:08:33

黑马程序员——IO流——字符流的相关文章

黑马程序员——21,字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader

------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- /* 字符流的缓冲区技术: 对于一些大文件,如果读取一个字符才写一个字符,读写操作过于频繁. 为了解决这个问题,引入了缓冲区技术. 缓冲区技术是在流的基础上(必须要先有流)增强了流对于数据的操作效率. 就如同在水龙头上拿水喝,原本是一滴一滴

黑马程序员-学习笔记 字符流相关

1.FileWriter FileWriter fw = new FileWriter("demo.txt"); fw.writer("abcde");fw.flush();fw.close(); writer()方法只是把数据写入到内存(流)中:flush():把当前流中的数据刷入到目的地中(demo.txt)中. 如果 fw(流)不关闭,使用writer()方法重复写入数据. close():关闭此流,但要先刷新一次缓存中的数据. flush()和close()

黑马程序员 IO流 文件的分割与合并

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ----------------------package cn.itcast.IO; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;

黑马程序员-常见的一些流和编码表

对象的序列化(对象要实现Serializable序列化接口,类似实现comparable ) 1.操作对象的流:ObjectOutputStream ObjectInputStream ObjectOutputStream : 将 Java对象的基本数据类型和图形写入 OutputStream. 通过在流中使用文件可以实现对象的持久存储. 构造函数:ObjectOutputStream(OutputStream out)//初始化时要有目的 方法: writeObject(Object obj)

黑马程序员——Java I/O流基础知识点(File类)

File工具 File类就是用俩将文件或者文件夹封装对象,弥补流对象的不足--流只能操作数据,不能操作文件夹的 封装的是路径!!! 构造方法演示 1.可以将已有的未出现的文件或者文件夹封装成对象. File f1=new File("c:\\abc\\a.txt"): File f2=new File("d:\\abc","ab.txt"打印,会打印路径.:目录分隔符,为了更好地跨平台File. File类常见功能 1,创建 createNewF

黑马程序员------IO(五)

黑马程序员------IO(五) 1.1  操作对象(示例1)ObjectInputStream与ObjectOutputStream 被操作的对象需要实现Serializable. Serializable:用于给被序列化的类加入ID号,用于判断类和对象是否是同一个版本 类通过实现java.io.Serializable接口以启用序列化功能,Serializable只是一个标记接口. 1 示例1: 2 import java.io.*; 3 4 class ObjectStreamDemo 5

黑马程序员——IO篇

------- android培训.java培训.期待与您交流! ---------- IO(Input Output)流 1.IO流用来处理设备之间的数据传输 2.Java对数据的操作是通过流的方式 3.Java用于操作流的对象都在IO包中 4.流按操作数据分为两种:字节流与字符流 . 字符流的数据字节流其实都能处理,因为无论什么在计算机上最后都是以字节存在的,但是其中有一部分数据它是以文本形式存在的,所以为了方便有了字符流,字符流里融合了编码表,而只有文字用到了编码表,所以字符流用来处理文本

黑马程序员——IO流总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 什么是IO流? IO流是用来处理设备之间的数据传输 有哪些流? 流按操作数据的种类分为:字符流和字节流 流按流的方向分:输入流和输出流 字节流的基类:InputStream和OutputStream 字符流的基类:Writer和Reader 常用写字符流:FileWriter,BufferedWriter,OutputStreamWriter,PrinterWriter 常用读字符流  : F

黑马程序员——IO流(一)

package IO; import java.io.FileWriter; /*IO(Inout Output)流 * Io流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的对象都在Io包中 * 流按操作数据分为两种:字节流与字符流 * 流按流向分为:输入流,输出流 * * IO流常用基类 * 字节流的抽象基类 * InputStream OutputStream * 字符流的抽象基类 * Reader Writer * 由这四个类派生出来的子类的名

黑马程序员—IO(一)流概述、字符流、字节流、流操作规律

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一节     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都在IO包中. 4)流按其操作数据的类型分为两种:字节流和字符流. 5)流按其流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象基流:Inp