IO技术主要的作用是解决设备与设备之间的数据传输问题

File类

File类用来描述一个文件或者文件夹。

构造方法:

File(String pathname) 通过给定路径名字来创建一个File对象。

File(URI uri) 通过给定URI来创建一个File对象。

File(File parent, String child) 根据File父路径和String子路径创建一个File对象。

File(String parent, String child) 根据String父路径和String子路径创建一个File对象。

File.separator目录分割符

与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符.

常用方法:

boolean createNewFile() 在指定位置创建一个新文件,成功返回true,已存在就不创建返回false

boolean mkdir() 在指定位置创建一个单级文件夹,成功返回true,存在就不创建返回false,上级目录不存在返回false。

boolean mkdirs() 在指定位置遍历创建多级文件夹,成功返回true,存在就不创建返回false

boolean renameTo(String dest) 同一目录下重命名指定文件或文件夹,不同目录下为剪切文件(此时不可操作文件夹)。

boolean delete() 立即删除文件或者空文件夹。

boolean deleteOnExit() 发出删除指令,当jvm退出的时候执行删除行为,一般用于删除临时文件。

boolean exists() 指定文件或文件夹是否存在。

boolean isFile() 判断是否是一个文件。

boolean isDirectory() 判断是否是一个文件夹。

boolean isHidden() 是否是一个文件或文件夹

boolean isAbsolute() 是否为绝对路径

String getName() 获取为文件或文件名,不包含上级路径。

String getPath() 返回绝对路径

String getAbsolute() 获取绝对路径,与文件存在与否无关

Long length() 获取文件大小(以字节为单位)

String getParent() 返回父目录路径

Long lastModified() 获取最后一次被修改的时间

static File[] listRoots() 列出所有根目录

String[] list() 返回目录下的所有文件名(包含隐藏文件)

String[] list(fileNameFilter filter) 返回指定目录中符合过滤条件的子文件或子目录.

File[] listFiles()  返回目录下的所有文件

File[] listFiles(FilenameFilter filter) 返回指定目录中符合过滤条件的子文件或子目录.

FilenameFilter:这是一个过滤器接口

IO流分类:

如果是按照数据的流向划分:

输入流

输出流

如果按照处理的单位划分:

字节流: 字节流读取得都是文件中二进制数据,读取到二进制数据不会经过任何的处理。

字符流:字符流读取的数据是以字符为单位的,字符流也是读取文件中的二进制数据,不过会把这些二进制数据转换成我们能识别的字符。(字符流 = 字节流 + 解码)

I0流体系

字节流:

---| InputStream 输入流:所有输入字节流的基类 (抽象类)

------| FileInputStream  字节输入流: 读取文件数据的输入字节流.

------| BufferedInputStream  缓冲输入字节流:内部维护了一个8kb的数组,提高读取文件数据的效率。

------| ObjectInputStream 对象输入流:

------| SequenceInputStream  序列输入流:

---| OutputStream 输出流:是所有输出字节流的父类(抽象类)

------| FileOutStream  字节输出流:向文件输出数据的输出字节流。

------| BufferedOutputStream 缓冲输出字节流:内部维护了一个8kb的数组,提高写文件数据的效率

------| ObjectInputStream 对象输出流:

------| PrintStream  打印流: 打印流可以打印任意类型的数据,而且打印数据之前都会先把数据转换成字符串再进行打印。

字符流:

---| Reader 输入流:输入字符流的基类(抽象类)

------| FileReader 字符输入流:读取文件的输入字符流

------| BufferedReader  缓冲输入字符流:缓冲输入字符流出现的目的是为了提高读取文件的效率和拓展了FileReader的功能。

------| InputStreamReader

---| Writer 输出字符流的基类(抽象类)

------| FileWriter 向文件数据数据的输出字符流。

------| BufferedWriter 缓冲输出字符流。

------| OutputStreamWriter

输入字节流:

使用FileInputStream读取文件数据的步骤:

1. 找到目标文件

2. 建立数据的输入通道。

3. 读取文件中的数据。

4. 关闭资源.

输出字节流:

FileOutputStream如何使用呢?

1. 找到目标文件

2. 建立数据的输出通道。

3. 把数据转换成字节数组写出。

4. 关闭资源

FileOutputStream要注意的细节:

1. 使用FileOutputStream的时候,如果目标文件不存在,那么会自动创建目标文件对象。

2. 使用FileOutputStream写数据的时候,如果目标文件已经存在,那么会先清空目标文件中的数据,然后再写入数据。

3. 使用FileOutputStream写数据的时候, 如果目标文件已经存在,需要在原来数据基础上追加数据的时候应该使用new FileOutputStream(file,true)构造函数,第二参数为true。

4. 使用FileOutputStream的write方法写数据的时候,虽然接收的是一个int类型的数据,但是真正写出的只是一个字节的数据,只是把低八位的二进制数据写出,其他二十四位数据全部丢弃。

缓冲输入字节流:

使用BufferedInputStream的步骤:

1. 找到目标文件。

2. 建立数据的输入通道

3. 建立缓冲输入字节流

4. 关闭资源

注意:

1. BufferedInputStream出现的目的是了提高读取文件的效率,但是缓冲流都不具备读写文件的能力,它要借助其它流的读写文件的能力。

2. BufferedInputStream的read方法每次读取一个字节的数据,

