返回值readerline 返回值是String,得用String来接
掉什么方法就用什么来接
程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
操作流程
在Java中IO操作也是有相应步骤的,以文件操作为例,主要的操作流程如下:
使用File类打开一个文件
通过字节流或字符流的子类,指定输出的位置
进行读/写操作
关闭输入/输出
IO操作属于资源操作,一定要记得关
字节流
FileInputStream从文件系统中的某个文件中获得输入字节。
FileOutputStream可用来写入数据到文件
字节输出流OutputStream :以Stream结尾的就是字节流
字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream
OutputStream此抽象类,是表示输出字节流的所有类的超类。操作的数据都是字节,定义了输出字节流的基本共性功能方法。
此类是一个抽象类,如果想要使用此类的话,则首先必须通过子类实例化对象,那么如果现在要操作的是一个文件,则可以使用:FileOutputStream类。通过向上转型之后,可以为OutputStream实例化
FileOutputStream类
OutputStream有很多子类,其中子类FileOutputStream可用来写入数据到文件。
FileOutputStream类,即文件输出流,是用于将数据写入 File的输出流。
输出流中定义都是写write方法
代码演示
packagecom.oracle.demo01;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;public classDemo01 {public static void main(String[] args) throwsIOException {//文件输出流//如果指定文件不存在,则创建//如果指定文件存在则覆盖
FileOutputStream fos=new FileOutputStream("D:\\demo06\\o.txt",true);//添加true进行续写。,默认是false不进行续写,内容将会被覆盖//写入方法一。----向文件中单个字节写入//调用父类中的write方法。
fos.write(100);//走阿斯克码表,对应值d//写入方法二-------向文件中写入字节数组
byte[] by={66,67,68,69};//
//调用父类中的write方法。
fos.write(by);byte[] bys={-66,-67,-68,-69};///
fos.write(bys,1,2);//从下标1开始写入两个//释放资源
fos.close();
}
}
文件的续写和换行:
续写:在构造方法中,如果将append的值设置为true,则表示在文件的末尾追加内容。则表示在文件的末尾追加内容。默认值为false,内容将会被覆盖
l 给文件中续写数据和换行,代码演示:
publicclass FileOutputStreamDemo2 {
publicstaticvoid main(String[] args)throwsException {
File file= new File("c:\\file.txt");//FileOutputStream fos= new FileOutputStream(file, true);[L1] 设置给指定文件续写数据
String str= "\r\n"[L2] +"aaa";实现换行
fos.write(str.getBytes());
fos.close();
}
}
Io的异常处理
packagecom.oracle.demo01;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;public classdemo02 {public static voidmain(String[] args) {//明确目的地
FileOutputStream fos=null;try{
fos= new FileOutputStream("D:\\demo0611\\o.txt",true);//true开启续写功能
String str="\r\n"+"你好";//写入一个字节数组
fos.write(str.getBytes());
}catch(FileNotFoundException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();
}finally{//释放资源//一定要判断fos是否为null,只有不为null时,才可以关闭资源
if(fos!=null){try{
fos.close();
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
字节输入流InputStream
。InputStream此抽象类,是表示字节输入流的所有类的超类。
InputStream有很多子类,其中子类FileInputStream可用来读取文件内容。
FileInputStream 从文件系统中的某个文件中获得输入字节。
l read():返回值为int,读取一个字节并返回,没有字节返回-1.
l read(byte[]):返回值为int, 读取一定量的字节数,并存储到字节数组中,返回读取到的字节数。
代码展示
public static void main(String[] args) throwsIOException {//明确数据源(从那里读,不需要创建)
FileInputStream fis=new FileInputStream ("D:\\demo0611\\o.txt");//单个读出字节读取文件
int len =0;while ((len=fis.read())!=-1){
System.out.println((char)len); //因为len是int数值需要强转成char字符,也安装阿克斯码表的数值转的字符,
}//释放资源
fis.close();
}
}
字节数组读出
public static void main(String[] args) throwsIOException {//明确数据源(明确数据源)
FileInputStream fis=new FileInputStream ("D:\\demo0611\\o.txt");byte[] bytes=new byte[1024];//1024//一个字节一个字节数组读取
int len =0;while((len=fis.read(bytes))!=-1){//将字节数组转换为字符串打印
System.out.println(new String(bytes,0,len));//这里是把bytes数组转成了String字符打印;(bytes,0,len)这里的0是从数组下标0开始打印长度是len也就是传的字符个数,这样 就避免了重复打印最后一个字符的问题
}
fis.close();
}
}
复制文件—字节
过程:
获取目的地文件 FileInputStream进行读取 .read()
复制的目的文件 FileOutputStream进行写入 .write()
//单个字节数组复制文件
public static void get() throwsIOException {//获取数据来源
FileInputStream fis= new FileInputStream("D:\\demo0611\\cc.wmv");//获取复制的目的地
FileOutputStream fos=new FileOutputStream("D:\\demo0611\\a\\cc.wmv");//建立数组
byte[] by=new byte[1024];int len=0;long time =System.currentTimeMillis();while((len=fis.read(by))!=-1){
fos.write(by,0,len);
}long time2=System.currentTimeMillis();
fis.close();
fos.close();
System.out.println(time2-time); //3592//}
//单个字符复制文件
public static void getone() throwsIOException{//获取数据来源//获取数据来源
FileInputStream fis= new FileInputStream("D:\\demo0611\\cc.wmv");//获取复制的目的地
FileOutputStream fos=new FileOutputStream("D:\\demo0611\\a\\cc.wmv");//单个字节复制文件按
int len=0;long time =System.currentTimeMillis();while((len=fis.read())!=-1)
{
fos.write(len);
}long time2=System.currentTimeMillis();
fis.close();
fos.close();
System.out.println(time2-time); //1984605
}
非文本传输用字节流(如zip,jpg,视频等文件)
(一帮传的是看不懂的文件如java的class文件);文本文件传输用字符流(如:word,txt)
(一般是可以看懂的文件)
字符流
字符输入流Reader
以Reader结尾的就是字符流
,Reader,读取字符流的抽象超类。
l read():返回值是int,读取单个字符并返回
l read(char[]):返回值是int,将数据读取到数组中,并返回读取的个数。
使用FileReader读取包含中文的文件
public static void main(String[] args) throwsIOException {//明确数据源
FileReader fr=new FileReader("D:\\demo0611\\o.txt");//读单个字符
int len=0;while((len=fr.read())!=-1){
System.out.print((char)len);
}//释放资源
fr.close();
}
单个字符数组读取
packagecom.oracle.demo02;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;public classdemo02 {public static void main(String[] args) throwsIOException {//明确目的地
FileReader fr=new FileReader("D:\\demo0611\\o.txt");//建立数组
char[] ch=new char[1024];//
int len=0;while ((len=fr.read(ch))!=-1)
System.out.println(new String(ch,0,len));
}//释放资源
fr.close();
}
}
字符输出流Writer
packagecom.oracle.demo02;importjava.io.FileWriter;importjava.io.IOException;public classdemo03 {public static void main(String[] args) throwsIOException {//明确目的地
FileWriter fw=new FileWriter("D:\\demo0611\\utf8.txt",true);//开启续写功能加true//写入一个字符
fw.write(100);//字符流需要刷一下,才能显示字符
fw.flush();//写入一个数组
/*char[] ch={'窝','窝','头','1','块','钱','四','个'};
fw.write(ch,0,8);//指定插入的数组
fw.flush();
//写入一个字符串*/ fw.write("窝窝头。你好");//释放资源
fw.close();
}
}
字符流需要flush刷新一下才会出现复制内容
flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用。
close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。
字符复制文件
单个字符复制
字符数组复制
单个字符复制
public static void main(String[] args) throwsIOException {//明确目的地
FileWriter fw=new FileWriter("D:\\demo0611\\a\\u.txt");//明确数据源
FileReader fr=new FileReader("D:\\demo0611\\o.txt");int len=0;while((len=fr.read())!=-1){
fw.write(len);
fw.flush();
}//释放资源
fw.close();
fr.close();
}
字符数组复制packagecom.oracle.demo02;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;public classdemo05 {public static void main(String[] args) throwsIOException {//明确目的地
FileWriter fw=new FileWriter("D:\\demo0611\\a\\p.txt");//明确数据源
FileReader fr=new FileReader("D:\\demo0611\\o.txt");//数组
char[] ch=new char[1024];int len=0;while((len=fr.read(ch))!=-1){
fw.write(ch,0,len);
fw.flush();
}//释放资源
fw.close();
fr.close();
}
}
设置给指定文件续写数据
实现换行