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