Java基础:阻塞式IO

转载请注明出处:jiq?钦‘s technical Blog

备注:阅读此文之前,建议先看我这篇博文了解阻塞式IO和非阻塞式IO的基本概念。

一、流(Stream)

1、字节流

输入(InputStream)


介质流


FileInputStream


从文件中读取信息


PipedInputStream


产生用于写入相关PipedOutputStream的数据,实现“管道化”概念


ByteArrayInputStream


允许将内存缓冲区当做InputStream使用


处理流


SequenceInputStream


将两个或多个InputStream转换为单个InputStream


ObjectInputStream


对象输入流


FilterInputStream子类


BufferedInputStream


防止每次读取时都进行实际写操作,代表“使用缓冲区”


DataInputStream


与DataOutputStream配合使用,可以按照可移植的方式从流读取基本数据类型(int、char、long等)


LineNumberInputStream


PushbackInputStream

输出(OutputStream)


介质流


FileOutputStream


用于将信息写至文件


PipedOutputStream


任何写入其中的信息都会自动作为相关PipedInputStream的输出,实现“管道化”概念


ByteArrayOutputStream


在内存中创建缓冲区,所有送往“流”的数据都放置在此缓冲区


处理流


ObjectOutputStream


对象输出流


FilterOutputStream子类


BufferedOutputStream


避免每次发送数据时都要进行实际的写操作,代表“使用缓冲区”


DataOutputStream


与DataInputStream配合使用,按照可移植的方式向流中写入基本类型数据(int、char、long等)


PrintStream


用于产生格式化输出,DataOutputStream处理数据的存储,PrintStream处理显示

2、字符流

输入(Reader)


介质流


FileReader


FileInputStream的对应


CharArrayReader


ByteArrayInputStream的对应


PipedReader


PipedInputStream的对应


处理流


BufferedReader


BufferedInputStream的对应


InputStreamReader


用于将InputStream转换为Reader

输出(Writer)


介质流


FileWriter


FileOuputStream的对应


CharArrayWriter


ByteArrayOutputStream的对应


PipedWriter


PipedOutputStream的对应


处理流


BufferedWriter


BufferedOutputStream的对应


OutputStreamWriter


用于将OutputStream转换为Writer

 

字节流与字符流:

