io流--字节流-字符流
返回值readerline 返回值是String,得用String来接
掉什么方法就用什么来接
程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
操作流程
在Java中IO操作也是有相应步骤的,以文件操作为例,主要的操作流程如下:
- 使用File类打开一个文件
- 通过字节流或字符流的子类,指定输出的位置
- 进行读/写操作
- 关闭输入/输出
IO操作属于资源操作,一定要记得关
字节流
FileInputStream 从文件系统中的某个文件中获得输入字节。
FileOutputStream可用来写入数据到文件
字节输出流OutputStream :以Stream结尾的就是字节流
字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream
OutputStream此抽象类,是表示输出字节流的所有类的超类。操作的数据都是字节,定义了输出字节流的基本共性功能方法。
此类是一个抽象类,如果想要使用此类的话,则首先必须通过子类实例化对象,那么如果现在要操作的是一个文件,则可以使用:FileOutputStream类。通过向上转型之后,可以为OutputStream实例化
FileOutputStream类
OutputStream有很多子类,其中子类FileOutputStream可用来写入数据到文件。
FileOutputStream类,即文件输出流,是用于将数据写入 File
的输出流。
输出流中定义都是写write方法
代码演示
package com.oracle.demo01; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException { //文件输出流 //如果指定文件不存在,则创建 //如果指定文件存在则覆盖 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) throws Exception { 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的异常处理
package com.oracle.demo01; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class demo02 { public static void main(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) throws IOException { //明确数据源(从那里读,不需要创建) 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) throws IOException { // 明确数据源(明确数据源) 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() throws IOException { // 获取数据来源 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() throws IOException{ //获取数据来源 // 获取数据来源 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) throws IOException { // 明确数据源 FileReader fr=new FileReader("D:\\demo0611\\o.txt"); //读单个字符 int len=0; while((len=fr.read())!=-1){ System.out.print((char)len); } //释放资源 fr.close(); }
单个字符数组读取
package com.oracle.demo02; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class demo02 { public static void main(String[] args) throws IOException { // 明确目的地 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
package com.oracle.demo02; import java.io.FileWriter; import java.io.IOException; public class demo03 { public static void main(String[] args) throws IOException { //明确目的地 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) throws IOException { // 明确目的地 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(); } 字符数组复制 package com.oracle.demo02; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class demo05 { public static void main(String[] args) throws IOException { //明确目的地 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(); } }
设置给指定文件续写数据
实现换行