第一百六十一节 Java IO教程 - Java打印流、数据输出流、Java管道

Java IO教程 - Java打印流

PrintStream类是输出流的具体装饰器。

PrintStream可以以合适的格式打印任何数据类型值,基本或对象。

PrintStream可以将数据写入输出流不抛出IOException。

如果一个方法抛出一个IOException,PrintStream设置一个内部标志,而不是抛出异常给调用者。可以使用其checkError()方法检查该标志,如果在方法执行期间发生IOException,则返回true。

PrintStream具有自动刷新功能。我们可以在其构造函数中指定它应该自动刷新写入它的内容。

如果我们将auto-flush标志设置为true,当写入一个字节数组时,PrintStream将刷新它的内容,它的一个重载的println()方法用于写入数据,一个换行符被写入,或一个字节(‘\n’)。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class Main {
  public static void main(String[] args) {
    String destFile = "luci3.txt";

    try (PrintStream ps = new PrintStream(destFile)) {
      ps.println("test");
      ps.println("test1");
      ps.println("test2");
      ps.print("test3");

      // flush the print stream
      ps.flush();

      System.out.println("Text has  been  written to "
          + (new File(destFile).getAbsolutePath()));
    } catch (FileNotFoundException e1) {
      e1.printStackTrace();
    }
  }
}

上面的代码生成以下结果。

Java IO教程 - Java数据输出流

DataOutputStream可以将Java基本数据类型值写入输出流。

DataOutputStream类包含一个写入数据类型的写入方法。它支持使用writeUTF(String text)方法将字符串写入输出流。

要将Java原始数据类型值写入名为primitives.dat的文件,我们将按如下所示构造DataOutputStream的对象:

DataOutputStream dos  = new DataOutputStream(new FileOutputStream("primitives.dat"));

例子

以下代码将一个int值,一个double值,一个布尔值和一个字符串写入名为primitives.dat的文件。

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;

public class Main {
  public static void main(String[] args) {
    String destFile = "primitives.dat";

    try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(
        destFile))) {
      dos.writeInt(765);
      dos.writeDouble(6789.50);
      dos.writeBoolean(true);
      dos.writeUTF("Java Input/Output  is cool!");

      dos.flush();

      System.out.println("Data has  been  written to "
          + (new File(destFile)).getAbsolutePath());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

上面的代码生成以下结果。


 

Java IO教程 - Java管道

管道连接输入流和输出流。

管道 I/O基于生产者 - 消费者模式,其中生产者产生数据并且消费者消费数据。

在管道 I/O中,我们创建两个流代表管道的两端。 PipedOutputStream对象表示一端,PipedInputStream对象表示另一端。我们使用两个对象上的connect()方法连接两端。

我们还可以通过在创建另一个对象时将一个对象传递给构造函数来连接它们。

以下代码显示了创建和连接管道两端的两种方法:

第一种方法创建管道输入和输出流并连接它们。它使用connect方法连接两个流。

PipedInputStream pis  = new PipedInputStream(); 
PipedOutputStream pos  = new PipedOutputStream(); 
pis.connect(pos); /* Connect  the   two  ends  */

第二种方法创建管道输入和输出流并连接它们。它通过将输入管道流传递到输出流构造器来连接两个流。

PipedInputStream pis  = new PipedInputStream(); 
PipedOutputStream pos  = new PipedOutputStream(pis);

我们可以在连接管道的两端后生成和使用数据。

我们通过使用PipedOutputStream对象的一个​​write()方法产生数据。无论我们对管道输出流写入什么,自动变得可用于管道输入流对象进行读取。

我们使用PipedInputStream的read()方法从管道读取数据。如果数据在尝试从管道读取时不可用,则管道输入流被阻止。

管道流具有固定容量的缓冲器,以在写入管道和从管道读取之间存储数据。

我们可以设置管道容量,当我们创建它。如果管道的缓冲区已满,则尝试在管道上写入将被阻止。

以下代码创建缓冲区容量为2048字节的管道输入和输出流。

PipedOutputStream pos  = new PipedOutputStream(); 
PipedInputStream pis  = new PipedInputStream(pos, 2048);

管道用于将数据从一个线程传输到另一个线程。两个线程之间的同步由阻塞读和写来处理。

例子

以下代码演示了如何使用管道 I/O。

import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class Main {
  public static void main(String[] args) throws Exception {
    PipedInputStream pis = new PipedInputStream();
    PipedOutputStream pos = new PipedOutputStream();
    pos.connect(pis);

    Runnable producer = () -> produceData(pos);
    Runnable consumer = () -> consumeData(pis);
    new Thread(producer).start();
    new Thread(consumer).start();
  }

  public static void produceData(PipedOutputStream pos) {
    try {
      for (int i = 1; i <= 50; i++) {
        pos.write((byte) i);
        pos.flush();
        System.out.println("Writing: " + i);
        Thread.sleep(500);
      }
      pos.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public static void consumeData(PipedInputStream pis) {
    try {
      int num = -1;
      while ((num = pis.read()) != -1) {
        System.out.println("Reading: " + num);
      }
      pis.close();
    } catch (Exception e) {
      e.printStackTrace();
    }

  }
}

上面的代码生成以下结果。


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值