为进行数据的输入/输出操作,Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream)。

Stream是从起源(source)到接收(sink)的有序数据

java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能。

 

两种基本的流:输入流和输出流

输入流:只能从中读取字节数据,而不能向其写出数据

输出流:只能向其写字节数据,而不能从中读取数据

 

按照流所处理的数据类型划分,可以分为:

字节流:用于处理字节数据。

字符流:用于处理Unicode字符数据。

 

可以从/向一个特定的IO设备(如磁盘、网络)读/写数据的流,称为节点流。节点流也被称为低级流。

实现对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读/写功能的流,称为处理流。处理流也被称为高级流。

InputStream/OutputStream用于处理字节数据。它们读/写流的方式都是以字节为单位进行的。

§三个基本的read方法:

•int read():读取一个字节,并将它返回。

•int read(byte[] buffer):将数据读入一个字节数组,同时返回读取的字节数。

•int read(byte[] buffer, int offset, int length):将数据读入一个字节数组,放到数组的offset指定的位置开始,并用length来指定读取的最大字节数。

§  其它方法:

•void close():关闭流。

•int available():返回可以从中读取的字节数。

•long skip(long n):在输入流中跳过n个字节,将实际跳过的字节数返回。

•boolean markSupported():判断流是否支持标记功能。

•void mark(int readlimit):在支持标记的输入流的当前位置设置一个标记。

•void reset():返回到流的上一个标记。注意必须流支持标记功能。

 

低级InputStream类:

InputStream

ByteArrayInputStream

PipedInputStream

FileInputStream

 

高级InputStream类:

DataInputStream

BufferedInputStream

Demo1

package com.zgd;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Demo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            FileInputStream fis = new FileInputStream("D:/hello.txt");
            int c = fis.read();
            int a = fis.read();
            System.out.println((char)c);
            System.out.println((char)a);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

Demo2

package com.zgd;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Demo1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            FileInputStream fis = new FileInputStream("D:/hello.txt");
            int i = -1;
            while((i=fis.read())!=-1){
                //int c = fis.read();
                System.out.print((char)i);
            }
            fis.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

}
 

•通过FileInputStream从源文本文件中读出数据,然后通过FileOutputStream写入到另外一个文本文件中

三个基本的write方法:

void write(int c)

void write(byte[] buffer)

void write(byte[] buffer, int offset, int length)

  其它方法

void close()

void flush()

低级OutputStream

OutputStream

ByteArrayOutputStream

PipedOutputStream

高级OutputStream

DataOutputStream

BufferedOutputStream

Demo3

直接读一个字节很慢

package com.zgd;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo3 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //复制文件
        FileInputStream fis = null;
        FileOutputStream fos = null;
        
        try {
            fis = new FileInputStream("D://1.avi");
            fos = new FileOutputStream("D://2.avi");
            
            int i = 0;
            while((i=fis.read())!=-1){
                fos.write(i);
            }
            fis.close();
            fos.close();
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
 

Demo4

读1024个字节速度快

package com.zgd;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo4 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //复制文件
        FileInputStream fis = null;
        FileOutputStream fos = null;
        
        try {
            System.out.println(System.currentTimeMillis());
            fis = new FileInputStream("D://1.avi");
            fos = new FileOutputStream("D://2.avi");
            
            byte [] b = new byte[1024];
            int i = 0;
            while((i=fis.read(b))!=-1){
                //fos.write(b);
                fos.write(b,0,i);
            }
            fis.close();
            fos.close();
            System.out.println(System.currentTimeMillis());
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
 

Reader/Writer处理的是字符类型的数据。它处理流的方式是以字符为单位进行的。

Reader/Writer和InputStream/OutputStream一样,也分为节点流(低级流)和处理流(高级流)。

Reader和InputStream一样,用于从流中读取数据。它和InputStream的区别在于,InputStream以字节为单位操作流,而Reader以字符为单位操作流。

读取方法:

int read():用于从流中读出一个字符,并将它返回。

int read(char[] buffer):将从流中读出的字符放到字符数组buffer中,返回读出的字符数。

int read(char[] buffer,int offset,int length):将读出的字符放到字符数组的指定offset开始的空间,每次最多读出length个字符。

其他方法:

void close():关闭Reader流。

boolean ready():判断流是否已经准备好被读取。

skip(long n):跳过指定的n个字符。

boolean markSupported():和InputStream中的markSupported方法类似。

void mark(int readAheadLimit):和InputStream中的mark方法类似。

void reset():和InputStream中的reset方法类似。

 

低级Reader类:

CharArrayReader

StringReader

PipedReader

FileReader

 

 

高级Reader类

BufferedReader

InputStreamReader

LineNumberReader

Demo5

读取字符汉字

package com.zgd;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Demo5 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int c;
        try {
            FileReader fr = new FileReader("D:/hello.txt");
            
            while((c = fr.read())!=-1){
                
                System.out.print((char)c);
            }
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }

}
 

 

写入方法:

void write(int c):将参数c的低16位组成字符写入到流中。

void write(char[] buffer):将字符数组buffer中的字符写入到流中。

void write(char[] buffer, int offset, int length):将字符数组buffer中从offset开始的length个字符写入到流中。

void write(String string):将string字符串写入到流中。

void write(String string, int offset, int length):将字符string中从offset开始的length个字符写入到流中。

其他方法:

void close():和OutputStream的close方法类似。

void flush():和OutputStream的flush方法类似。

 

低级Writer类:

CharArrayWriter

StringWriter

PipedWriter

FileWriter

高级Writer类:

BufferedWriter

OutputStreamWriter

PrintWriter

Demo6

package com.zgd;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo6 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        try {
            System.out.println(System.currentTimeMillis());
            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;
            bis = new BufferedInputStream(new FileInputStream("D://1.avi"));
            bos = new BufferedOutputStream(new FileOutputStream("D://2.avi"));
            int i = 0;
            while((i= bis.read())!= -1){
                bos.write(i);
            }
            
            bos.flush();
            bis.close();
            bos.close();
            System.out.println(System.currentTimeMillis());
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

}
 

 

转载于:https://my.oschina.net/u/3696747/blog/1577231

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值