Java IO(二)

IO

     1,IO就是在不同数据的传递。

    2,IO分类:

                 1,流向:

                          输入流  读取数据

                          输出流  写出数据

                 2,数据类型:

                           字符流:

                                 输入流  Reader

                                 输出流  Writer

                          字节流:

                                 输入流  InputStream

                                 输出流  OutputStream

                  注意事项:

                           1,四个顶层类都是抽象类。

                           2, 一般每个体系的名称都是以基类为后缀。

                  应用场景:

                            文本文件使用字符流,一般情况下任意文件类型都可以使用字节流。

    3,字符流

             1,体系

                    Reader

                                  |---InputStreamReader

                                           |---FileReader

                                  |---BufferedReader

                    Writer          

                                  |---OutPutStreamWriter

                                          |---FileWriter

                                  |---BufferedWriter  

             2,字符流复制文本的5种方法示例:

一次读写一个字符//FilerReader/FileWriter
FileReader fr=new FileReader("c:\\a.txt");
FileWriter fw=new FileWriter("d:\\b.txt");

int ch=0;
while((ch=fr.read())!=-1){
    fw.write(ch);
}
fw.close();
fr.close();

一次读写一个字符数组//FileReader/FileWriter
FileReader fr=new FileReader("c:\\a.txt");
FileWriter fw=new FileWriter("d:\\b.txt");