(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作流。

(4)设计Reader/Writer继承层次主要是为了国际化,字节流仅支持8位的读写,不能很好处理16位的Unicode字符,java本身的char是16位的,添加字符流就是为了在所有IO操作中都支持Unicode。

建议:尽量尝试使用字符流,一旦无法满足需求,再考虑字节流!!!

 

装饰器设计模式(Decorator):

上面的流中,字节流和字符流各自内部的“处理流”可以包装其他“处理流”和“介质流”,而InputStreamReader和OutputStreamWriter可以包装字节流,提供了字节流到字符流的转换功能。

二、输入输出(IO)

1、文件IO

字节流:

public static void main(String[] args)throws IOException {
      String fileName="D:"+File.separator+"hello.txt";
      File f=new File(fileName);
      InputStream in=new FileInputStream(f);
      byte[] b=new byte[1024];
      int count =0;
      int temp=0;
      while((temp=in.read())!=(-1)){
          b[count++]=(byte)temp;
      }
      in.close();
      System.out.println(new String(b));
    }

字符流:

public static void main(String[] args)throws IOException {
      String fileName="D:"+File.separator+"hello.txt";
      File f=new File(fileName);
      char[] ch=new char[100];
      Reader read=new FileReader(f);
      int temp=0;
       int count=0;
      while((temp=read.read())!=(-1)){
          ch[count++]=(char)temp;
      }
      read.close();
      System.out.println("内容为"+new String(ch,0,count));
    }

2、内存IO

public static void main(Stringargs[])throws IOException {
         Stringstr = “Hello,jiyiqin”;
ByteArrayInputStreambInput = new ByteArrayInputStream(str.getBytes());
System.out.println("Convertingcharacters to Upper case " );
for(int y = 0 ;y < 1; y++ ) {
while(( c= bInput.read())!= -1) {
System.out.println(Character.toUpperCase((char)c));
}
bInput.reset();
}
}

3、管道IO

import java.io.InputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class PipedInputStreamTest {
   public static void main(String args[]) {
       PipedInputStream input = new PipedInputStream();
       PipedOutputStream output = new PipedOutputStream();
       try {
           output.connect(input);
           new Thread(new OutputstreamRunnable(output)).start();
           new Thread(new InputstreamRunnable(input)).start();
       } catch (Exception e) {
           e.printStackTrace();
       }
    }
}

//输出管道流线程
class OutputstreamRunnable implementsRunnable {
   private OutputStream out;
   public OutputstreamRunnable(OutputStream output) {
       this.out = output;
    }
   @Override
   public void run() {
       String str = "hello pipe";
       try {
           out.write(str.getBytes());
           out.flush();
           out.close();
       } catch (Exception e) {
           e.printStackTrace();
       }
    }
}

//输入管道流线程
class InputstreamRunnable implementsRunnable {
   private InputStream in;
   public InputstreamRunnable(InputStream in) {
       this.in = in;
    }
   @Override
   public void run() {
       byte[] bs = new byte[1024];
       int len = -1;
       try {
           if ((len = in.read(bs)) != -1) {
                System.out.println(newString(bs, 0, len));
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
    }
}

4、网络IO

即常说的Java套接字(Socket)编程,这是阻塞式的Java网络IO。

服务端代码

public class Server {
   public static void main(String args[]) throws IOException {
      int port = 8888;
      ServerSocket server = new ServerSocket(port);
      Socket socket = server.accept();
      Reader reader = new InputStreamReader(socket.getInputStream());
      char chars[] = new char[64];
      int len;
      StringBuilder sb = new StringBuilder();
      while ((len=reader.read(chars)) != -1) {
         sb.append(new String(chars, 0, len));
      }
      System.out.println("from client: " + sb);
      reader.close();
      socket.close();
      server.close();
   }
}  

 客户端代码

public class Client {
   public static void main(String args[]) throws Exception {
      String host = "127.0.0.1";
      int port = 8888;
      Socket client = new Socket(host, port);
      Writer writer = new OutputStreamWriter(client.getOutputStream());
      writer.write("Hello Server.");
      writer.flush();
      writer.close();
      client.close();
   }
}  

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-29 03:05:38

Java基础:阻塞式IO的相关文章

Java基础:非阻塞式IO

转载请注明出处:jiq?钦's technical Blog 引言 JDK1.4中引入了NIO,即New IO,目的在于提高IO速度.特别注意JavaNIO不完全是非阻塞式IO(No-Blocking IO),因为其中部分通道(如FileChannel)只能运行在阻塞模式下,而其他的通道可以在阻塞式和非阻塞式之间进行选择. 尽管这样,我们还是习惯将Java NIO看作是非阻塞式IO,而前面介绍的面向流(字节/字符)的IO类库则是非阻塞的,详细来看,两者区别如下: IO NIO 面向流(Strea

复习java基础第六天(IO)

一:File 类 • 输入:读取外部数据(磁盘.光盘等存储设备的数据)到程序(内存)中. • 输出:将程序(内存)数据输出到磁盘.光盘等存储设备中 • Java 的 IO 流主要包括输入.输出两种 IO 流,每种输入.输出流有可分为字节流和字符流两大类: – 字节流以字节为单位来处理输入.输出操作 – 字符流以字符为单位来处理输入.输出操作 注意:输入.输出是以程序为参照. • File 类代表与平台无关的文件和目录. • File  能新建.删除.重命名文件和目录,但 File 不能访问文件内

Java基础知识之IO(2)

文件复制小案例(温习Java基础知识之IO(1)中的知识) package copy; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class CopyDemo { public stat

3.6.2.阻塞式IO的困境

本节通过实例代码运行结果,让大家看到在并发式IO访问时非阻塞IO遭遇的困境,由此引入非阻塞式IO. 3.6.2.1.程序中读取键盘 include include include int main(void) { // 读取键盘 // 键盘就是标准输入,stdin char buf[100]; memset(buf, 0, sizeof(buf)); printf("before read.\n"); read(0, buf, 5); printf("读出的内容是:[%s].

Java基础梳理之-IO操作

回想最开始学习Java IO相关的操作时, 被各种Reader/Stream绕晕. 现在再回头梳理这一块的知识点,感觉清晰了很多. Java作为编程语言,大部分东西都是从系统层面带来的, 所以学习的知识点虽然在Java, 但是背后的答案却在操作系统层面. 首先理解核心概念:IO, 究竟什么是IO? 所谓IO就是内存与外设相关的数据传输.常用的外设有硬盘,网卡,打印机, 鼠标...我们接触最频繁的IO操作是硬盘上文件的读写,所以学习IO基本上都是以文件操作为例子.IO作为操作系统的核心,知识点相当

Java基础之(IO流)

简介: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. 一.File类 java.io.File类:文件和目录路径名的抽象表示形式,与平台无关 File ,能新建.删除.重命名文件和目录.但 File 不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流. File对象可以作为参数传递给流的构造函数 File类的常见构造方法: 1.public F

JAVA基础知识之IO——Java IO体系及常用类

Java IO体系 个人觉得可以用"字节流操作类和字符流操作类组成了Java IO体系"来高度概括Java IO体系. 借用几张网络图片来说明(图片来自 http://blog.csdn.net/zhangerqing/article/details/8466532 )  基于字节的IO操作 基于字符的IO操作   从上图可以看到,整个Java IO体系都是基于字符流(InputStream/OutputStream) 和 字节流(Reader/Writer)作为基类,根据不同的数据载

Java基础知识之IO(1)

IO中主要的类和接口 File.InputStream.OutputStream.Reader.Writer.Serialzable接口 File类 File类应用的小例子 import java.io.File; import java.io.IOException; public class FileDemo { public static void main(String[] args) { //指定文件路径和名称 String path = "D:"+File.separato

Java基础之文件IO

概述 Java 的 I/O 操作类在包 java.io 下,大概有将近 80 个类,但是这些类大概可以分成四组,分别是: 按处理数据类型来分:字节流和字符流: 基于字节操作的 I/O 接口:InputStream 和 OutputStream 基于字符操作的 I/O 接口:Writer 和 Reader 按传输数据的方式:磁盘操作和网络操作 基于磁盘操作的 I/O 接口:File 基于网络操作的 I/O 接口:Socket 按流的方向来分:输入流和输入流 要读的话就用输入流,要写的话,就用输出流