JAVA  I/O流阶段性小结

前提概要:

刚刚接触I/O流的时候是在学校听专业课老师讲课,老师讲的特别简单,当时以为老师讲得简单所以该知识点就不重要,再加上自己当时不怎么喜欢敲代码,所有就放在了一边,到了暑假自己系统学习了才发现I/0特别重要(虽然目前还没怎么应用),所以特地写一个小总结,如有不足之处还请各位大神指出,我定及时改正。

大纲图

1.字节流(InputStream)

功能

构造器参数及如何使用

ByteArrayInputStream

允许将内存的缓冲区当作InputStream使用

缓冲区,字节将从中取出,作为数据源:将其与FilterInputStreamD对象相连以提供有用接口

StringBufferInputStream

 

将String转换成InputStream

字符串,底层实现实际使用StringBuffer. 作为数据源:将其与FilterInputStreamD对象相连以提供有用接口

FileInputStream

 

用于从文件中读取信息

字符串,表示文件名,文件或FileDescriptor对象

作为数据源:将其与FilterInputStreamD对象相连以提供有用接口

PipeInputStream

产生用于写入相关PipedOutputStreamde数据,实现管道化概念

PipedOutputStream

作为多线程中的数据源:将其与FilterInputStreamD对象相连以提供有用接口

SequenceInputStream

 

将两个或多个InputStream对象转换成单一InputStream

 

两个InputStream对象或者一个容纳InputStream对象容器的Enumeration

FilterInputStream

 

抽象类,作为“装饰器”的接口

 

 

2.字节流(OutputStream)

功能

构造器参数及如何使用

ByteArrayOutputStream

在内存中创建缓冲区,所有送往“流”的数据都要放置在此缓冲区

缓冲区初始化尺寸,

用于指定数据的目的地:将其与FilterOutputStream对象相连以提供有用接口

FileOutputStream

 

用于将信息写至文件

字符串,表示文件名,文件或FileDescriptor对象

用于指定数据的目的地:将其与FilterOutputStream对象相连以提供有用接口

PipedOutputStream

任何写入其中的信息都会自动作为相关PipedInputStream的输出,实现管道化概念

PipedInputStream

指定用于多线程的数据的目的地:将其与FilterOutputStream对象相连以提供有用接口

FilterOutputStream

 

抽象类,作为“装饰器”的接口

 

 3.字符流(Reader)

 

 

 

4.字符流(Writer)

 

 

 

虽然说以上4个表列出了很多有关于I/O的知识点,但是有许多我目前还用不到,以后用到了会慢慢补上,接下来就一起来学习一下我们最常用的I/O流。直接上代码-.-

1.字节流读取文件内容

 

package ZIJIE;

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

public class FileInputstream 
{
public static void main(String[] args) throws IOException 
{
    FileInputStream fis=new FileInputStream("F:\\a.txt");
    int len=0;
    //read方法执行一次就会读取一次
    while((len=fis.read())!=-1)//-1代表文件末尾
    {
    System.out.println("读取的字节==========="+len);
    //len 是读取到的字节
    System.out.println((char)len);
}
    fis.close();
}
}

 

2.字节流写文件

 

package ZIJIE;

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

public class FileOutputStream 
{
public static void main(String[] args) throws IOException 
{
java.io.FileOutputStream fop=new java.io.FileOutputStream("F:\\io.txt");//创建文件,如果已经存在,则原文件会被覆盖
//fop.write(100);//文本存的是d,因为d的ASCLL码值为100
//fop.write(49);
//fop.write(48);
//fop.write(48);//一次写入一个字节 一共三次 写入100
//记事本中一个汉字占2个字节 字母和数字占一个字节
//写入字节数组
byte[]bytes={65,66,67,68};
//fop.write(bytes);
//写入部分字节数数组
//fop.write(bytes, 2, 2);//数据,起始偏移量,字节数
fop.write("Hello!!!你好啊".getBytes());
fop.close();
}
}

 

 

3.字符流读取文件

 

package ZIFU;

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