int len=0;
char[] chs=new char[1024];
while((len=fr.read(chs))!=-1){
    fw.wirte(chs,0,len);
}
fw.close();
fr.close();
缓冲流一次读写一个字符//BufferedReader/BufferedWriter
BufferedReader br=new BufferedReader(new FileReader("c:\\a.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("d:\\b.txt"));

int ch=0;
while((ch=br.read())!=-1){
    bw.write(ch);
}
bw.close();
br.close();

缓冲流一次读写一个字符数组//BufferedReader/BufferedWriter
BufferedReader br=new BufferedReader(new FileReader("c:\\a.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("d:\\b.txt"));

char[] chs=new char[1024];
int len=0;
while((len=br.read(chs))!=-1){
    bw.wirte(chs,0,len);
}
bw.close();
br.close();

缓冲流一次读写一行//BufferedReader/BufferedWriter
BufferedReader br=new BufferedReader(new FileReader("c:\\a.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("d:\\b.txt"))

String line=null;
while((line=br.readLine())!=null){
    bw.wirte(line);
    bw.newLine();
    bw.flush();
}
bw.close();
br.close();



         4,字节流

                 字节流可以实现复制任何类型的数据。

                 体系:

                               InputStream

                                                         |---FileInputSream

                                                         |---BufferedInputStream

                               OutputStream

                                                         |---FileOutputSream

                                                         |---BufferedOutputStream

                  2,字节流复制文件的4种方式

字节流一次读写一个字节//FileInputStream/FileOutputStream
FileInputStream fis=new FileInputStream("c:\\a.jpg");
FileOutputStream fos=new FileOutputStream("d:\\b.jpg");

int by=0;
while((by=fis.read())!=-1){
    fos.write(by);
}
fos.close();
fis.close();

字节流一次读写一个字节数组//FileInputSream/FileOutputSream
FileInputSream fis=new FileInputStream("c:\\a.jpg");
FileOutputSream fos=new FileOutputSream("d:\\b.jpg");

byte[] bys=new byte[1024];
int len=0;
whiel((len=fis.read(bys))!=-1){
    fos.wirte(bys,0,len);
}
fos.close();
fis.close();
BufferedInputStream/BufferedOutputSream......

    

5,转换流

            1,public static final InputSream in 是一个标准的键盘输入流。

                 因为我们输入的是字符,而它返回的是InputSream 是字节流,如果需要对这个进行封装的时候是有问题的。

                 字符缓冲流对象是只能对字符流进行高效包装,也就是说,它只针对字符流有效。

                 而现在返回的是字节流,但是又需要使用这个功能,怎么办?

                 如果有一个能把字节流转换成字符流实现就好了。

                 对此,Java提供了一个转换流。

                  InputStreamReader:是字节流通过字符流的桥梁。

                  InputStreamReader(InputSream in)

//这两种方法等价
InputStream is=System.in;
InputSreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
//简化版
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

 

 

              示例:

                    对输入的文字进行保存

//转换流的简易示例
BufferedReader br=new BufferedReader(new InputSreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new FileWriter("c:\\save.txt"));

String line=null;
while((line=br.readLine())!=null){
    if("886".equals(line)){
           break;
    }   
    bw.write(line);
    bw.newLine();
    bw.flush();   
}
bw.close();
br.close();

 

      2, 需求:我要把一个文本文件的内容输出到控制台。

              public static final PrintStream out 标准输出流。

                  通过分析:

                          OutputStream

                                 |---FilterOutputStream

                                           |---PrintStream

把一个文本文件的内容输出到控制台//简易示例
BufferedReader br=new BufferedReader(new FileReader(c:\\a.txt));

//OutputStream os=System.out;
//OutputStreamWriter osw=new OutputStreamWriter(os);
//BufferedWriter bw=new BufferedWriter(osw);
//等价于↓
BurreredWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));

String line=null;
while((lin=br.readLine())!=null){
    bw.write(line);
    bw.newLine();
    bw.flush();
}
bw.close();
br.close();

 

 

     6,几个小问题:

                         1,文件不存在,会创建一个。文件如果存在,到底是重新创建,还是把内容给清空?

                         清空。

                     2,为什么要使用flush()?

                       使用的字符流,而底层是字节流,1字符=2字节,它不能不数据直接写到文本文件,其实是写到了数据缓冲区里面,所以需要调用flush()方法。

                     3,为什么要用close()?

                               1,把流对象标记为垃圾。

                               2,通知系统,释放和该文件相关的资源。

                          4,创建字符输出流,做了哪几件事?

                               1,第一次会通过系统管理去创建一个文件,以后会根据构造方法的第二个参数true或false来决定追加还是重写。

                               2,创建一个字符输出流对象。

                               3,把流对象指向文件。

                          5,close()与flush()的区别?

                                close():刷新缓冲区,释放资源,关闭流对象,流对象不能继续使用。

                                fluse():刷新缓冲区,流对象还可以继续使用。

                          6,怎么实现换行?

                                windows:\r\n

                                linux:\n

                                mac:\r

                          7,怎么实现追加内容?

                                FileWriter(String filename,boolean append),根据构造方法的第二个参数,true或false来追加或不追加。

   

      7,字符编码

                    1,编码表:

                                字符及其对应的一张表。

                    2,常见的字符集:

                          ASCII

                          ISO-8859-1

                          GB2312

                          GBK

                          GB18030

                          BIG5

                          UTF-8

                3,编码应用:

                          在IO流中如果想使用指定的编码读写数据,只能使用转换流。

                          OutputStreamWriter(OutputStream out, String charsetName)
                               OutputStreamWriter = out + charsetName
                                 字符流                  = 字节流 + 编码表

 

 

     8,IO案例

           需求:将d:\java目录下的后缀名.java文件 复制到e:\jad目录下,并把后缀名改为.jad

复制文件并修改名称/**
*    封装目录获取源路径
*    获取该目录下的所有File数组,加过滤器
*    遍历File数组,获取每一个File对象
*    复制文件
*/
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;


public class RenName {
	public static void main(String[] args) throws IOException{
		File srcFile=new File("d:\\java");
		File[] fileArray=srcFile.listFiles(new FilenameFilter(){
		    public boolean accept(File dir,String name){
		           return new File(dir,name).isFile()&&name.endsWith(".java");
		    }
		});

		File destFile=new File("e:\\jad");
		if(!destFile.exists()){
		     destFile.mkdir(); 
		}
		for(File file: fileArray){
		    String oldName=file.getName();
		    String newName=oldName.replace(".java",".jad");
		    File newFile=new File(destFile,newName);
		    BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
		    BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(newFile)); 
		    int len=0;
		    byte[] bys=new byte[1024];
		    while((len=bis.read(bys))!=-1){
		        bos.write(bys,0,len); 
		    }
		    bos.close();
		    bis.close();
		}

	}
}	

转载于:https://www.cnblogs.com/zhanfuxing/p/3649248.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值