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

黑马程序员——20.1,IO流,FileWriter,FileReader

2015-08-09 10:41 465 查看
------<ahref="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

黑马程序员——20,IO流,FileWriter,FileReader

/*

IO流的介绍:

IO流式用来处理数据传输的,与IO流相关的类都定义在了java.io包里面

按照操作类型分:字节流和字符流,其中的字符流与文字编码表有关。

字节流的抽象基类:

IntputStream, OutputStream

字符流的抽象基类:

Reader, Writer

*/

import java.io.*;
class  Ioliou
{
public  static void  main(String[] args)throws  IOException
//IO流代码后容易抛出异常,所以一般都会在方法上抛出IOException
{
FileWriter  f=new  FileWriter("f:\\yyyyyyy.txt");
//FileWriter是用于操作文件的Writer类的子类对象
/*
这句话可以指定路径建立对应名字的文件,
如果指定路径中已经存在同名文件,那么原本文件会被新建文件覆盖掉。
*/

f.write("jkl"); //将字符串写入流中
/*
但是此时如果打开yyyyyyy.txt文件看的话发现里面并没有写入jkl
这是为什么呢?因为其写入的仅仅是流中,不是写入文件中
*/
f.flush();//刷新流,把流里面的数据刷新到目的地
/*
此时再打开yyyyyyy.txt文件就会看见写入的jkl
*/
f.close();//这句话作用是先刷新流,接着再关闭流
f.write("rty");//由于前面关闭了流,所以这句话是写不进流里面的
System.out.println("Hello World!");
}
}


——————分割线——————

/*
IO流异常处理的方式
*/

import java.io.*;
class  Ioliou2
{
public   static  void   main(String[] args)
{
//涉及到IO流的语句一般都会抛出异常,所以try块里面才那么多语句
FileWriter  fi=null;
//为什么要在前面定义fi为空?
/*
因为后面的finally块里面有fi,
如果只是定义在try块里面,
fi的作用域只是在try块里面。
而后面还要调用fi.close();
所以,这个变量必须是全局变量。
至于初始化就放在try块里面。
*/
try
{
fi=new   FileWriter("f:\\trtrtr.txt");
fi.write("123");
fi.flush();

}
catch(IOException  e)
{
soc(e.toString());
}
finally
{
try
{
if(!(fi==null))
fi.close();
/*
关闭资源的动作硬要执行,所以放在finally块里面,
又因为fi.close();也会抛出IO异常,
所以也用try...catch块处理.
为什么前面还要加一句判断是否为空?
因为有可能开始建立文件就失败了,
既然文件建立都失败了,那么还怎么关闭流呢?
所以要加一个判断语句。

*/
}

catch(IOException  e)
{
soc(e.toString());
}

}

}
public  static void  soc(Object  obj)
{
System.out.println(obj);
}
}


——————分割线————

/*
文件的续写:
*/
import java.io.*;
class  Ioliou3
{
public  static  void   main(String[] args)
{
FileWriter  fi=null;
try
{
fi=new  FileWriter("f:\\trtrtr.txt",true);
/*
因为新建文件会覆盖原有文件,所以,FiletWriter类提供一个构造函数
FileWriter(String  s,boolean  b)  表示可以在原有文件后面续写数据
*/
fi.write("我是\r\n英雄");
/*
这句话表示输入数据“我是”然后换行接着输入数据“英雄”。
为什么要在\n前面加上\r呢?
因为\r\n写在一起在window系统里面才表示换行,
仅仅是\n只是在java里面才表示换行。
如果写的是fi.write("我是\n英雄");
那么在java里面显示的确是会换行,但是用window系统里面的工具打开,
“我是”与“英雄”之间会有一个黑块。这是window系统无法识别单独的\n的原因。
*/
}
catch(IOException   e)
{
soc(e.toString());
}
finally
{
try
{
fi.close();
}
catch(IOException  e)
{
soc(e.toString());
}

}

System.out.println("HelloWorld!");
}
public  static  void  soc(Object  obj)
{
System.out.println(obj);
}
}


