Java IO 文件与流基础

@author ixenos

摘要:创建文件、文件过滤、流分类、流结构、常见流、文件流、字节数组流(缓冲区)

如何创建一个文件


#当我们调用File类的构造器时,仅仅是在运行时创建了一个File对象,而不是在文件系统中创建了一个文件。File类可以表示文件系统中存在的目录或文件,也可以表示尚不存在的

#File.separator是一个跨平台的分隔符 (Win用"\",同时"\"又做反义字符,所以"\\"才表示分隔符;UNIX用"/")

1.调用File对象的createNewFile()方法

 class FileTest1{
public static void main(String[] args){
File testFile = new File("c:\\test");
System.out.println(testFile.getAbsolutePath() + "是否存在" + testFile.exists()); try{
testFile.createNewFile(); //创建文件
}catch(IOException e){
e.printStackTrace();
} System.out.println(testFile.getAbsolutePath() + "是否存在" + testFile.exists()); //测试目录创建mkdirs()
File testDir = new File("c:\\a\\b\\c");
System.out.println(testFile.getAbsolutePath() + "是否存在" + testFile.exists()); testDir.mkdirs();
System.out.println(testFile.getAbsolutePath() + "是否存在" + testFile.exists());
}
} -------------------------------------
c:\test 是否存在:false c:\test 是否存在:true c:\a\b\c 是否存在:false c:\a\b\c 是否存在:true

2.使用FileOutputStream的构造器

File对象文件过滤


#public String[] list()

//相当于filter == null

如果此抽象路径名不表示一个目录,那么此方法将返回 null否则返回一个字符串数组,每个数组元素对应目录中的每个文件或目录。

表示目录本身及其父目录的名称不包括在结果中。

每个字符串是一个文件名,而不是一条完整路径。

不保证所得数组中的相同字符串将以特定顺序出现,特别是不保证它们按字母顺序出现。

#public String[] list(FilenameFilter filter)

#boolean accept(File dir, String name)是FilenameFilter接口中的一个抽象方法

除了返回数组中的字符串必须满足过滤器外,此方法的行为与 list() 方法相同。

如果给定 filternull,则接受所有名称。否则,当且仅当在此抽象路径名及其表示的目录中的文件名或目录名上调用过滤器的 FilenameFilter.accept(java.io.File, java.lang.String) 方法返回 true 时,该名称才满足过滤器。

*在此,可以把FilenameFileter类比成InvocationHandler,而accept就好比invoke

 1 import java.io.*;
2
3 /**
4 * 面对FilenameFilter接口编程
5 */
6 public class FileExtensionFilter implements FilenameFilter{
7 private String extension = null; //文件拓展名
8 public FileExtensionFilter(String extension){
9 this.extension = extension;
10 }
11
12 /**
13 * 定义过滤规则:以xxx结尾
14 * accept方法由list调用,遍历数组
15 * 形参:File dir 表示当前文件目录的File对象
16 * String name 表示当前文件名
17 */
18 public boolean accept(File dir, String name){
19 File tmp = new File(dir, name);
20 if(tmp.getName().toLowerCase().endWith(extension)){
21 return true;
22 }
23 return false;
24 }
25
26 public static void main(String[] args){
27 File currentDirectory = new File(".");
28 //构造文件过滤器对象
29 FileExtensionFilter javaFilter = new FileExtensionFilter("java");
30
31 //list过滤符合条件的String对象,返回一个String数组(不保证有自然序)
32 String[] javaFiles = currentDirectory.list(javaFilter);
33
34 for(int i=0; i<javaFiles.length; i++){
35 System.out.println(javaFiles[i]);
36 }
37 }
38 }

public String[] list(FilenameFilter filter)

流有哪些分类?


1.处理的数据单位不同,可分为:字节流,字符流

2.数据流方向不同,可分为:输入流,输出流

3.功能不同,可分为:节点流处理流(过滤流)

  根据功能分类的,可以这么理解:

  节点流:节点流从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流,例如FileInputStream和FileOutputStream,他们直接从文件中读取或往文件中写入字节流。

  处理流:“连接”在已存在的流(节点流或处理流)之上通过对数据的处理为程序提供更为强大的读写功能。过滤流是使用一个已经存在的输入流或输出流连接创建的,过滤流就是对节点流进行一系列的包装。例如BufferedInputStream和BufferedOutputStream,使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率,以及DataInputStream和DataOutputStream,使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。他们都属于过滤流。

  处理流(过滤流)采用的是装饰模式的思想,

装饰模式扩展对象的功能,而代理模式是扩展的功能

流结构介绍


Java所有的流类位于java.io包中,都分别继承自以下四种抽象流类型

  字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer

1.继承自InputStream/OutputStream的流数据的单位都是字节(byte=8bit),如图,深色的为节点流,浅色的为处理流。

 

2.继承自Reader/Writer的流数据的单位都是字符(单位字符占多少字节按编码格式来算,如UTF-8),如图,深色的为节点流,浅色的为处理流。

常见流类介绍


1.节点流类型常见的有:

1)对文件操作的字节流有FileInputStream/FileOutputStream

2)对文件操作的字符流有FileReader/FileWriter

2.处理流类型常见的有:

