黑马程序员_java_IO流



------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


字符流和字节流

字节流两个基类:
 InputStream  OutputStream
字符流两个基类
 Reader  Writer

输入流和输出流对象的选择:
 1、明确源和目的
  源:输入流,InputStream Reader
  目的:输出流,OutputStream Writer
 2、操作的数据是否是纯文本。
  是:字符流
  不是:字节流
 3、当体系明确后,在明确要使用哪个体系中具体的对象
  通过设备来进行区分:
   源设备:内存,硬盘,键盘
   目的设备:内存,硬盘,控制台。

IO流 对数据的操作

/*
字符流:FilterWriterDemo文件对象的使用。
*/
import java.io.*;
class FilterWriterDemo
{
 public static void main(String[] args) throws IOException
 {
  //创建一个FilterWriter对象,该对象一被初始化就必须明确被操作的文件。
  //而且文件会被创建到指定目录下,果然该目录下已有重名,将会被覆盖。
  //其实该步骤就是明确文件要存放的目的地。
  FileWriter fw = new FileWriter("Java.txt");
  //调用write()方法,将字符写入流中。
  fw.write("java");
  //刷新对象中缓冲的数据。将数据转移到目的地中。
  fw.flush();

  fw.close();// 关闭流资源,但是关闭前刷新一次缓冲中的数据,将数据转移到目的地中。
  //和flush()的区别:flush刷新后,流可以继续使用,close刷新后,流不能继续使用。
 }
}



/*
缓冲区:BufferedWriter
 缓冲区的出现是为了提高流对象的操作效率
 所以在创建缓冲区的时候,一定先创建流对象。
 缓冲区提供一个跨平台的换行符:newLine();
*/
import java.io.*;
class BufferedWriterDemo
{
 public static void main(String[] args) throws IOException
 {
  //创建一个字符写入流对象
  FileWriter fw = new FileWriter("BufferedWriter.txt");
   //为了提高写入流的效率,加入缓冲区技术。
   //只要将需要被提高效率的流对象作为参数传给缓冲区的构造函数即可。
  BufferedWriter bw = new BufferedWriter(fw);

  for(int i=0;i<=10;i++)
  {
   bw.write("java"+i);
   bw.newLine();
   //只要用到缓冲区,一定要刷新。
   bw.flush();
  }
  //关闭缓冲区就是关闭流对象。所以不用fw.close();
  bw.close();
 }
}


/*
字符流读取缓冲区:BufferedReader
 提供一次读一行的方法readLine。返回null表示读到末尾。
*/

import java.io.*;

class BufferedReaderDemo
{
 public static void main(String[] args) throws IOException
 {
  //创建一个读取流对象并和文件相关联。
  FileReader fr = new FileReader("BufferedWriter.txt");
  //创建一个读取流缓冲区,并把读取流对象作为参数传到构造函数中。
  BufferedReader br = new BufferedReader(fr);

  String line = null;
  while((line = br.readLine())!=null)
  {
   System.out.println(line);
  }
 }
}
 

File类

File类中常见的方法:
 1,创建。
  boolean createNewFile();在指定位置创建文件,如果该文件存在,则不创建,返回     false,和输出流不一样。
  boolean makdir();创建文件夹。
  boolean makdirs();创建多级文件夹。
 2,删除
  boolean delete();删除失败返回false,如果文件正在被运行,删除不成功,也返回    false
  void deleteOnExit();在程序退出时,删除指定文件。
 3,判断。
  boolean exists();文件是否存在。
  boolean isFile();isDirectory();isHidden();isAbsolute();
 4,获取信息。
  getName(); getPath(); getParent();
  getAbsolutePath(); lastModified();  length();
  
IO包中的其他的包装类。
一、
 打印流:PrintWriter和PrintStream  
  可以直接操作输入流和文件。
 序列流:SequenceInputStream
  对多个流进行操作。
 操作对象:ObjectInputStream和ObjectOutputStream
  被操作的对象需要实现Serializable(标记接口)
 管道流:
  PipedInputStream 和 PipedOutputStream
  输入输出可以直接进行连接,通过结合线程使用。
/*
管道流结合线程的使用演示。

*/
import java.io.*;
class Read implements Runnable
{
 private PipedInputStream in;
 Read(PipedInputStream in)
 {
  this.in= in;
 }
 public void run()
 {
  try
  {
   
   byte [] buf = new byte[1024];
   System.out.println("读取前,没有数据,阻塞");
   int len = in.read(buf);
   System.out.println("读到数据,阻塞结束");
   String s = new String(buf,0,len);
   System.out.println(s);
   in.close();

  }
  catch (IOException e)
  {
   throw new RuntimeException("读取流失败");
  }
 }
}

class Write implements Runnable
{
 private PipedOutputStream out;
 Write(PipedOutputStream out)
 {
  this.out= out;
 }
  
 public void run()
 {
  try
  { System.out.println("开始写入数据,等待6秒!");
   Thread.sleep(6000);
   out.write("写入流开始".getBytes());
   out.close();
  }
  catch (Exception e)
  {
   throw new RuntimeException("写入流失败");
  }
  
 }


}
class PipedStream
{
 public static void main(String[] args) throws IOException
 {
  PipedInputStream in = new PipedInputStream();
  PipedOutputStream out = new PipedOutputStream();
  in.connect(out);
  Read r = new Read(in);
  Write w = new Write(out);
  new Thread(r).start();
  new Thread(w).start();
 }
}

二、
 RandomAccessFile:
  随机访问文件,自身具备读写方法。通过skipBytes(int x),seek(int x)来达到随机访问
 该类不算是IO体系的子类。而是直接继承自Object
 但是它是IO包中的成员,因为它具备读和写的功能。
 内部封装了一个数组,而且通过指针对数组的元素进行操作。
 可以通过 getFilePointer获取指针位置,同时可以通过seek改变指针的位置。
 完成读写的原理就是内部封装了字节输入流和输出流。
 该类只能操作文件。而且操作文件还有模式:只读r,读写 rw等。
 如果该模式为只读人r,不会创建文件,会去读取一个已存在文件,如果该文件不存在,则出异常
 如果模式为rw,操作的文件不存在,会自动创建,如果存在则不会覆盖。
三、
 曹操基本的数据类型。
  DataInputStream 和 DataOutputStream
 操作字节数组
  ByteArrayInputStream  和 ByteArrayOutputStream
  用于操作字节数组的流对象
  ByteArrayInputStream:在构造的时候,需要接受数据源,而且数据源是一个字节数组
  ByteArrayOutputStream: 在构造的时候,不需要定义数据目的,因为该对象内部封装了
     可变长度的字节数组。
     这个两个流对象都操作数组,并没有使用系统资源。不用     close关闭资源
  源设备:
   键盘:System.in  硬盘:FileStream   内存:ArrayStream
  目的设备:控制台:System.out  硬盘:FileStream 内存:ArrayStream
 操作字符数组
  CharArrayInputStream  和 CharArrayOutputStream
 操作字符串
  StringReader 和 StringWriter
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值