JAVA IO的学习

参考文章  https://yq.aliyun.com/articles/32287
                 http://www.cnblogs.com/lich/archive/2011/12/10/2283445.html
                 http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html  很全面的最总结

一、FileNameFilter的策略模式

根据条件筛选目录列表
1.首先File即可以代表文件,也可以代表文件夹。
2.这里的FilenameFilter采用了一个策略模式(它本身是一个接口),只有一个accept方法,创建它的目的只是要把accept方法传递给File.list方法。提供一个匹配的条件

File path=new File(".");
String[] list=path.list(new FilenameFileter(){
 private Pattern pattern=Pattern.compile(匹配条件);
   public boolean accept(File dir,String name){
      return pattern.matcher(name).matches();
   }
});

在Java中 list(FilenameFilter filter)方法的实现,该方法会调用filter的accpet方法,如果根据你的条件accept方法匹配到了文件,既accept方法返回true,就将该文件放入到集合中。

public String[] list(FilenameFilter filter) {   
 String[] filenames = list(); 
   if (filter == null || filenames == null) {    
   return filenames; 
   }    
List<String> result = new ArrayList<String>(filenames.length); 
   for (String filename : filenames) {        
   if (filter.accept(this, filename)) {        
       result.add(filename);   
     }  
  }  
  return result.toArray(new String[result.size()]);
}
f.getAbsolutePath()
f.canRead();
f.lastModified();//最后修改的日期
f.getPath();
f.renameTo(File file)//移动文件或修改文件名称

IO流

功能
ByteArray 允许将内存的缓冲区当做InputStream使用
StringBuffer 将String转换成InputStream
File 从文本中读取信息
Sequence 将连个或者多个inputstream转换成单一的inputstream
Piped 实现管道化的数据

1.JAVA中的IO流分为输入流和输出流。与所有输入相关的类全部继承自InputStream,输出相关的全部继承自OutputStream。这两个类是面向字节的。
2.在Java1.1后新加入了Writer和Reader类,是一种针对Unicode字符的输入输出流。每个Stream方法都有对应的字符流方法。并且,字符流方法提供了响应的适配器可以将字节流方法转换成字符流。
3.同样Java提供了流的适配器类来改变流的行为。所有适配器(流的包装类)的基类FilterOutputStream。
InputStream 类

功能
ByteArray 允许将内存的缓冲区当做InputStream使用
StringBuffer 将String转换成InputStream
File 从文本中读取信息
Sequence 将连个或者多个inputstream转换成单一的inputstream
Piped 实现管道化的数据

1.使用FileWriter向文件中写内容

FileWriter writer = new FileWriter( fileName );
 writer.write( "Hello!\n"); 
writer.write( "This is my first text file,\n" ); 
writer.write( "You can see how this is done.\n" ); 
writer.write("输入一行中文也可以\n"); 
writer.close();

2.BufferedWriter类
写大量数据的时候推荐使用BufferedWirter类

String fileName = "C:/newHello.txt" ; 
BufferedWriter out = new BufferedWriter( new FileWriter( fileName ) ); 
 out.write( "Hello!" ); 
out.newLine() ; 
 out.write( "This is another text file using BufferedWriter," );
 out.newLine(); 
 out.write( "So I can use a common way to start a newline" );
 out.close();

3.使用BufferedReader和FileReader缓冲读取一个文件
1.BufferedReader具有readLine方法,可以一行一行的读取数据。如果没有读取到数据返回null

注意:使用readLine会丢弃换行符。所以手动加入换行符

BufferedReader in=new BufferedReader(new FileReader(filename));
String s;
StringBuilder builder=new StringBuilder();
while((s=in.readLine()!=null)){
    builder.append(s+"\n");
}

DataInputStream格式化的读取数据
它是一个面向字节的输入流,可以以字节的形式读取任何数据,比如文件。
方法:
readByte
readChar
....

DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream("file.txt")));
while(in.available()!=0){
   in.readByte()
}

DataOutputStream输出任意形式的数据
具有写各种基本数据类型的方法
将数据写到另一个输出流
它在所有的计算机平台上使用同样的数据格式,只要两台计算机上都有java,那么它是跨平台的。当我们使用DataIn/outputStream 输入输出信息时,最可靠的做法就是使用writeUTF。UTF-8是一种多字节可是,编码长度根据实际使用的字符集会有所变化。



例:将三个int型数字255/0/-1写入数据文件data1.dat

DataOutputStream out = new DataOutputStream( new FileOutputStream(fileName)); 
out.writeInt(value0);

新IO学习

新IO是在JDK1.4以后引入的,其目的在于提高读写的速度。它的思路更接近于操作系统执行的IO方式。使用缓冲+通道的方式。如果保存数据:将数据放到缓冲器中,通过缓冲器将数据放到管道中。如果取出数据:则管道将数据交给缓冲器,通过缓冲器拿到数据。

1.唯一与管道交互的缓冲器是---ByteBuffer类,存储字节的缓冲器。
2.管道类----Channels,负责发送和读取数据。

例:
1.像管道中写数据时,数据要用ByteBuffer.wrap()包装起来。
2.在完成后要记得close
3.对于读取数据时,要使用静态的allocate()方法来分配ByteBuffer的空间。如果为了达到更高的速度可以使用allocateDirect()分配更大的内存。

//jdk对老的FileInputStream,FileOutputStream,RandomAccessFile类做了兼容
FileChannel fc=new FileOutputStream("data.txt").getChannel();
//使用缓冲类,将数据先用缓冲类包装,再传递给管道fc对象。
fc.write(ByteBuffer.wrap("hh".getBytes()));
fc.close();
fc=new RandomAccessFile("data.txt").getChanel();
fc.position(fc.size());//移动到流的最后一个位置,从该位置开始写入数据
fc.write(ByteBuffer.wrap("tt".getBytes()));
fc.clear();//如果使缓冲器执行更进一步的read操作。
fc.close();
//读取数据
fc=new FileInputStream("data.txt").getChanel();//拿到读取文件的管道
ByteBuffer buff=ByteBuffer.allocate(1024);//分配空间
fc.read(buff);//将数据读取到buff中
buff.clipe();//通知buff,准备接收数据
while(buff.hasRemaing()){
   syso(buff.get());
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • tags:io categories:总结 date: 2017-03-28 22:49:50 不仅仅在JAVA领...
    行径行阅读 2,168评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,174评论 11 349
  • java nio Java的IO体系:旧IO新IO:nio,用ByteBuffer和FileChannel读写ni...
    则不达阅读 829评论 0 2
  • 寒露,滴滴答答下起了雨,轻轻袅袅笼起了雾。天儿可真凉啊~ 听着窗外的雨声,心格外地安静。 来吧,我们一起静静地画一...
    和尘之尘阅读 816评论 9 19