文档章节

I/O知识整理

w
 wangxhai
发布于 2016/11/25 13:10
字数 1186
阅读 14
收藏 0

Java.io包中操作文件内容的主要有两大类:字节流、字符流 输出流:对象到目的地文件(写进文件) 输入流:已有文件到目的地对象(输进对象)

一、字节流和字符流综述:

  1. stream结尾都是字节流,reader和writer结尾都是字符流。
  2. 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串
  3. InputStream,OutputStream主要处理二进制文件和字节流,Reader,Writer处理字符流(四个都是抽象类)
  4. 字符流操作才能使用缓冲区 Java中输入输出包含文本I/O和二进制I/O(下面对文本I/O只做简要笔记,二进制I/O中重要之处有注明以及代码)

二、文本I/O与二进制I/O综述:

  1. 文本I/O涉及编码和解码(机器自动进行的),而二进制I/O不涉及,所以二进制I/O更加高效
  2. windows的记事本以及Unix下的编辑器为文本文件,其他都为二进制文件
  3. 从计算机的角度来说,所有文件都是二进制文件
  4. 二进制文件与机器的编码方式无关所以它是可移植的
  5. 文本I/O在文件中以编码的形式保存,而二进制I/O在文件中以相同的字节保存

三、文本I/O

  1. File类:在程序中,如果使用绝对文件名,可能会降低程序的可移植性(比如Java和UNIX一样,以“/”作为目录分隔符,而在Windows系统中用的是”\”作为目录分隔符)
  2. 输入流Writer
  3. 输出流Rider

四、二进制I/O 1.输出流:InputStream 2. 输入流:OutputStream 注:以上两个是是二进制I/O类的根类 3. FileInputStream、FIleOutputStream、BufferedInputStream、BufferedOutputStream都没有引入新方法 4. 实例1——使用字节流复制文件: import java.io.*; public class ImageCopy { public static void main(String[] args) { //使用try-with-sourse语句块(资源中的子类型必须具备close()方法),可以自动关闭 try (FileInputStream fis=new FileInputStream(“2.jpg”); FileOutputStream fos=new FileOutputStream(“d:/JavaStudy/copy.jpg”)){ int flag=0; while((flag=fis.read())!=-1){ fos.write(flag); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } } 注: 如多是手动调用close方法,需要遵循先“打开的后释放”的原则 字符类型的,如txt文件,用字符流写入写出 5. DataInput(Output)Stream实现字节与基本类型或字符串之间的转换 6. 用EOFException也可判断文件是否到达末尾 catch (EOFException e) { System.out.println(“文件已到末尾”); } 7. BufferedInputStream:使用时,磁盘上的整块数据会一次性的读入到内存中的缓冲区,然后从缓冲区中将个别的数据传到程序中; BufferedOutputStream:使用时,个别的数据首先写入到内存中的缓冲区中,缓存区满后,缓冲区中的数据会一次性的写入到磁盘中 8. 如果没有指定缓存区的大小,默认为512个字节 9. 应该总是使用缓冲区I/O来加速文件的输入/输出(在大文件中,会看到实质性的性能提升) DataOutputStream output=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(“temp.dat”))); 10.实例2—命令行传参的文件复制 所用命令如下:Java Copy sourse target

对象I/O:ObjectInputStream和ObjectOutputStream类可用于读/写可序列化的对象 注:静态变量没有序列化 完全可以用ObjectInputStream和ObjectOutputStream类代替DataOutputStream和DataIntputStream类 ObjectInputStream和ObjectOutputStream类可以实现对象的输入和输出,从ObjectInputStream读取对象时,必须与其写入时的类型和顺序相同,所以为了得到需要的类型,必须使用Java安全的类型转换 Serializable接口 并不是每一个对象都可以写入到输出流,只有可序列化(serializable)的能够写入,Serializable接口是一个标记接口,没有方法 Java提供一个内在机制自动完成写对象的过程,这个过程称为对象序列化,在ObjectOutputStream中实现;读取过程称为反序列化,在ObjectInputStream中实现 如果一个对象是Serializable的实例,但是包含非序列化的实例数据域,可用transient关键字修饰,JVM会忽略这些数据域 如果一次对象不止一次写入对象流,就只存储序列号。读出这些对象时,它们的引用相同 五、随机访问文件 Java中RandomAccessFile类,允许文件从任意的位置进行数据读写 只读的或只写的都称为顺序流,顺序访问的文件不能更新 随机访问文件是由字节序列组成的,RandomAccessFile类可指定“r”和“rw”两种模式

© 著作权归作者所有

共有 人打赏支持
w
粉丝 0
博文 4
码字总数 2676
作品 0
资阳
Linux编程操作知识整理(continued)

前言:是自己对一种知识若干本的整合,当然是有主有次的,想尝试做下主题阅读方面的笔记。具体的内容整合到自己知识库里了。 一。文件I/O APUE里文件I/O讲的是“如何打开,读取,写入以及关闭...

im天行
2012/11/17
0
0
20180317插入排序-直接插入

前置知识 + 可以将插入排序看成两步操作 + 插入排序的基本思想就是将一条记录插入到一组已经有序的序列中,继而得到一个有序的、数据个数加1的新的序列。 本期内容 名词解释 + 直接插入排序将...

im天行
03/17
0
0
Java8 HashMap实现原理探究

前言:Java8之后新增挺多新东西,在网上找了些相关资料,关于HashMap在自己被血虐之后痛定思痛决定整理一下相关知识方便自己看。图和有些内容参考的这个文章:http://www.importnew.com/1659...

任杰LL
2016/03/02
254
0
SQL 将一列多行数据合并为一行 FOR XML PATH

FOR XML PATH 方法是用于将查询结果集以XML形式展示,这样展示方式的好处不言而喻。现在我要介绍的FOR XML PATH的“另类”用法。 首先,我们先来看看它的正常用法。下图是我们用到的一张TES...

随智阔
2014/03/19
0
0
20180312折半查找

前置知识 + 需要将待查找的列表按关键字大小有序排序。 本期内容 名词解释 + 查找过程 实现 + 非递归的方式 总体评价 + 优点是比较次数少,查找速度快,平均性能好。+ 缺点要求待查表为有序表...

im天行
03/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx防盗链、访问控制、解析php相关配置、Nginx代理

一、Nginx防盗链 1. 编辑虚拟主机配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf 2. 在配置文件中添加如下的内容 { expires 7d; valid_referers none blocked server_names *.tes......

芬野de博客
今天
0
0
spring EL 和资源调用

资源调用 import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.core.io.Resource;......

Canaan_
今天
0
0
memcached命令行、memcached数据导出和导入

一、memcached命令行 yum装telnet yum install telent 进入memcached telnet 127.0.0.1 11211 命令最后的2表示,两位字节,30表示过期时间(秒) 查看key1 get key1 删除:ctrl+删除键 二、m...

Zhouliang6
今天
0
0
Linux定时备份MySQL数据库

做项目有时候要备份数据库,手动备份太麻烦,所以找了一下定时备份数据库的方法 Linux里有一个 crontab 命令被用来提交和管理用户的需要周期性执行的任务,就像Windows里的定时任务一样,用这...

月夜中徘徊
今天
1
1
shell-日志脚本小实验

1.查找日志2018-8-15,求得那一分钟访问量最大。 #/bin/bash#from cc#2018-8-15#2018-08-15.log 哪一分钟 访问量 最大for d in `ls /data/nginx/logs/`doif [ -a 2018-08-15...

chencheng-linux
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部