缓冲流

缓冲流继承自过滤流,使用缓冲流时一些要注意的知识点:

1.如果在缓冲流对象创建时使用了其他流,最后关闭时只需关闭缓冲流就可以了,其他流会跟着自动关闭。

2.缓冲字符输入流(BufferedReader)可以直接 readLine() 一次读取一行,BufferedInputStream没有此方法。

3.用BufferedInputStream读取文件结束时返回的是-1,这和File流相同,不过如果使用BufferedReader的ReadLine()方法,读取到最后,返回的是null。

3.在使用缓冲输出流(BufferedOutputStream)(BufferedWriter)后,最好调用 out.flush() 方法,来强制写出剩余数据,清空缓冲区。

4.其实 BufferedInputStream 内部就是对一个 byte 数组的封装,这和我们自己创建 byte 数组作为缓冲区的效果是相同的。它们的特点都是不用每读一个字节就输出一次,而是一次性读了一点量的数据,再一个一个的输出,减少了IO与系统的交互次数,提高了效率。

5.可以用BufferedReader(字符缓冲流)结合InputStreamReader(转换流)对字节流进行读取,可以大幅提高效率。

6.如果使用buffererReader和BufferedWriter结合使用,在读写文件时,一次读取一行再写入,这时要手动设置换行,可以调用bw.newLine()方法换行(不要忘记flush)。更方便的做法是使用PrinterWriter(打印输出流)来输出,它可以直接使用pw.println(line)方法自动换行。

数据流

数据流一般都是用来对文件流进行包装,使得在写一些数据时可以节省使用的字节空间,在读取这些数据时也避免了一些繁琐的转换操作。比如我们要向文件中写一个 double 型的数据,一个 int 型的数据和一个 String 型的数据,然后再读取出来。那么就可以这样写

public class DataIODemo {