public class FileReaderDemon
{
public static void main(String[] args)throws IOException
{
    //FileReader 读取文本文件
    FileReader fr=new FileReader("C:/Users/ASUS/Desktop/java.txt");
    int len=0;
    len=fr.read();//读取单个字符
    //System.out.println((char)len);
    //读取字符数组
    char []a=new char[500];
    int lan=0;
    while((lan=fr.read(a))!=-1)
    {
        System.out.println("读取的字符数=============="+lan);
        System.out.print(new String(a,0,lan));
    }
    
}
}

 

4.字符流写文件

 

package ZIFU;

import java.io.FileWriter;
import java.io.IOException;
//实现字符的写入
public class FileWriterDemon1 
{
public static void main(String[] args)throws IOException 
{
    FileWriter fw=new FileWriter("F:\\a.txt");
    //写入单个字节
    /*fw.write(100);
    fw.flush();//必须刷新 否则无法写入
    fw.close();*/
    //写入字节数组
    char[] c={'s','2','p'};
    fw.write(c);
    fw.flush();
    
    //写入字符数组一部分,从1开始,写两个到文本中
    fw.write(c, 1, 2);
    fw.flush();
    //写入字符串
    String s="ABCDE";
    fw.write(s);
    fw.flush();

fw.write(s, 4, 1);
fw.flush();
    
}
}

 

对比以上代码可以看出,不管是字节流还是字符流,都是以最简单的方法read(),writer().为基础,可以写单个字节(字符),可以读单个字符(字节)。同样也可以读(写)字符(字节)数组。(使用流后要记得关闭)

5.用字符流实现简单的文本复制

 

package ZIFU;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileCopy
{
public static void main(String[] args) throws IOException
{
    //用字符流实现文本的复制
    FileReader fr=new FileReader("F:\\a.txt");
    FileWriter fw=new FileWriter("F:\\1.txt");
    int len=0;
    while((len=fr.read())!=-1)
    {
        fw.write(len);
        fw.flush();
    }
    fr.close();
    fw.close();
}
}

 

6.字节流实现复制功能

 

package ZIJIE;

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

public class Copy_1 {
public static void main(String[] args) {
    //用字节数组复制大文件
    FileInputStream fis=null;
    java.io.FileOutputStream fos=null;
    try
    {
        fis=new FileInputStream("文件");
        fos=new java.io.FileOutputStream("文件名");
        byte []data=new byte[1024];
        int len=0;
        while((len=fis.read(data))!=-1)
        {
            fos.write(data);
        }
    }
    catch(IOException ex)
    {
        
    }
}
}

 

字符流其实不仅仅可以实现文本文件的复制,还可以实现压缩文件,图片等文件的复制,具体实现方式就不一一列出,步骤和文本文件的复制差不多

7.缓冲流:简单来说,缓冲流能进一步提高数据的传输速度,其中提供的readline()方法,如果该方法的返回值为null时,就说明到达了文件末尾

 

package Buffered;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
//使用缓冲流能进一步提高数据传输效率
public class BufferedInputStreamDemon {
public static void main(String[] args)throws IOException 
{
    FileInputStream fis=new FileInputStream("F:\\gbk.txt");
    BufferedInputStream bis=new BufferedInputStream(fis);//缓冲流
    byte bytes[]=new byte[1024];
    int len=0;
    len=bis.read(bytes);
    System.out.println(new String(bytes, 0, len));
    bis.close();
}
}
package Buffered;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;

//特有功能:String readline()读取文本行 如果为空则会返回null
public class BufferedReaderDemon 
{
public static void main(String[] args)throws IOException
{
    BufferedReader br=new BufferedReader(new FileReader("F:\\buffer.txt"));
    String s=null;
    int num=0;
while((s=br.readLine())!=null)
{
    num++;
System.out.println("第"+num+"行:"+s);

}
br.close();
}
}

 

还有很多东西没学,目前正在一步一步探索中,以后各种博客会坚持更新,和广大编程爱好者共同进步。

posted on 2017-08-17 11:59  落地有声  阅读(153)  评论(0编辑  收藏  举报