————————分割线——————

/*
数据的读取
*/
import java.io.*;
class  Ioliou4
{
public   static  void  main(String[] args)
{
FileReader   re=null;
try
{
re=new  FileReader("f:\\trtrtr.txt");
/*
建立一个文件读取流对象,并且指向已经存在的文件!
如果文件不存在,运行会发生FileNotFoundException
*/
while(true)
{

int i=re.read();
char ch=(char)i;
soc(ch);
if(i==-1)
break;

int i2=re.read();
/*
read方法一次读取一个字符,返回的是int型数据,可以自动往下读取,
而且如果后面读到没有数据可读的时候就会返回-1,如果被强制转成字
符打印出来的是一个问号?
*/

char ch2=(char)i2;
soc(ch2);
if(i2==-1)
break;
}
}
catch(IOException  e)
{
soc(e.toString());
}
finally
{
try
{
re.close();//仅仅是关闭流
}
catch(IOException  e)
{
soc(e.toString());
}

}

}
public  static void  soc(Object  obj)
{
System.out.print(obj);
}
}


——————分割线——————

/*

第二种数据读取方式:调用read(char[] ch)

按照字符数组长度来读取,返回的是读取到的字符个数,

例如在本题中,长度为3的字符数组,读取的时候从第一位到第三位

填充字符,填充完了就返回填充的个数;再次调用read方法的时候,

会自动往下继续读取字符,又从第一位到第三位重新填充字符;

如果在某一次填充字符过程中,字符数组还没有填充完就没有字符继续填充的情况下,

这一次返回的是本次填充字符的个数,返回值也许不是字符数组长度,

如果在某一次填充字符过程中,字符数组还没有填充完就文件字符换行的情况下,

本次就只是填充到换行处,返回本次填充字符个数,下一次填充字符又从第一位开始填充下一行的字符。

再接下来,继续调用read方法读取,在上一次已经全部读取完字符了,那么这一次,返回值-1

读取一些比较大的文件的时候,一般定义字符数组长度1024

*/

import java.io.*;
class  Ioliou5
{
public   static  void   main(String[] args)
{
FileReader   fr=null;
try
{
fr=new FileReader("f:\\trtrtr.txt");
char[]  ch=new  char[5];
int     i  =0;
while((i=fr.read(ch))!=-1)
{
soc(new String(ch,0,i));
/*
new  String(ch,0,i)表示新建一个字符串,
其内容为字符数组ch的从0位开始长度为i的字符组成。
*/
}

}
catch(IOException  e)
{
soc(e.toString());
}
finally
{
try
{
fr.close();
}
catch(IOException   e)
{
soc(e.toString());
}

}

}

public  static void  soc(Object  obj)
{
System.out.println(obj);
}
}


——————分割线——————

/*

把文件从f盘复制到d盘

*/

import java.io.*;
class   Ioliou6
{
public  static void  main(String[] args)
{
FileWriter  fw=null;
FileReader  fr=null;
try
{
fw=new FileWriter("d:\\trtrtr_copy.txt");
//建立一个写入流对象,指定存储的路径的文件
fr=new FileReader("f:\\trtrtr.txt");
//建立一个读取流对象,与目的地相关联
char[]  ch=new  char[1024];
int i=   0;
while((i=fr.read(ch))!=-1)
{
fw.write(ch,0,i);
/*
按照字符数组ch从0位开始长度为i把字符写进流中
*/

}
}
catch(IOException  e)
{
throw  new  RuntimeException("读写出问题了");
//抛出一个运行异常对象
}
finally
{
try
{
if(fw!=null)
fw.close();
}
catch(IOException  e)
{

}
try
{
if(fr!=null)
fr.close();
}
catch (IOException  e2)
{

}

}

}
public  static void  soc(Object  obj)
{
System.out.println(obj);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: