JAVA基础-I/O流学习笔记(一)

  第一次写博文,内心无比激动,成长在此开始!

  最近一直在自学java基础,看到I/O流这章了,先写下对I/O流的了解吧!

一、I/O流简介

  I/O是实现java编程输入和输出的基础,可以方便的将数据进行输入/输出操作。java把不同的输入/输出源(硬盘、文件、网络连接等)抽象的描述成“流”,由于流的存在,实现了不同输入/输出源之间的交换数据。

  java中关于流的操作的类都在java.io包中。

二、流的分类

  2.1按照流向

  按照流向来分,流分为输入流和输出流。

  输入流:从输入源向内存中输入数据。

  输出流:从内存中向输出源输出数据。

  此处的输入和输出是从程序运行时的内存来说的。

  输入流主要是以InpuStream和Reader作为基类,输出流主要以OutputStream和Writer作为基类,基类都为抽象类,无法直接建立对象。

  2.2按照操作数据

  按照操作数据来分,流分为字节流和字符流。字节流和字符流的用用法几乎一致。区别是操作的单元不同,字节流操作的是字节,字符流操作的是字符。

  字节流是以InputStream和OutputStream为基类,字符流是以Writer和Reader作为基类。

  2.3按照流的角色

  按照流的角色可以分为节点流和包装流。

  可以从一个具体的输入/输出源(硬盘、文件、网络连接等)读/写数据的流,称为节点流,使用节点流时,程序直接操作实际的数据源。

  包装流是对已存在的流进行包装,通过包装后的流实现对数据的读/写。

  (java包装流来包装节点流是一种典型的装饰者模式,通过使用包装流来包装不同的节点流)

三、InputStream和Reader

  先来介绍一下两个输入流基类。

InputSream中常用的方法:

int read(); 从输入流中读取数据的下一个字节

int read(byte[] b); 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
      int read(byte[] b,int off, int len); 将输入流中最多 len 个数据字节读入 b 数组中,放入数组b时,不是从数组起点开始,而是从off位置开始的,返回实际读取的字节数。

void close(); 关闭此输入流并释放与该流关联的所有系统资源。

Reader中常用的方法:

int read(); 从输入流中读取数据的下一个字符

int read(char[] c); 从输入流中读取一定数量的字符,并将其存储在缓冲区数组c中
      int read(char[] c,int off, int len); 将输入流中最多 len 个数据字符读入 c  数组中,放入数组c时,不是从数组起点开始,而是从off位置开始的,返回实际读取的字符数。

void close(); 关闭此输入流并释放与该流关联的所有系统资源。

对比可以看到InputStream和Reader所提供的功能基本一致。InputStream和Reader是抽象类,不能建立实例,下面是FileInputStream类来实现读取自身的效果。

 1 package it.study.io;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.IOException;
 6 
 7 public class InputStreamDemo {
 8     public static void main(String[] args) throws IOException{
 9         //创建文件目录
10         File f=new File("InputStreamDemo.java");
11         //建立文件输入流对象
12         FileInputStream in=new FileInputStream(f);
13         //建立缓冲数组
14         byte[] by=new byte[1024];
15         //用于保存实际读取的字节数
16         int l=0;        
17         while((l=in.read(by))!=-1)
18             //打印字节数组中写入的数据
19             System.out.print(new String(by,0,l));
20         //close()放在finally里会更加安全
21         in.close();
22     }
23 }

         

执行以上程序会产生读取自身的效果并且将此显示出来。

下面是用FileReader类实现。

 1 package it.study.io;
 2 
 3 import java.io.File;
 4 import java.io.FileReader;
 5 import java.io.IOException;
 6 
 7 public class ReaderDemo {
 8     public static void main(String[] args){
 9             //创建文件目录
10         File f=new File("ReaderDemo.java");
12         //如果在try中声明和赋值FileReader,则只在try中生效,即在try外面声明,内部赋值。
13         FileReader fr=null;
14         try{
15             fr=new FileReader(f);
16             
17             //建立字符数组
18             char[] ch=new char[64];
19             //实际有效的字符数
20             int l=0;
21             while((l=fr.read(ch))!=-1){
22                 System.out.print(new String(ch,0,l));
23                 
24             }
25             
26         }
27         catch(IOException i){
28             i.printStackTrace();
29             
30         }
31         finally{
32             //关闭流时需要进行判断该流是否为空,如果为空,进行close(),会报错。
33             if(null!=fr){
34                 try{
35                     fr.close();
36                 }
37                 catch(IOException i){
38                     i.printStackTrace();
39                 }
40             }
41             
42         }
43     }
44 }

 

四、OutputStream和Writer

OutputSteam中常用的方法:

void write(int b); 将指定的字节写入的输出流中

void write(byte[] b); 将指定的字节数组写入到输出流中

void write(byte[] b,int off,int len); 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流中。

void close();  关闭此输出流并释放与此流有关的所有系统资源。

Writer中常用的方法:

void write(int c); 写入单个字符

void write(String str); 将指定的字符串写入的输出流中

void wirte(String str,int off,int len); 将指定的字符串从偏移量off开始的len个字符写入到输出流中

void write(char[] b); 将指定的字符数组写入到输出流中

void write(char[] b,int off,int len); 将指定 char 数组中从偏移量 off 开始的 len 个字符写入此输出流中。

void close();  关闭此输出流并释放与此流有关的所有系统资源。

使用FileOutputStream类,将该自身复制到电脑d盘下的Demo.txt文件中。

 1 package it.study.io;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 
 7 public class OutputStreamDemo {
 8     public static void main(String[] args){
 9         FileOutputStream fos=null;
10         FileInputStream fis=null;
11         try{
12             //建立输入流对象
13             fis=new FileInputStream("OutputStreamDemo.java");
15             //建立输出流对象,将本文件复制到d盘下中,文件名为Demo.txt
16             fos=new FileOutputStream("D:\Demo.txt");
17             //建立缓冲字节数组
18             byte[] b=new byte[1024];
19             //实际的字节数量
20             int len=0;
21             while((len=fis.read(b))!=-1){
22                 
23                 //将字节数组的有效字节写入到Demo.txt中。
24                 fos.write(b,0,len);
25             }
26             
27         }
28         catch(IOException i){
29             i.printStackTrace();
30         }
31         finally{
32             
33             //关闭流对象
34             if(null!=fis){
35                 try{
36                     fis.close();
37                 }
38                 catch(IOException i){
39                     i.printStackTrace();
40                 }
41             }
42             if(null!=fos){
43                 try{
44                     fos.close();
45                 }
46                 catch(IOException i){
47                     i.printStackTrace();
48                 }
49             }
50             
51         }
52     }
53 }

下面使用FlieWriter来实现:

 1 import java.io.FileWriter;
 2 import java.io.IOException;
 3 
 4 public class WriterDemo {
 5 
 6     public static void main(String[] args)throws IOException {
 7         // TODO Auto-generated method stub
 8         FileReader fr=new FileReader("WriterDemo.java");
10         FileWriter fw=new FileWriter("D:\wirte.txt");
11         char[] c=new char[64];
12         int len=0;
13         while((len=fr.read(c))!=-1){
14             fw.write(c,0,len);
15             
16         }
17         fr.close();
18         fw.close();
19 
20     }
21 
22 }

这篇先写到这,下一篇将针对常用的包装流进行详细说明!

原文地址:https://www.cnblogs.com/chun2015/p/4925511.html