I/O流分类:

  • 根据处理的数据类型不同

    • 字节流
    • 字符流
  • 根据流向不同
    • 输入流
    • 输出流
  • 根据功能不同
    • 节点流:直接与数据源相连,读入或读出。
    • 处理流:直接使用节点流,读写不方便,为了更快的读写文件,才有了处理流。

      与节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。

字符流由来

因为文件编码的不同,而有了对字符进行高效操作的字符流对象。

原理:其实就是基于字节流读取字节时,去查了指定的码表。

字节流和字符流的区别

  1.字节流读取的时候,读到一个字节就返回一个字节。

  字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时,先去查指定的码表,将查到的字符返回。

  2.字节流可以处理所有类型数据,如图片,mp3,avi

   字符流只能处理字符数据。

结论:只要是处理纯文本数据,就要优先考虑使用字符流。除此之外都用字节流。

下图并不是按照继承关系画的。

1、基本流 FileInputStream和FileOutputStream

节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。

将字符串写入特定文件,注意write方法只接收字符数组。

FileOutputStream fos;
try {
fos = new FileOutputStream("test.txt");
fos.write("www.cnblogs.com".getBytes());
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

2、处理流 BufferedInputStream和BufferedOutputStream

过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。

try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt"));
bos.write("www.cnblogs.com".getBytes());
bos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

3、DataInputStream和DataOutputStream

过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。

try {
FileOutputStream fos = new FileOutputStream("test.txt "); // 获得写入文件功能
BufferedOutputStream bos = new BufferedOutputStream(fos); // 获得缓冲功能
DataOutputStream dos = new DataOutputStream(bos); // 获得写入基本类型功能 byte b = 3;
short s = 4;
int i = 78;
long l = 100000;
char ch = 'a';
boolean bl = false;
float f = 4.5f;
double d = 4.0001; /*
* 将8种基本类型的对象写入文件中
*/
dos.writeByte(b);
dos.writeShort(s);
dos.writeInt(i);
dos.writeLong(l);
dos.writeChar(ch);
dos.writeBoolean(bl);
dos.writeFloat(f);
dos.writeDouble(d);
dos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

4、PipedInputStream和PipedOutputStream

管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream; public class PipedStreamDemo {
class Producer extends Thread {
private PipedOutputStream pos;
public Producer(PipedOutputStream pos) {
this.pos = pos;
}
@Override
public void run() {
try {
pos.write("hello,I am Producer".getBytes());
pos.close();
} catch (IOException e) {
e.printStackTrace();
} }
} class Consumer extends Thread {
private PipedInputStream pis;
public Consumer(PipedInputStream pis) {
this.pis = pis;
}
public void run() {
try {
byte[] buf = new byte[100];
int len = pis.read(buf);
System.out.println(new String(buf, 0, len));
pis.close(); // 关闭输入流
} catch (Exception e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
PipedStreamDemo demo = new PipedStreamDemo();
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream();
try {
pos.connect(pis);
// pis.connect(pos); 二选一即可
Producer producer = demo.new Producer(pos);
producer.start();
Consumer consumer = demo.new Consumer(pis);
consumer.start();
} catch (IOException e) {
e.printStackTrace();
} } }

其他的例子我就不一一列举,网上资料很多,或者直接看API,下面主要学习下NIO的知识。

JAVA I/O流 之入门的更多相关文章

  1. 从设计模式说起JAVA I/O流

    从设计模式说起JAVA I/O流 之前写过一篇I/O流的入门介绍,直到最近看了设计模式,顺带理下I/O流的设计思路. JAVA类库中的I/O类分成输入和输出两部分,通过继承,任何自InputStrea ...

  2. Java程序员的Golang入门指南(下)

    Java程序员的Golang入门指南(下) 4.高级特性 上面介绍的只是Golang的基本语法和特性,尽管像控制语句的条件不用圆括号.函数多返回值.switch-case默认break.函数闭包.集合 ...

  3. Java基础IO流(一)

    IO概念: 大多数应用程序都需要实现与设备之间的数据传输,例如键盘可以输入数据,显示器可以显示程序的运行结果等.在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象 ...

  4. 【转】输入/输出流 - 深入理解Java中的流 (Stream)

    基于流的数据读写,太抽象了,什么叫基于流,什么是流?Hadoop是Java语言写的,所以想理解好Hadoop的Streaming Data Access,还得从Java流机制入手.流机制也是JAVA及 ...

  5. 理解Java中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  6. Java Io 字符流

    Java Io 字符流包含: 1. InputStreamReader  它是由byte流解析为char流,并且按照给定的编码解析. 2. OutputStreamWrite  它是char流到byt ...

  7. mybatis oracle java.sql.SQLException: 流已被关闭问题

    /** * 按照页码取值(从current_page页开始,每页page_size条) * @param key * @param params * @param current_page * @pa ...

  8. Java IO包装流如何关闭?

      问题: (1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自动调用被包装的流的close()方吗? (2)如果按顺序关闭流,是从内层流到外层流关闭还是从外层到内存关闭? 问题(1)解释: ...

  9. java 笔记(4) —— java I/O 流、字节流、字符流

    Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...

随机推荐

  1. 【POJ3006】Dirichlet's Theorem on Arithmetic Progressions(素数筛法)

    简单的暴力筛法就可. #include <iostream> #include <cstring> #include <cmath> #include <cc ...

  2. python json基础学习01

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' import json #全称(javascript object  ...

  3. [转]laravel 4之视图及Responses

    http://dingjiannan.com/2013/laravel-responses/   laravel 4之视图及Responses 16 Aug 2013 Laravel的Response ...

  4. [HeadFirst-HTMLCSS学习笔记][第六章严格的HTML]

    远古 古老的html 4.01和XHTML 1.1 页面 必须用Doctype挑明,再html元素上面 html 4.01 <!DOCTYPE html PUBLIC "-//W3C/ ...

  5. asp.net 页面上传文件控件后台代码Request.Files获取不到

    今天开发中遇到页面文件上传控件选择了文件,而后台Request.Files.Count取值为0,之前开发中遇到过几次,老是忘掉,今天记下来. html: <input type="fi ...

  6. C#winform修改IP,dns

     /// 将IP,DNS设置为自动获取        ///        private void setDHCP()        {            string  _doscmd = & ...

  7. 原来真的不会用指针[*p++]

    Describe: 有2字节字符数据,需要转换成2字节的短整型,字符数据低字节在前. Analyse: 其实就是取一下数据,移位再或一下就好了,大伙都这样想的. Ex1: 假设tmp1就是短整型,p指 ...

  8. UIwebView的html字符串高度计算

    ) { webView = [[UIWebView alloc]initWithFrame:CGRectMake(, , DEVW-, webviewH)]; webView.delegate = s ...

  9. 使用log4net写自定义日志

    在使用log4net写Web服务器端日志的时候,通常需要一些自定义的参数,比如请求的url,method,以及用户名等等,而log4net中默认的Log接口只提供了很少的参数.    在网上找的其他的 ...

  10. hdu120118岁生日

    Problem Description Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所 ...