    public static void main(String[] args) {
int i=;
double pi=Math.PI; //这个是圆周率
String s="java";
DataOutputStream out=null;
DataInputStream in=null;
try {
out=new DataOutputStream(new FileOutputStream("test.dat"));
out.writeInt(i); //写入int型数据
out.writeDouble(pi); //写入double型数据
out.writeUTF(s); //写入字符串 in=new DataInputStream(new FileInputStream("test.dat"));
int j=in.readInt(); //从文件中读取int型数据
double db=in.readDouble(); //从文件中读取double型数据
String str=in.readUTF(); //从文件中读取字符串
System.out.println(j+" "+db+" "+str);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }

读出的结果为

 3.141592653589793 java

使用数据流进行数据存储时,都是将数据转换成2进制存储的,不过不同数据类型存储的字节大小不同,所以取出数据时,要用不同的read方法来读取。比如我这里存储的顺序是先存储一位int型,再存储一个double型,最后存储一个字符串,读出的时候必须也按照同样的顺序来读,不然会 出现错误,这是因为每次read后,它的指针位置都会向后移动一定位数,如果用readInt(),它会读取四个字节的数据,然后指针移动到四个字节之后,然后使用readDouble()再读取,指针再移动,一直这样读。如果把读的顺序改变,就会变成用读String字符串的方法来读double型数据,产生错误。

对象流

1.使用对象流可以将一个对象进行序列化,然后进行传输 或者 存储到文件中,同样对象流可以对对象反序列化进行还原。

2.对象流只有ObjectInputStream 和ObjectOutputStream两种,因为数据在硬盘中都是以字节方式存储的,故对象想要在底层传输,就必须转换为字节。

3.对象想要进行序列换和反序列化,必须实现Serializable接口,Serializable接口为一个空接口,主要是起到标识作用。此外,对象还要进行构造函数的创建,以及实现toString()方法等一系列操作。

4.如果对象中的某个成员变量不想进行序列化,可以在变量的类型前加上 transient 关键字。

java中流的注意事项的更多相关文章

  1. Java内部类使用注意事项

    Java内部类使用注意事项: 1. 非静态内部类成员可以访问外部类实例成员 (如注释1),但外部类访问非静态内部类的成员 必须创建非静态内部类对象来访问其成员,如注释2 public class La ...

  2. 《精通并发与Netty》学习笔记(09 - Java中流的概念)

    Java中流的概念 java程序通过流来完成输入/输出.流是生产或消费信息的抽象.流通过java的输入/输出与物理设备链接.尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式.这样,相同的输 ...

  3. [原]Java工程打包注意事项

    注意事项(持续增加...): 如果Java工程中用到了注解,在用eclipse打jar包时需要注意一下,勾上“Add directory entries”,否则注解的类会注册不上

  4. Linux(Centos)之安装Java JDK及注意事项

    1.准备工作 a.因为Java JDK区分32位和64位系统,所以在安装之前必须先要判断以下我们的Centos系统为多少位系统,命令如下: uname -a 解释:如果有x86_64就是64位的,没有 ...

  5. 【转】Java并发编程注意事项

    保证线程安全的三种方法: 不要跨线程访问共享变量 使共享变量是final类型的 将共享变量的操作加上同步 一开始就将类设计成线程安全的, 比在后期重新修复它,更容易. 编写多线程程序, 首先保证它是正 ...

  6. Java中流的概念

    http://wapwenku.baidu.com/view/04714847b307e87101f69656.html?ssid=0&from=1086k&uid=0&pu= ...

  7. oracle 事务简介,锁的概念,java访问数据库注意事项

    java链接oracle和连接其他数据库一样有两种方式:1 桥接 jdbc-obdc2 jbdc insert语句一次插入大量数据 insert into table (列1,列2,列3) selec ...

  8. java 中流的使用

    Java中的流,可以从不同的角度进行分类. 一.按照数:输入流和输出流. 输出流: 输入流: 因此输入和输出都是从程序的角度来说的. 二.按照处理数据单位不同可以分为:字节流和字符流. 字节流和字符流 ...

  9. Linux(Centos、Debian)之安装Java JDK及注意事项(转)

    --转自:http://www.cnblogs.com/hanyinglong/p/5025635.html 说明:本人是以Debian 操作系统来进行安装的,这篇文章有很大帮助,才学Linux对有些 ...

随机推荐

  1. Windows 10工程版本泄露全新设计的操作中心圆角样式

    早些时候微软错误地向Windows 10所有测试通道推送内部工程版本,该版本构建后尚未经过微软内部测试. 当然本身微软也没准备推送所以该版本里很多新功能未被关闭,而成功升级的用户则可以立即查看这些功能 ...

  2. mysql5.7修改账户密码

    一.首次登录时,修改root账户的密码: vim /etc/my.cnf 在末尾添加 skip-grant-tables ,保存. service mysqld restart 再次登录时,不需要密码 ...

  3. Linux-Power-management

    1. 低级接口1.1 内核(swsusp)软件挂起1.1.1 睡眠状态的2个控制文件1.1.2 查看当前系统的睡眠控制文件内容1.1.3 状态表(表1)1.1.4 状态的使用1.2 uswsusp用户 ...

  4. [笔记]ul>li>a做分布时, 让其居中显示效果

    结构: <div id="page"> <ul> <li><a href="#">首页</a>< ...

  5. 使用vue框架开发前端项目的步骤

    前端项目的开发 1. 本地安装nodejs https://nodejs.org/en/download/ 2. 测试安装 > node -v 3. 本地安装git > git --ver ...

  6. tp5日志分表

    /** * 记录网站日志 * * @return bool */ public function record() { // 组装数据 $log = self::$param; $log[self:: ...

  7. 026、MySQL取字符串左边,取字符串右边,取字符串中间,取文本开始位置

    #取文本左边 ); #田 ); #田攀 ); #田攀5 #取文本右边 ); # ); # ); #攀52 #取文本中间 '); #田攀 '); #攀5 #从字符串s中获取s1的开始位置 不忘初心,如果 ...

  8. SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别

    原文:http://blog.csdn.net/shadowyelling/article/details/7684714 Left Join : 返回左表中的全部信息 以及右表中与左表条件相关的信息 ...

  9. thread.start和threadstart.invoke的区别

    new Thread(() =>refreshDGVdelegate(App.StockList)).Start();//在新线程中执行操作 new ThreadStart(() => r ...

  10. C#最小化到托盘+双击托盘恢复+禁止运行多个该程序

    托盘程序的制作: 1.添加notifyIcon控件,并添加Icon,否则托盘没有图标(托盘右键菜单也可直接在属性里添加):2.响应Form的Resize或SizeChanged消息: // Hide ...