------- android培训、java培训、期待与您交流! ---------
1.IO流概述
流:程序用来读写文件数据这个技术,流技术,输出和输入,IO流技术
IO流技术实现设备之间的数据传输,可以使用流技术读取数据,自己机子的,读取其他计算机,设备硬盘,另一台主机,或者互联网
按照操作数据的不同,分成了字符流和字节流
字符流,专门用于操作文本数据,记事本,Java程序,网页,字符流在读或者写数据的时候,查询本机默认编码表(GBK),有利于操作文本文件,出现于JDK1.1
字节流,可以用来操作任意文件,读写文件的时候,不查询编码表
按照流向分,输出流Output和输入流Input。输出,Java程序写文件,操作数据目的,输入,Java程序读取文件,操作数据源
字符流只能操作文本数据,字节流任意数据,输出就是写文件,输入就是读取件
2.8.IO中的继承体系
字符输出流,写文本文件的,抽象基类 java.io.Writer,写文件的,写的方法有哪些:
write(字符数组) write(字符数组一部分) write(单个字符) write(字符串)
字符输入流,读文本文件的,抽象基类 java.io.Reader,读文件的,读的方法有:
read()单个字符 read(字符数组) read(字符数组一部分)
字节输出流,写任意文件的,抽象基类 java.io.OutputStream,写文件的,写的方法:
write(单个字节) write(字节数组) write(字节数组一部分)
字节输入流,读任意文件的,抽象基类 java,io.InputStream,读文件的,读的方法:
read()单个字节 read(字节数组) read(字节数组一部分)
3.
写文本文件
字符输出流 Writer,父类不能直接使用,找子类,FileWriter类
构造方法 FileWriter(字符串的文件名)
字符流在写数据的时候,write方法写,数据写在了内存中,并没有直接写到目的文件中,内存(缓冲),如果让数据写到目的文件中,字符流要进行缓存区的刷新操作。Writer中的方法flush,刷新流的缓冲,将数据写到目的地,字符流只要刷新的,数据必会走向目的地。
文件的续写,文件的后面追加写入,原有的数据都被保留下来
FileWriter类构造方法中,传递String的文件名,true实现追加写入
4.读取文本文件
Reader类,抽象类,找子类,FileReader,构造方法,直接传递字符串的文件名
调用FileReader父类方法实现读取功能
读取单个字符的方法 int read() 读取一个字符
read()方法,每次只能读取一个字符,返回这个字符的码值,没调用一次read()自动向后读取一个字符,如果读取到文件的末尾,返回-1
注意:文件读取的时候,一次循环不允许出现2次read()
保证读取的文件必须是GBK编码的(ANSI)
读取字符数组 int read(char[] ch)
每次读取到的字符,装在字符数组中,返回每次读取的有效字符个数
5.文件的复制,文本文件
读写原理,一个读,一个写
FileReader类读取源文件
FileWriter将读取到的数据源中的文本,写向数据目的文件
采用读取一个字符,写一个字符的方式
6.字符输出流的缓冲区对象
数组的缓冲,提高了流对象的读写效率,开发出现流对象的缓冲区对象,目的提高流的操作效率。字符输出流的缓冲区 java.io.BufferedWriter
字符输出流缓冲区对象方法:
构造方法 BufferedWriter(Writer out)传递的是Writer的子类对象。目的:缓冲区对象出现的目的,提高输出流的效率,提高哪一个流,只要传递的是Writer的子类,提高的就是你这个子类的效率。FileWriter
void newLine()写一个换行。\r\n Windows下有效,Linux操作系统\n
newLine()具有跨平台性,安装的JVM版本了,如果安装的JVM是Windows版本的,newLine()方法中写的就是\r\n ,如果安装的是Linux版本的JVM,newLine()方法中的写就是\n
7.字符输入流的缓冲区对象
提高字符输入流的读取效率,java.io.BufferedReader,查阅API文档,这个缓冲区可以按行读取。
字符输入流缓冲区对象的方法:
构造方法 BufferedReader(Reader in),传递是的Reader类的子类对象。目的,提高字符输入流的读取效率,提高哪个流对象,传递Reader子类,FileReader.
String readLine()读取文本一行,返回字符串,读取文件结尾,返回null,读取一行,返回的字符串中,没有\r\n符号,返回是一行有效字符
8.文本文件复制的第三种方式
利用字符流缓冲区对象,按行读取,读一行,写一行,写换行,刷新
package cn.itcast.iostream;
/*
* read方法,读取文本文件,传递字符数组
* int read(char[] ch)
*/
import java.io.*;
public class FileReaderDemo1 {
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("c:\\read");
//定义字符数组,长度1024的倍数
char[] ch = new char[1024];
//开始调用父类方法read(ch)返回一个int值
//循环调用read方法
int len = 0 ;
while((len = fr.read(ch))!=-1){
//输出的时候,输出数组,输出存储的有效字符个数啊
System.out.print(new String(ch,0,len));
}
fr.close();
}
}
/*
* int x = fr.read(ch);
System.out.println("X="+x);//2
System.out.println(new String(ch));//ab
x = fr.read(ch);
System.out.println("X="+x);//2
System.out.println(new String(ch));//cd
x = fr.read(ch);
System.out.println("X="+x);//1
System.out.println(new String(ch));//ed
x = fr.read(ch);
System.out.println("X="+x);//-1
System.out.println(new String(ch));//ed
* */
/*
字符输出流写一个文件
*/
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
/*
抛出IOException
创建一个文件,如果文件已经存在覆盖掉原来的
IO流不具备创建文件的能力
调用Windows中的功能创建的,占用了操作系统的资源
*/
FileWriter fw = new FileWriter("write.txt");
//调用父类的方法write写字符串
fw.write("abc");
//调用父类的方法,刷新flush()
fw.flush();
fw.write("写个中文试试看");
fw.flush();
//IO流,使用完毕后,必须关闭流对象,释放操作系统的资源
fw.close();
}
}
package cn.itcast.iostream;
/*
* 复制文本文件:字符流对象完成,读一个字符,写一个字符
* 实现步骤:
* 1. FileReader建立对象,包装源文件 c:\a.html
* 2. FileWriter建立对象,包装目的文件 d:\a.html
* 3. read方法读取一个字符
* 4. write方法写一个字符,刷新
* 5. 关闭资源
*/
import java.io.*;
public class CopyText {
public static void main(String[] args) {
//建立两个流对象
FileReader fr = null;
FileWriter fw = null;
try{
fw = new FileWriter("d:\\w.log");//数据目的
fr = new FileReader("c:\\w.log");//数据源
//开始循环读取源文件,读一个字符写一个字符
int len = 0 ;
while((len = fr.read())!=-1){
fw.write(len);
fw.flush();
}
}catch(IOException e){
//输出异常信息
e.printStackTrace();
throw new RuntimeException("复制失败");
}finally{
try{
if(fr!=null)
fr.close();
}catch(IOException e){
throw new RuntimeException("读取源关闭失败");
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException e){
throw new RuntimeException("文件写入关闭失败");
}
}
}
}
}