1)缓冲流:缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写效率,同时增加了一些新的方法。

  字节缓冲流有BufferedInputStream/BufferedOutputStream,字符缓冲流有BufferedReader/BufferedWriter,字符缓冲流分别提供了读取和写入一行的方法ReadLine和NewLine方法。

  对于输出的缓冲流,写出的数据,会先写入到内存中(即对应的缓冲数组中),再使用flush方法将内存中的数据刷到硬盘等目的地。所以,在使用字符缓冲流的时候,一定要先flush,然后再close,避免数据丢失。

2)转换流:用于字节数据到字符数据之间的转换。

  仅有字符流InputStreamReader/OutputStreamWriter。其中,InputStreamReader需要与InputStream“套接”,OutputStreamWriter需要与OutputStream“套接”。

  当然,这默认构造器使用系统默认字符集,也可以自己指定

3)数据流:提供了读写Java中的基本数据类型的功能。

  DataInputStream和DataOutputStream分别继承自InputStream和OutputStream,需要“套接”在InputStream和OutputStream类型的节点流之上。

4)对象流:用于直接将对象写入写出。

  流类有ObjectInputStream和ObjectOutputStream,本身这两个方法没什么,但是其要写出的对象有要求,该对象必须实现Serializable接口,来声明其是可以序列化的。否则,不能用对象流读写。

  关键字transient,由于修饰实现了Serializable接口的类内的属性,被该修饰符修饰的属性,在以对象流的方式输出的时候,该字段会被忽略。

  关于transient:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

Java IO 文件与流基础的更多相关文章

  1. java IO文件操作简单基础入门例子,IO流其实没那么难

    IO是JAVASE中非常重要的一块,是面向对象的完美体现,深入学习IO,你将可以领略到很多面向对象的思想.今天整理了一份适合初学者学习的简单例子,让大家可以更深刻的理解IO流的具体操作. 1.文件拷贝 ...

  2. 文件IO 相关的包:java.io文件——API

    文件IO 相关的包:java.io文件——API 1.Java.io.File类的使用(1)两种路径绝对路径:相对于当前路径:当前为 “工程名”(2)File类创建,对象为一个文件/目录,可能存在或不 ...

  3. Java IO之处理流

    一.处理流: 增强功能,提供性能,在节点流之上. 二.节点流与处理流的关系 节点流(字节流.字符流)处于IO操作的第一线,所有操作必须通过它们进行: 处理流可以对其他流进行处理(提高效率或操作灵活性) ...

  4. Java IO: 其他字符流(下)

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackReader,LineNumberReader,St ...

  5. 一头扎进 Java IO中-------java IO文件

    Java IO: 文件 在Java应用程序中,文件是一种常用的数据源或者存储数据的媒介.所以这一小节将会对Java中文件的使用做一个简短的概述.这篇文章不会对每一个技术细节都做出解释,而是会针对文件存 ...

  6. java IO 文件批量重命名

    java IO 文件批量重命名 package com.vfsd.renamefile; import java.io.File; import java.io.FileInputStream; im ...

  7. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

  8. [Java IO]03_字符流

    Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类.  它的定义如下: public abstra ...

  9. java io文件学习笔记

    File f = new file("D:"+File.separator+"test.txt"); File.separator跨系统文件分隔符 f.crea ...

随机推荐

  1. MATLAB中的多项式运算

    作者:长沙理工大学 交通运输工程学院 王航臣 1.多项式求根 在MATLAB中求取多项式的根用roots函数. 函数:roots 功能:一元高次方程求解. 语法:roots(c) 说明:返回一个列向量 ...

  2. 实战ASP.NET访问共享文件夹(含详细操作步骤)

    博客园找找看(http://zzk.cnblogs.com)的索引文件占用空间太大,需要移至另外一台服务器,所以要解决"在ASP.NET中通过共享文件夹访问索引文件"的问题. 假设 ...

  3. js 增加 onclick 事件

    obj.onclick = function(){check(this)} function check(obj){ alert(obj)l }

  4. 给Unity3d添加一个漂亮的标题栏

    我们在做好一个小Unity3d APP,我们一般都会兴致勃勃的导出一个exe,尝试着玩我们的app.感觉还不错,有板有眼的了.然而事与愿违,我们APP里面的内容挺漂亮的,但是它的标题栏是windows ...

  5. R语言数据结构

    5. 数据结构 5.1 数据结构简介 (1)向量 一个向量的所有元素必须有相同的类型(模式) (2)列表 列表可以非同质的 列表可按位置索引:lst[[2]] 抽取子列表:lst[c(2,5)] 列表 ...

  6. VIP站长大会(北京站)常见问题解答

    功能支持问题 1. react能否和MIP结合使用,如果暂时不能以后是否有考虑?是否会和其他 js 框架(比如angular )结合? 目前暂无计划支持. 2. MIP页是否支持自定义cookie?实 ...

  7. span标记

    span标记为内联元素,本身布局有宽高所以要给他个属性 display:block; 转成快元素.

  8. HUD 1171 Big Event in HDU(01背包)

    Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...

  9. iOS UIBezierPath类 介绍

      使用UIBezierPath类可以创建基于矢量的路径,这个类在UIKit中.此类是Core Graphics框架关于path的一个封装.使用此类可以定义简单的形状,如椭圆或者矩形,或者有多个直线和 ...

  10. 关于MPMoviePlayerController类播放视频时,外放没有声音的问题(ios)

    一.导入音频资源类 #import "AVFoundation/AVAudioSession.h" 二.在播放视频的方法中加一句支持外放的代码 [[AVAudioSession s ...