Java IO教程 - Java数据输入流
DataInputStream可以从输入流中读取Java基本数据类型值。
DataInputStream类包含读取数据类型值的读取方法。例如,要读取int值,它包含一个readInt()方法;读取char值,它有一个readChar()方法等。它还支持使用readUTF()方法读取字符串。
例子
以下代码显示了如何从文件读取原始值和字符串。
import java.io.DataInputStream; import java.io.FileInputStream; public class Main { public static void main(String[] args) { String srcFile = "primitives.dat"; try (DataInputStream dis = new DataInputStream(new FileInputStream(srcFile))) { // Read the data in the same order they were written int intValue = dis.readInt(); double doubleValue = dis.readDouble(); boolean booleanValue = dis.readBoolean(); String msg = dis.readUTF(); System.out.println(intValue); System.out.println(doubleValue); System.out.println(booleanValue); System.out.println(msg); } catch (Exception e) { e.printStackTrace(); } } }
上面的代码生成以下结果:
java.io.FileNotFoundException: primitives.dat (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at java.io.FileInputStream.<init>(FileInputStream.java:101)
at file.main(file.java:8)
Java IO教程 - 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 IO教程 - Java文件输出流
创建输出流
要写入文件,我们需要创建一个FileOutputStream类的对象,它将表示输出流。
// Create a file output stream String destFile = "test.txt"; FileOutputStream fos = new FileOutputStream(destFile);
当写入文件时,如果文件不存在,Java会尝试创建文件。我们必须准备好处理这个异常,将代码放在try-catch块中,如下所示:
try { FileOutputStream fos = new FileOutputStream(srcFile); }catch (FileNotFoundException e){ // Error handling code goes here }
如果文件包含数据,数据将被擦除。为了保留现有数据并将新数据附加到文件,我们需要使用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);
要插入一个新行,使用line.separator系统变量如下。
String lineSeparator = System.getProperty("line.separator"); fos.write(lineSeparator.getBytes());
我们需要使用flush()方法刷新输出流。
fos.flush();
刷新输出流指示如果任何写入的字节被缓冲,则它们可以被写入数据宿。
关闭输出流类似于关闭输入流。我们需要使用close()方法关闭输出流。
// Close the output stream fos.close();
close()方法可能抛出一个IOException异常。如果我们希望自动关闭tit,请使用try-with-resources创建输出流。
以下代码显示如何将字节写入文件输出流。
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(); } } }
上面的代码生成以下结果。