字节流:处理字节数据的流对象。
字符流的来源:因为字符每个国家都不同,涉及到字符编码的问题。那么GBK编码的中文用unicode编码是有问题的。所以需要中文字节数据的同时加上指定的编码才能解析正确的数据。为了方便字节流和编码表封装成对象,这个对象就是字符流。
流的体系有四个基类:
字符流:Reader Writer
字节流:InputStream OutputStream
public static void main(String args[])throws IOException
{
//创建一个字符输出流对象,用于操作文件。该对象一建立,就必须明确数据 存储的位置。
//对象产生后,会在堆内存中有一个实体,同时也调用了系统底层资源,在指定位置创建一个存储数据的文件。
//如果指定位置出现了同名文件,文件会被覆盖
FileWriter fw = new FileWriter("a.txt");//FileNotFoundException
//调用了writer类中的write方法写入字符串
fw.write("aaa");
字符串并未直接写入到目的地中,而是写入到流中也就是内存中的缓冲区
fw.flush();//刷新缓冲区,将缓冲区中的数据刷新到目的地文件中
fw.close();//关闭流资源。在关闭流资源之前都会先刷新该流
}
读取流FileReader
public static void main(String args[])
{
FileReader fr = new FileReader("a.txt");
int ch =0;
while((ch = fr.read())!=-1)
{
sop((char)ch);
}
fr.close();
}
第二种高效的读取数据方式
//创建读取流对象和指定文件关联
FileReader fr = new FileReader("a.txt");
因为要使用read(char[])方法,将读取到的字符存入数组中。所以要创建一个字符数组。一般数组的长度都是1024的整数倍。
char[]buf = new char[1024];
int len = 0;
while((len = fr.read(buf))!=-1)
{
sop(new String(buf,0,len));
}
fr.close();
public static void main(String[] args) throws IOException {
//创建一个读写流对象,读取指定目录下的文件数据
FileReader fr = new FileReader("c:\\a.txt");
//创建一个写入流对象,将读取到的文件数据写入到另一个目录的文件中
FileWriter fw = new FileWriter("c:\\c.txt");
int ch = 0;
while ((ch=fr.read())!=-1) {
fw.write(ch);
}
fw.close();
fr.close();
}
复制文本异常处理
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try{
fr =new FileReader("a.txt");
fw = new FileWriter("c.txt");
char[] buf = new char[1024];
int ch = 0;
while ((ch=fr.read(buf))!=-1) {
fw.write(new String(buf,0,ch));
fw.flush();
}
}
catch(IOException e)
{
throw new RuntimeException("复制失败");
}
finally
{
if(fr!=null)
try {
fr.close();
} catch (IOException e) {
throw new RuntimeException("读取关闭失败");
}
if(fw!=null)
try {
fw.close();
} catch (IOException e) {
throw new RuntimeException("写入关闭失败");
}
}
}
}