黑马程序员——JAVA语言加强部分——IO流

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

概述:

    IO的操作主要涉及到设备,常见的输入设备有:内存,硬盘。键盘;输出设备有:内存,硬盘,控制台。

    IO主要分为:

1、缓冲流:

  • BufferedInputStream :BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。
  • BufferedOutputStream:该类实现缓冲的输出流。
  • BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
  • BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

   总结:

  • BufferWriter类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。
  • 缓冲流提高了读写效率。
  • BufferInputStream类中有个方法要慎用。即available() 返回可以从此输入流读取(或跳过)、且不受此输入流接下来的方法调用阻塞的估计字节数。当文件大小不是很大的时候可以使用,但是文件如果很大,我们用这个获取的结果来新建字节数组的时候,有可能会造成内存溢出。
  • 在执行write操作后要进行刷新操作flush(),才能看到文件上的数据。
  • 在执行read操作的时候,要注意读到文件的末尾的时候会返回-1。
  • 创建缓冲区之前要先创建流对象。
  • 缓冲区关闭,也关闭了缓冲区中的流对象。
  • BufferedReader 类中的readLine()方法,是按照行来读取的,当读取到末尾的时候,返回null

2、数组流

ByteArrayInputStream :ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。

    字节数组——》流

ByteArrayOutputStream :此类实现了一个输出流,其中的数据被写入一个 byte 数组。

    流——》字节数组

CharArrayReader: 此类实现一个可用作字符输入流的字符缓冲区。

    字符数组——》流

CharArrayWriter: 此类实现一个可用作 Writer 的字符缓冲区。

    流——》字符数组

StringReader 其源为一个字符串的字符流。

    字符串——》流

StringWriter 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。

    流——》字符串

  总结:

  • 数组流是以流的思想来操作数组
  • 字节数组流和字符数组流、字符串流都不涉及文件即硬盘操作,是跟内存打交道的,故即使执行close()操作也无效。
  • 在write方法操作中既可以写到数组中,也可以写到输出流writeTo中
  • ByteArrayOutputStream ,CharArrayWriter,StringWriter他们的底层已经封装了可以可变的数组或字符串,即他们本身也可以代表可变的数组或字符串。

3、数据流

DataInputStream 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。

   流——》基本数据类型

DataOutputStream 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。

  基本数据类型——》流中

   总结:

  • 数据流是用来操作一些基本数据的。
  • 这两个流在网络编程中比较常用。

4、文件

      File 文件和目录路径名的抽象表示形式。

      涉及的方法有:

创建:

文件创建:

boolean createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。

static File createTempFile(String prefix, String suffix) 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。

static File createTempFile(String prefix, String suffix, File directory) 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。

目录创建:

boolean mkdir() 创建此抽象路径名指定的目录。

boolean mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。

删除:delete()如果此路径名表示一个目录,则该目录必须为空才能删除

获取:get**();

   总结:

  • 该类下有四个字段用来获取路径分割符和名称分割符,如static String pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串;static char pathSeparatorChar 与系统有关的路径分隔符;static String separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串;static char separatorChar 与系统有关的默认名称分隔符。
  • File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。
  • 该类的中的方法mkdir()方法只能创建单级目录,如果要创建多级目录需要用方法mkdirs(),另外,如果目录存在,该创建操作会返回false,不会再创建覆盖。

5、字节流和字符流

FileInputStream FileInputStream 从文件系统中的某个文件中获得输入字节。

文件——》字节

FileOutputStream 文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。

字节——》文件

FileReader 用来读取字符文件的便捷类。

文件——》字符

FileWriter 用来写入字符文件的便捷类。

字符——》文件

   总结:

  • 执行写操作的时候要刷新;
  • 提高字节流和字符流的读写操作是使用缓冲流;
  • 文件是放在硬盘上的。
  • FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,则使用 FileWriter。

6、转换流

InputStreamReader: InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。

字节流——》字符流

OutputStreamWriter: OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。

