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 }
这篇先写到这,下一篇将针对常用的包装流进行详细说明!