Java输出流
在抽象超类OutputStream中定义了三个重要的方法:write(),flush()和close()。write()方法将字节写入输出流。它有三个版本,允许我们一次写一个字节或多个字节。flush()方法用于将任何缓冲的字节刷新到数据宿。close()方法关闭输出流。要使用BufferedOutputStream装饰器以更好的速度写入文件,请使用以下语句:
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("your output file path"));
要将数据写入ByteArrayOutputStream,请使用
ByteArrayOutputStream baos = new ByteArrayOutputStream();baos.write(buffer); // buffer is a byte array
Java文件输出流
要写入文件,我们需要创建一个FileOutputStream类的对象,它将表示输出流。当写入文件时,如果文件不存在,Java会尝试创建文件。我们必须准备好处理这个异常,将代码放在try-catch块中,如果文件包含数据,数据将被擦除。为了保留现有数据并将新数据附加到文件,我们需要使用FileOutputStream类的另一个构造函数,它接受一个布尔标志,用于将新数据附加到文件。要将数据附加到文件,请在第二个参数中传递true,使用以下代码。
FileOutputStream fos = new FileOutputStream(destFile, true);
写数据
FileOutputStream类有一个重载的write()方法将数据写入文件。我们可以使用不同版本的方法一次写入一个字节或多个字节。通常,我们使用FileOutputStream写入二进制数据。要向输出流中写入诸如“Hello"的字符串,请将字符串转换为字节。String类有一个getBytes()方法,该方法返回表示字符串的字节数组。我们给FileOutputStream写一个字符串如下:
String text = "Hello";byte[] textBytes = text.getBytes();fos.write(textBytes);
我们需要使用flush()方法刷新输出流。刷新输出流指示如果任何写入的字节被缓冲,则。close()方法可能抛出一个IOException异常。如果我们希望自动关闭tit,请使用try-with-resources创建输出流。以下代码显示如何将字节写入文件输出流。它们可以被写入数据宿。关闭输出流类似于关闭输入流。我们需要使用close()方法关闭输出流
import java.io.File;import java.io.FileOutputStream;public class Main { public static void main(String[] args) { String destFile = "luci2.txt"; // Get the line separator for the current platform String lineSeparator = System.getProperty("line.separator"); String line1 = "test"; String line2 = "test1"; String line3 = "test2"; String line4 = "test3"; try (FileOutputStream fos = new FileOutputStream(destFile)) { fos.write(line1.getBytes()); fos.write(lineSeparator.getBytes()); fos.write(line2.getBytes()); fos.write(lineSeparator.getBytes()); fos.write(line3.getBytes()); fos.write(lineSeparator.getBytes()); fos.write(line4.getBytes()); // Flush the written bytes to the file fos.flush(); System.out.println("Text has been written to " + (new File(destFile)).getAbsolutePath()); } catch (Exception e2) { e2.printStackTrace(); } }}
Java打印流
PrintStream类是输出流的具体装饰器。PrintStream可以以合适的格式打印任何数据类型值,基本或对象。PrintStream可以将数据写入输出流不抛出IOException。如果一个方法抛出一个IOException,PrintStream设置一个内部标志,而不是抛出异常给调用者。可以使用其checkError()方法检查该标志,如果在方法执行期间发生IOException,则返回true。PrintStream具有自动刷新功能。我们可以在其构造函数中指定它应该自动刷新写入它的内容。如果我们将auto-flush标志设置为true,当写入一个字节数组时,PrintStream将刷新它的内容,它的一个重载的println()方法用于写入数据,一个换行符被写入,或一个字节(‘’)。
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数据输出流
DataOutputStream可以将Java基本数据类型值写入输出流。DataOutputStream类包含一个写入数据类型的写入方法。它支持使用writeUTF(String text)方法将字符串写入输出流。以下代码将一个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管道
管道连接输入流和输出流。
管道 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);
管道用于将数据从一个线程传输到另一个线程。两个线程之间的同步由阻塞读和写来处理。
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(); } }}