字符流——》字节流

     LineNumberReader :跟踪行号的缓冲字符输入流。

   总结:

  • 它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
  • 转换流常用在文件之间的编码转换中。例如我们从键盘上输入数据,实际上是一个字节向字符转换的过程。
  • 类中的read() 方法会导致从底层输入流读取一个或多个字节。要提高效率需要结合缓冲流来使用

7、对象流

ObjectInputStream :ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

文件——》对象

ObjectOutputStream: ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。

对象——》文件

    总结:

  • 对象流操作即把堆中对象放入文件中,即硬盘上,也可以让对象在网络中传输。
  • 对象放在硬盘上,对象一定的要序列化,序列化就是对象所属的类要实现Serializable接口,该接口是一个标记接口。没有功能需要实现,序列号就是根据类中的成员的算出来的,所以,如果再修改类的话,会产生BUG,解决办法是:在对象所属的类中添加静态字段成员 ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

8、管道流

PipedInputStream 管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。
PipedOutputStream 可以将管道输出流连接到管道输入流来创建通信管道。
PipedReader 传送的字符输入流。
PipedWriter 传送的字符输出流。

   总结:

  • 管道流的使用要使用新城,且输入流和输出流要连接结合使用。管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常,数据由某个线程从 PipedInputStream 对象读取,并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程,因为这样可能死锁线程。管道输入流包含一个缓冲区,可在缓冲区限定的范围内将读操作和写操作分离开。 如果向连接管道输出流提供数据字节的线程不再存在,则认为该管道已损坏。
  • 连接方法:一、在构造函数节点:PipedInputStream类构造函数中传入PipedOutputStream 类的实例对象,PipedOutputStream类构造函数中传入PipedInputStream类的实例对象
  •          二、调用Connect(参数)方法

9、输出流

PrintStream PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

PrintWriter 向文本输出流打印对象的格式化表示形式。

    总结:

只能输出,不能读取。

10、随机访问流

RandomAccessFile 此类的实例支持对随机访问文件的读取和写入。

迅雷的多点下载便是运用的此原理。

11、合并流

     SequenceInputStream SequenceInputStream 表示其他输入流的逻辑串联


参考代码:

 //文件目录操作	
	File file=new File("G:"+File.separator+"myFile"+File.separator+"oneDay"+File.separator+"1.txt");//创建File实例
	System.out.println(file.mkdir());//创建此抽象名指定的目录。当且仅当已创建目录时,返回 true;否则返回 false
	System.out.println(file.mkdirs());//创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。
	System.out.println("路径名是:"+file.getAbsolutePath());//获取目录路径
	String[] stra=file.list();//获取file所制定的目录中文件有哪些,包括文件和文件夹
	System.out.println(file.getParentFile());//获取父目录路径
	
	
	//字节流操作
	FileOutputStream fos=new FileOutputStream("G://myfile//1.txt",true);//传入参数string,   创建一个向具有指定名称的文件中写入数据的输出文件流。
	fos.write(97);//向文件中写入字节97
	fos.close();
	FileInputStream fis=new FileInputStream("G://myfile//1.txt");// 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定
	int b;
	System.out.println("G://myfile//1.txt的文件中存入的数据是:");
	//读取文件中的数据
	while((b=fis.read())!=-1){
		System.out.println(b);
	}
	
	//字符流操作
	FileWriter fw=new FileWriter("G://myfile//2.txt",true);//向文件2.txt中末尾写入数据,如果第二个参数不是true,则文件会覆盖
	fw.write("abcds");
	fw.close();
	FileReader fr=new FileReader("G://myfile//2.txt");//读取文件2.txt中的数据
	int b1;
	System.out.println("G://myfile//2.txt的文件中存入的数据是:");
	while((b1=fr.read())!=-1){
		System.out.print((char)b1);
	}
	/*运行结果是:
G://myfile//1.txt的文件中存入的数据是:
97
G://myfile//2.txt的文件中存入的数据是:
abcds*/
	



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值