黑马程序员_IO流

来源:互联网 发布:网络销售保健品 编辑:程序博客网 时间:2024/05/14 14:29
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

IO

 

(一)概述

  Java吧数据传输序列称为流,分为输入流和输出流,输入和输出都是相对于内存设备的,将外设中的数据读取到内存中称为输入,将内存的数写入到外设中称为输出。

  字符流的由来,其实就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字。在对这个文字进行操作,简单说:字符流=字节流+编码表。 

输入输出值得是内存向目的地输入输出,目的地可以有,文件、网络、压缩包,也可以是键盘、鼠标、内存或者显示器等。

(二)数据流常用类

操作字符流的两个顶层父类:1Reader 2Writer

操作字符流的常用子类有Writer ReaderFileReaderFileWriterBufferedReaderBufferedWriter

字节流的两个顶层父类:1InputStream  2OutputStream.

操作字节流的常用子类有FileInputStream FileOutputStreamBufferedInputStreamBufferedOutputStream

用这些常用流操作可以做文件复制

首先利用字符操作类Filereader filewriter写文本文件复制。

代码:

 

 import java.io.FileReader;import java.io.FileWriter;import java.io.IOException; public class FileCopyDemo {public static void main(String[] args){char[] cbuf=new char[10];//用来接收读取的字符串,每次读取1kFileReader fr=null;FileWriter fw=null;try {fw=new FileWriter("d:\\a.java");//新建一个文件名为a.java的Filewriter实例并创建新文件fr = new FileReader("g:\\a.java");//新建一个文件名为a.java的FileReader实例int len ;while((len= fr.read(cbuf))!=-1){//循环读取所有信息,并存入新文件fw.write(cbuf, 0, len);}System.out.println("复制完成");} catch (IOException e) {// 处理异常System.out.println("没有这个文件");}finally{//关闭两个文件资源if(fr!=null)try {fr.close();} catch (IOException e) {new Throwable("关闭文件异常");}if(fw!=null)try {fw.close();} catch (IOException e) {new Throwable("关闭文件异常");}}}}


利用字符操作类BufferedReaderBufferedWriter写文本文件复制,缓冲区可以提高读写效率

主要展示这两个类的操作方法,这里没写对抛出异常的处理

import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException; public class BufferedCopyDemo {public static void main(String[] args) throws IOException{FileReader fd=new FileReader("a.txt");//读取的文件必须要存在否则会报错FileWriter fw=new FileWriter("d:\\a.txt");//要复制的目的文件//把两个文件流放入缓冲区BufferedReader bfd=new BufferedReader(fd);BufferedWriter bfw=new BufferedWriter(fw);String str;while((str=bfd.readLine())!=null){//如果没有读完文件就继续循环bfw.write(str);//把每次循环的值赋给新文件bfw.newLine();bfw.flush();}bfw.close();bfd.close();}}


 

利用字节流复制文件,可以复制非字符文件,如图片视频音频等二进制文件。这里利用FileInputStream FileOutputStreamBufferedInputStreamBufferedOutputStream操作,并比较操作效率。

 

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException; public class ByteFileCopyDemo { public static void main(String[] args) throws IOException {long l=System.currentTimeMillis();demo1();//调用无缓冲区的方法System.out.println(System.currentTimeMillis()-l);l=System.currentTimeMillis();demo2();//调用缓冲区方法System.out.println(System.currentTimeMillis()-l);//根据输出结果,发现缓冲区明显效率比无缓冲区高。} public static void demo1() throws FileNotFoundException, IOException {//把文件与数据流关联并实例化FileInputStream fis=new FileInputStream("G:\\KuGou\\答案.mp3");FileOutputStream fos=new FileOutputStream("d:a.mp3");byte[] buf=new byte[2048];while (fis.read(buf)!=-1) {fos.write(buf);//把就文件不断写入新文件}fos.close();fis.close();}public static void demo2() throws FileNotFoundException, IOException {//把文件与数据流关联并实例化 FileInputStream fis=new FileInputStream("G:\\KuGou\\答案.mp3");BufferedInputStream bufis=new BufferedInputStream(fis);//实力换两个buffered缓冲区,并把文件流放入缓冲区 FileOutputStream fos=new FileOutputStream("d:a.mp3");BufferedOutputStream bufos=new BufferedOutputStream(fos);//实力换两个buffered缓冲区,并把文件流放入缓冲区 byte[] buf=new byte[2048];while (bufis.read(buf)!=-1) {bufos.write(buf);//旧文件不断写入新文件}bufos.close();bufis.close();} } 

 

从键盘读取数据system.in的基本使用,可以把.system.in 当成一个流进行操作,代码如下

 import java.io.IOException;import java.io.InputStreamReader; public class ReadKeyDemo {public static void main(String[] args) throws IOException{InputStreamReader isr=new InputStreamReader(System.in);//把键盘输入流放入reader流读取char[] buf=new char[1024];isr.read(buf);System.out.println(new String(buf));//输出键盘每次输入的内容}}   


 

 

 

 

(三)文件流常用操作

 

字符流与字节流只是操作文件内容的,那么用什么来操作文件夹和文件呢?

Java中提供了file

File类的基本使用,递归的读取文件以及子文件内容

用一句话来概括,递归获取内容:如果是文件则输出,如果是目录则当成参数传入自身继续调用自身

 

import java.io.File;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date; public class FileTreeDemo {     public static void main(String[] args)  {      show("D:\\360安全浏览器下载",0); } public static void show(String path,int lev) {//path为路径,lev为文件夹的深度File f=new File(path);String strtime;//用来存放文件最后一次操作时间的字符Date d=new Date();DateFormat df=new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");//格式化输出时间String[] name=f.list();for (int i = 0; i < name.length; i++) {d.setTime(new File("d:\\a.txt").lastModified());//获取文件最后一次操作时间if(new File(path+"\\"+name[i]).list()==null){System.out.println(strcopy(lev)+"--"+name[i]+"时间:"+df.format(d));//如果是文件则输出当前文件名}else{show(path+"\\"+name[i],++lev);//如果是一个目录那么继续递归}}}public static String strcopy(int i){///格式化输出文件名String str="";for (int j = 0; j < i; j++) {str+=" |";}return str;} }

 

 

 

 

文件夹的删除基本思路

如果是文件则删除当前文件,如果是目录继续递归,在递归完成之后继续删除当前文件夹,提示回收站找不回,请慎重使用

代码展示

 

 

import java.io.File; public class FileTreeDemo {     public static void main(String[] args)  {      del("D:\\a"); } public static void del(String path) {//path为路径,File f=new File(path);String[] name=f.list();for (int i = 0; i < name.length; i++) {if(new File(path+"\\"+name[i]).list()==null){new File(path+"\\"+name[i]).delete();//如果是文件则删除当前文件}else{del(path+"\\"+name[i]);//如果是一个目录那么继续递归new File(path+"\\"+name[i]).delete();//在递归完成之后继续删除当前文件夹}}new File(path).delete();}  }

 

 

Properties 经常和文件流组成配置文件,代码演示

假设已经存在a.txt{ 

Key1 =hello

Key2=hahahha

Key3=heheh

Key4=xixixixixixixi

}

 

 

import java.io.FileReader;import java.io.IOException;import java.util.Properties; public class FileTreeDemo {     public static void main(String[] args) throws IOException  {      FileReader fr=new FileReader("a.txt");//实例化文件流并关联一个文件      Properties prop=new Properties();      prop.load(fr);//把文件读取到pro      for (int i = 0; i < prop.size(); i++) {System.out.println(prop.getProperty("key"+i));//根据键输出,配置文件经常利用到这一点}} }

 

 

 

 

 

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
0 0
原创粉丝点击