黑马程序员-JAVA学习第7课-节点流

这节课的内容:

理解流概念

InputStream与OutputStream类

FileInputStream 与FileOutputStream类

Reader与Writer类

PipedInputStream与PipedOutputStream类

 

 

流是字节序列的抽象概念。流是指数据传输时的形态。分为节点流和过滤流。

 

InputStream类

 

InputStream类的方法

int read() //从输入流中读取一个字节的内容,以int形式返回,如果流结束就返回-1,如果没结束,却又没数据,就会阻塞程序。

 

int read(byte[] b)//返回实际读取的个数。当一个也读不到的时候程序也会阻塞 。

 

int read(byte[] b,int off,int len) 返回实际读入的字节数,可以读len长度个。

long skip(long n) 跳过N字节,返回实际跳过的数据数。用于包装类

 

int available()返回当前输入流中可读字节数。

void mark(int readlimit) 在输入流中建立一个标记,从标记位置开始最多还能读取多少内容。

void reset() 和mark方法配合使用。

boolean markSupported()返回当前流对象是否支持mark和reset操作

 

void close() 关闭流对象,释放相关资源。

 

 

 

OutputStream类

程序可以向其中连续写入字节的对象叫输出流,在JAVA中用OutputStream类来描述所有输出流的抽象概念。

 

void write(int b) 写入最低字节内容,最高字节内容扔掉。

void write(byte[]b) 将字节数组b的内容全部写到输出流中

void write(byte[]b,int off,int len)

void flush()清空输出所有内容

void close()关闭输出流对象

 

 

FileInputStream与FileOutputStream类

 

它们分别用来创建磁盘文件输入流和输出流对象

创建FileInputStream实例时,指定的文件应当是存在且可读的,创建FileOutputStream实例时,文件如果已经存在,原内容则将被覆盖。

 

对同一个磁盘文件创建FileInputStream对象有两种方式。

(1)FileInputStream inOne=new FileInputStream("hello.test");

(2)File f=new File("hello.test");

     FileInputStream inTwo=new FileInputStream(f);

创建FileOutputStream实例时,可以指定不存在的文件名,但不能指定已被其它程序打开了的文件。

 

 

编程举例:用FileOutputStream类向文件中写一个字符串,然后用FileInputStream读出内容。

 

import java.io.*;
public class FileStream {
 public static void main(String[] args) throws Exception
 {
  FileOutputStream out=new FileOutputStream("hello.txt");
  out.write("www.it315.org".getBytes());
  out.close();
  
  File f=new File("hello.txt");
  FileInputStream in=new FileInputStream(f);
  
  byte[] buf=new byte[1024];
  int len=in.read(buf);
  
  System.out.println(new String(buf,0,len));
  
  
 }
}
//===========================================

Reader与Writer类

Reader和Writer是对所有字符流类的抽象基类。用于简化字符串的输入输出编程。

 

编程举例:用FileWriter类向文件中写入一个串字符,再用FileReader读出写入的内容。

import java.io.*;
public class FileStream2
{
 
 /**
  * Method main
  *
  *
  * @param args
  *
  */
 public static void main(String[] args) throws Exception
 {
  // TODO: 在这添加你的代码
  
  FileWriter out=new FileWriter("hello2.txt");
  out.write("www.it315.org");
  out.close(); //关闭的时候才会将内容写入到文件。
  char[] buf=new char[1024];
  FileReader in=new FileReader("hello2.txt");
  int len=in.read(buf);
  System.out.println(new String(buf,0,len));
  in.close();
 } 
}
//====================================

 

PipedInputStream类与PipedOutputStream类

用于在应用程序中创建管道通信。主要用于线程之间的通信。

 

编程实例:

 

Sender.java

import java.io.*;
public class Sender extends Thread {
 private PipedOutputStream out=new PipedOutputStream();
 public PipedOutputStream getOutputStream()
 {
  return out;
 }
 public void run()
 {
  String strInfo=new String("hello,receiver!");
  try{
  
  out.write(strInfo.getBytes());
  out.close();
  }catch(Exception e)
  {
   e.printStackTrace();
  }
 }
}
//=====================

Receiver.java

import java.io.*;
public class Receiver extends Thread {
 private PipedInputStream in=new PipedInputStream();
 public PipedInputStream getInputStream()
 {
  return in;
 }
 public void run()
 {
 
  byte[] buf=new byte[1024];
  try{
  
   int len=in.read(buf);
   System.out.println("the following message comes form sender:/n"+
    new String(buf,0,len));
   in.close();
  }catch(Exception e)
  {
   e.printStackTrace();
  }
 }
}
//=======================

PipedStreamTest.java

import java.io.*;
public class PipedStreamTest {
 
 /**
  * Method main
  *
  *
  * @param args
  *
  */
 public static void main(String[] args) throws Exception {
  // TODO: 在这添加你的代码
  Sender t1=new Sender();
  Receiver t2=new Receiver();
  
  PipedOutputStream out=t1.getOutputStream();
  PipedInputStream in=t2.getInputStream();
  
  out.connect(in);
  
  t1.start();
  t2.start();
  
 } 
}

 

ByteArrayInputStream与ByteArrayOutputStream类

 

这两个类用于IO流的方式来完成对字节数组内容的读写,从而实现内存虚拟文件或者内存映像文件的功能。

 

编程举例,把输入流中的英文字母变成大写字母,再写到输出流中。

 

 

 

import java.io.*;
public class ByteArrayTest {
 
 /**
  * Method main
  *
  *
  * @param args
  *
  */
 public static void main(String[] args) {
  // TODO: 在这添加你的代码
  
  String tmp="abcdefghijklmnopqrstuvwxyz";
  byte[] src=tmp.getBytes();
  ByteArrayInputStream input=new ByteArrayInputStream(src);
  ByteArrayOutputStream output=new ByteArrayOutputStream();
  transform(input,output);
  byte[] result=output.toByteArray();
  System.out.println(new String(result));
  
 } 
 
 public static void transform(InputStream in,OutputStream out)
 {
  
  int ch=0;
  try{
   while((ch=in.read())!=-1)
   {
   
   
    int upperCh=(int)Character.toUpperCase((char)ch);
    out.write(upperCh);
   
   }
  }catch(Exception e)  {
   e.printStackTrace();
  
   }
 }
}

重视IO程序代码的复用

System.in 连接到键盘,是InputStream类型的实例对象。System.out连接到显示器,是PrintStream类的实例对象。

 

不管各种底层物理设备用什么方式实现数据终止点,InputStream的read方法总是返回-1表示输入流结束。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值