黑马程序员——JAVA基础-I/O流学习笔记(一)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

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

  最近一直在自学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 }

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

时间: 2024-10-13 17:09:59

黑马程序员——JAVA基础-I/O流学习笔记(一)的相关文章

黑马程序员——java基础---I/O流

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.I/O流概述 概念:I/O流用来处理设备之间的数据传输.Java对数据的操作是通过流的方式,而操作流的对象都放在IO包中. 分类: 按操作数据分为:字符流与字节流. 按流向分为:输入流与输出流. IO流常用基类:        字符流的抽象基类:Reader——Writer        字节流的抽象基类:InputStream——OutputStream        注意:由这四个类派

黑马程序员——java基础---IO(input output)流字符流

黑马程序员——java基础---IO(input output)流字符流 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- io(input output)流特点: 1,io流用来处理数据之间的传输 2,java对数据的操作是通过流的方式: 3,java用于操作流的对象都在io包中: 4,流按操作数据分为两种:字节流和字符流: 5,流按流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

黑马程序员——java基础——反射

 黑马程序员--java基础--反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 反射 其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员. 反射就是把Java类中的各种成分映射成相应的java类. 简单说:反射技术可以对一个类进行解剖. 反射的基石-->Class类 1.java中的类是用来描述一类事物的共性,该类事物有什么属性,没有什么属性

黑马程序员——Java基础---io(上)

黑马程序员——Java基础---io(上) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java I/O系统负责处理程序的输入和输出,I/O类库位于java.io包中,它对各种常见的输入流和输出流进行了抽象.如果数据流中最小的数据单元是字节,那么称这种流为字节流:如果数据流

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象

黑马程序员——java基础——多线程

 黑马程序员--java基础--多线程 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行.一个进程中至少有一个线程. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量.

黑马程序员——java基础——内部类

 黑马程序员--java基础--内部类 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 内部类 如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象.这时,为了方便设计和访问,直接将A类定义在B类中.就可以了.A类就称为内部类.内部类可以直接访问外部类中的成员.而外部类想要访问内部类,必须要建立内部类的对象. 内部类的访问规则 1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有

黑马程序员——java基础——集合(Collection)

 黑马程序员--java基础--集合(Collection) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 集合框架的构成及分类,如下图: 1.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 2.数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的.数组中可以存储基本数据类型,集合只能存储对象. 3.