I/O Streams

Byte Streams

输入输出以字节为单位,所有的使用字节流的类都继承自 InputStreamOutputStream

Byte Streams 属于 low-level I/O,其实是应该避免使用的,效率不高,之所以要提到 Byte Streams 是因为其他的 I/O 流是基于它实现的。

举例:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class CopyBytes {
public static void main(String[] args) throws IOException { FileInputStream in = null;
FileOutputStream out = null; try {
in = new FileInputStream("xanadu.txt");
out = new FileOutputStream("outagain.txt");
int c; while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
// 及时关闭流文件
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}

机制如下:

Character Streams

Java 使用 Unicode 来存储字符值,字符流会自动转换该格式为本地字符集。

举例:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class CopyCharacters {
public static void main(String[] args) throws IOException { FileReader inputStream = null;
FileWriter outputStream = null; try {
inputStream = new FileReader("xanadu.txt");
outputStream = new FileWriter("characteroutput.txt"); int c;
while ((c = inputStream.read()) != -1) {
outputStream.write(c);
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
}
}

CopyCharacters 的实现和 CopyBytes 非常像,只是其中的接口调用不太一样。在 CopyCharacters 中,int c 是一个字符的值至少 16bits,在 CopyBytes 中,int c 是一个字节值至少 8bits

Character Streams 实际使用的是 Byte Streams,只是字符流会在 字符字节 之间做一层自动的转化。

byte-to-character 转化时可以用到 InputStreamReader OutputStreamReader 这两个方法,在没有 prepackaged character 流中可以使用这些方法创建字符流。在 socket 中使用较多。

Line-Oriented I/O

以行为单位进行文件的读取与写入。

举例:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException; public class CopyLines {
public static void main(String[] args) throws IOException { BufferedReader inputStream = null;
PrintWriter outputStream = null; try {
inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new PrintWriter(new FileWriter("characteroutput.txt")); String l;
// 读取每一行
while ((l = inputStream.readLine()) != null) {
// 以行方式写入
outputStream.println(l);
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
}
}

Buffered Streams

上面提到的几种流都是 unbuffered I/O,他们的每次读或者写都会直接调用底层的的接口进行读写,这样其实效率不高,并且一直触发硬盘的读写或者网络数据的读取或写入。为了提高效率,引入 buffered I/O ,对于写操话数据是优先被缓存起来,待 buffer 满的时候再写入硬盘,对于读操作,在 buffer 是空的时候会调用 input API(Buffered input streams read data from a memory area known as a buffer; the native input API is called only when the buffer is empty. Similarly, buffered output streams write data to a buffer, and the native output API is called only when the buffer is full.)。

对于一个不具有缓存的流可以转化成可缓存的流,如下:

inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));

具有缓存功能的有以下几个类:

  1. BufferedInputStream (byte stream)
  2. BufferedOutputStream (byte stream)
  3. BufferedReader (character streams)
  4. BufferedWriter (character streams)

在特殊某些情况下,我们需要及时将缓冲中的数据进行写入,可以手动调用 flush() 来实现,但其实在 close() 的时候会调用 flush().

void flush()
throws IOException
Flushes this stream by writing any buffered output to the underlying stream.
Throws:
IOException - If an I/O error occurs

参考:

blog

java doc

Java I/O streams的更多相关文章

  1. JAVA Lambda Expressions streams

    http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html https:// ...

  2. Eclipse Collections:让Java Streams更上一层楼

    \ 关键要点 \\ Eclipse Collections是一个高性能的Java集合框架,为原生JDK集合增加了丰富的功能.\\t Streams是JDK的一个非常受欢迎的功能,但它缺少了一些特性,严 ...

  3. java.lang.Exception: No tests found matching Method tes(com.bw.test.Testrefiect) from org.junit.vintage.engine.descriptor.RunnerRequest@3bfdc050 at org.junit.internal.requests.FilterRequest.getRunner

    junit   方法  没有加上注解  @Test java.lang.Exception: No tests found matching Method tes(com.bw.test.Testre ...

  4. Java 8 Concurrency Tutorial--转

    Threads and Executors Welcome to the first part of my Java 8 Concurrency tutorial. This guide teache ...

  5. 和朱晔一起复习Java并发(一):线程池

    和我之前的Spring系列文章一样,我们会以做一些Demo做实验的方式来复习一些知识点. 本文我们先从Java并发中最最常用的线程池开始. 从一个线程池实验开始 首先我们写一个方法来每秒一次定时输出线 ...

  6. No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, org.springframework.boot.logging.LogLevel>]

    java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...

  7. 10G R2 参数文件相关

    CLUSTER_DATABASE Property Description Parameter type Boolean Default value false Modifiable No Range ...

  8. 深入解析Oracle 10g中SGA_MAX_SIZE和SGA_TARGET参数的区别和作用

    原文链接:http://m.blog.csdn.net/blog/aaron8219/40037005 SGA_MAX_SIZE是从9i以来就有的作为设置SGA大小的一个参数,而SGA_TARGET则 ...

  9. ORACLE 11G内存管理方式

    SGA包含的组件: 组件名 说明 参数 buffer cache 存放从数据文件中读取的数据拷贝,所有用户之间是可以共享的 db_cache_size db_keep_cache_size db_re ...

随机推荐

  1. 团体程序设计天梯赛-练习集-L1-041. 寻找250

    L1-041. 寻找250 对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字. 输入格式: 输入在一行中给出不知道多少个绝对值不超过1000的整数,其中 ...

  2. Scala语言学习笔记——方法、函数及异常

    1.Scala 方法及函数区别 ① Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法 ② Scal ...

  3. 如何查看Linux的CPU负载

    哪些工具可以查看 CPU 负载? 可以使用 top 命令.uptime 命令,特别是 top 命令,功能强大,不仅仅可以用来查看 CPU 负载. CPU 负载怎么理解?是不是 CPU 利用率? 要区别 ...

  4. vue部署到nginx服务下,非根目录,刷新页面404怎么解决?

    nginx配置 location / { proxy_pass http://xxxx; } location /category { root /home/tv; index index.html; ...

  5. HDU1029 - Ignatius and the Princess IV【水题】

    给你n个数字,请你找出出现至少(n+1)/2次的数字. 输入 本题包含多组数据,请处理到EOF: 每组数据包含两行. 第一行一个数字N(1<=N<=999999) ,保证N为奇数. 第二行 ...

  6. [luogu2319 HNOI2006] 超级英雄 (匈牙利算法)

    传送门 Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选 ...

  7. 【习题4-1 Uva1589】Xiangqi

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 车是可以被吃掉的... 注意这个情况. 其他的模拟即可. [代码] #include <bits/stdc++.h> u ...

  8. UVA The Tower of Babylon

    The Tower of Babylon Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many det ...

  9. Meteor 前端 RESTful API 通过后端 API 下载文件

    Meteor 下载文件 问题场景 后端 HTTP server提供一个下载接口,可是须要前端 Meteor 可以给浏览器用户开一个URL来下载这个文件. 举例:在线的Meteor Logo文件就好比后 ...

  10. 生产上数据库大量的latch free 导致的CPU资源耗尽的问题的解决

    中午的时候,我们生产上的某个数据库,cpu一直居高不下 通过例如以下的sql语句,我们查看当时数据库的等待,争用的情况: select s.SID, s.SERIAL#, 'kill -9 ' || ...