3. BufferedInputStream能提高效率的原因:读取时会一次性把8kb数据读入缓冲数组,然后每次都从数组中读取一个字节,8kb数据读完后,会再次将新的8kb数据放入缓冲数组。

4. 调用BufferedInputStream的close方法实际上关闭的是FileinputStream.

缓冲输出字节流:

使用BufferedOutputStream的步骤:

1. 找到目标文件

2. 建立数据的输出通道

3. 建立缓冲输出字节流

4. 关闭资源

要注意的细节:

1. 使用BufferedOutStream写数据的时候,它的write方法是是先把数据写到它内部维护的字节数组中。

2. 如果需要把数据真正的写到硬盘上面,需要调用flush方法或者是close方法、 或者是内部维护的字节数组已经填满数据的时候。

FileReader

用法:

1. 找到目标文件

2. 建立数据的输入通道

3. 读取数据

4. 关闭资源

FileWriter

FileWriter的使用步骤:

1. 找到目标文件。

2. 建立数据输出通道

3. 写出数据。

4. 关闭资源

FileWriter要注意的事项:

1. FileWriter内部是维护了一个1024个字符数组的,使用它写数据的时候,会先写入到它内部维护的字符数组中,如果需要把数据真正写到硬盘上,需要调用flush或者是close方法或者是填满了内部的字符数组。

2. 使用FileWriter的时候,如果目标文件不存在,那么会自动创建目标文件。

3. 使用FileWriter的时候,如果目标文件已经存在了,那么默认情况会先清空文件中的数据,然后再写入数据,如果需要在原来的基础上追加数据,需要使用“new FileWriter(File f, boolean b)”的构造方法,第二参数为true。

BuffererReader

输入字符流出现的目的是为了提高读取文件的效率和拓展了FileReader的功能。

其实该类内部也是维护了一个8kb的字符数组.

BufferedReader的使用步骤:

1. 找到目标文件

2. 建立数据的输入通道。

3. 读取数据

4. 关闭资源

经典写法

while((line = myReadLine(fileReader))!=null){

System.out.println(line);

}

BufferedWriter

BufferedWriter内部只不过是提供了一个8192长度的字符数组作为缓冲区而已,拓展了FileWriter的功能。

BufferedWriter使用:

1. 找到目标文件

2. 建立数据的输出通道

3. 写出数据

4. 关闭资源

SequenceInputStream

序列流创建步骤:

//1、创建文件

File file = new File("F:\\music");

//2、创建文件输入流

FileInputStream fos2 = new FileInputStream(file);

//3、创建Vector

Vector vector = new Vector();

//4、将文件输入流添加到Vector

vector.add(fos);

//5、通过Vector获取迭代器

Enumeration<FileInputStream> e = vector.elements();

//6、创建序列流

SequenceInputStream inputStream = new SequenceInputStream(e);

对象的输入输出流 : 对象的输入输出流主要的作用是用于写对象的信息与读取对象的信息。对象信息一旦写到文件上那么对象的信息就可以做到持久化了

对象的输出流:ObjectOutputStream

对象的输入流: ObjectInputStream

对象输入输出流要注意的细节:

1. 如果对象需要被写出到文件上,那么对象所属的类必须要实现Serializable接口。 Serializable接口没有任何的方法,是一个标识接口而已。

2. 对象的反序列化创建对象的时候并不会调用到构造方法的

3. serialVersionUID 是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出的一个数字。

4. 使用ObjectInputStream反序列化的时候,ObjeectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID进行对比,如果这两个id不一致,那么反序列化就失败了。

5. 如果序列化与反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个serialVersionUID,如果一类已经指定的serialVersionUID,然后在序列化与反序列化的时候,jvm都不会再自己算这个 class的serialVersionUID了。

6. 如果一个对象某个数据不想被序列化到硬盘上,可以使用关键字transient修饰。

7. 如果一个类维护了另外一个类的引用,那么另外一个类也需要实现Serializable接口。

打印流

打印流可以打印任何类型的数据,而且打印数据之前都会先把数据转换成字符串再进行打印。

主要应用:

改变标准输出流:

PrintStream p = new PrintStream(new File(""));

System.setout(p);

收集异常日志信息:

File logFile = new File("logfile");

PrintStream logPrintStream = new PrintStream(new FileOutputStream(logFile,true));

try{

代码区

}catch(Exception e){

//将异常写入日志留

e.printStackTrace(logPrintStream);

}

转换流:

这是字节流和字符流沟通的桥梁。

输入字节流的转换流:InputStreamReader  可以把输入字节流转换为输入字符流

输出字节流的转换流:OutputStreamWriter 可以把输出字节流转换成输出字符流

转换流的作用:

1. 如果目前所获取到的是一个字节流需要转换字符流使用,这时候就可以使用转换流。

2. 使用转换流可以指定编码表进行读写文件。

编码与解码

编码: 把看得懂的字符变成看不懂码值这个过程我们称作为编码。

解码: 把码值查找对应的字符,我们把这个过程称作为解码。

String s = "中国a";

byte[] bytes = s.getBytes("gbk");//编码

String s1 = new String(bytes,"gbk");//解码

注意细节:

1、编码与解码的时候指定的码表是unicode实际上就是用了utf-16.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,963评论 6 542
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,348评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,083评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,706评论 1 317
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,442评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,802评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,795评论 3 446
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,983评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,542评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,287评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,486评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,030评论 5 363
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,710评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,116评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,412评论 1 294
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,224评论 3 398
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,462评论 2 378

推荐阅读更多精彩内容