Java I/O输入输出流

时间:2023-02-26 16:43:27

流是有序的数据序列,根据操作类型,分为输入流和输出流。I/O(Input/Output)流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。虽然I/O流经常与磁盘文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口等。
字节流和字符流的区别,汉字在文件中占两个字节,如果使用字节流,读取不好可能会出现乱码现象。此时用字符流可以避免这种现象。

输入流:InputStream(字节输入流)&Reader(字符输入流)

InputStream->FileInputStream
Reader->InputStreamReader->FileReader
Reader->BufferedReader

InputSteam常用方法
read()从输入流中读取数据的下一个字节,如果到达末尾则返回-1
read(byte[])
mark(int)在输入流的当前位置放置一个标记,readLimit参数告知此输入流在标记位置失效之前允许读取的字节数
reset()将输入指针返回到当前所做的标记处
skip(long)跳过输入流上的n个字节并返回实际跳过的字节数
markSupported()如果当前流支持mark()/reset()操作就返回true
close()

输出流:OutputStream(字节输出流)&Writer(字符输出流)

OutputStream->FileOutputStream
Writer->OutputStreamWriter->FileWriter
Writer->BufferedWriter

常用方法
write(int)
write(byte[])
write(byte[],int,int)
flush()
close()

File类常用方法

new File(String), new File(String, String)
getName(), getAbsolutePath()
canRead(),canWrite()
exist(), delete(), createNewFile()
length()
getParent()
isFile(), isDirectory()
isHidden()
lastModified()

FileInputStream & FileOutputStream

FileInputStream(String), FileOutputStream(String) //可以指定不存在的文件名,但此文件不能是一个已被其他程序打开的文件
FileInputStream(File), FileOutputStream(File)

输出到文件
FileOutputStream out = new FileOutputStream(file);
byte[] content = “我有一头小毛驴,我从来也不骑”.getBytes();
out.write(content);
out.close();

从文件输入
FileInputStream in = new FileInputStream(file);
byte[] b = new byte[1024];
int len = in.read(byt);
System.out.println(“文件中的信息是:\n” + new String(b, 0 ,len));
in.close();

FileReader & FileWriter

汉字在文件中占两个字节,如果使用字节流,读取不好可能会出现乱码现象。此时用字符流可以避免这种现象

输出到文件
FileWriter out = new FileWriter(file);
String s = jTextArea.getText();
out.write(s);
out.close();

从文件输入
FileReader流顺序的读取文件,只要不关闭流,每次调用read()方法就顺序的读取源中的其余的内容,直到源的末尾或流被关闭。
FileReader in = new FileReader(file);
char[] byt = new char[1024];
int len = in.read(byt);
jTextArea.setText(new String(byt, 0, len));
in.close();

带缓存的输入输出流

缓存可以说是I/O的一种性能优化,缓存流为I/O流增加了内存缓存区。有了缓存区,使得在流上执行skip(), mark(), reset()方法都成为可能。

BufferedInputStream & BufferedOutputStream

BufferedInputStream类可以对任何的InputStream类进行带缓存区的包装以达到性能的优化。
BufferedInputStream(InputStream in)创建一个带32个字节的缓存流
BufferedInputStream(InputStream in, int size)构造函数按指定大小来创建缓存区

使用BufferedOutputStream输出信息和往OutputStream输出信息完全一样,只不过BufferedOutputStream有一个flush()方法来将缓存区的数据强制输出完。
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out, int size)

flush()方法就是用于即使缓存区没有满的情况下,也将缓存区的内容强制写入到外设,习惯是称这个过程称为刷新。flush()方法只对使用缓存区的OutputStream类的子类有效。当调用close()方法时,系统在关闭流之前,也会将缓存区中信息刷新到磁盘文件中。

BufferedReader & BufferedWriter

同样具有内部缓存机制,并可以以行为单位进行输入输出

字符数据读取文件的过程
字符数据-》BufferedWriter-》OutputStreamWriter-》OutputStream-》文件

BufferedReader常用方法
read()读取单个字符
readLine()读取一个文本行,并将其返回为字符串。若无数据可读,则返回null

BufferedWriter类中的方法都返回void
write(String, int, int)写入字符串的某一部分
flush()刷新该流的缓存
newLine()写入一个行分隔符

在使用BufferedWriter的write()方法时,数据并没有立刻被写入至输出流中,而是首先进入缓存区中。如果想立即将缓存区中的数据写入输出流中,一定要调用flush()方法

输出到文件
FileWriter out = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(out);
for (int i = 0; i < content.length; i++) {
bw.write(content[i]);
bw.newLine();
}
bw.close();
out.close();

从文件输入
FileReader in = new FileReader(file);
BufferedReader br = new BufferedReader(in);
String s = null;
int i = 1;
while ((s = br.readLine()) != null) {
System.out.println(“第” + i + “行:” + s);
i++;
}
br.close();
in.close();

数据输入输出流

允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型。也就是说,当读取一个数据时,不必关心这个数值应当是什么字节

DataInputStream & DataOutputStream

DataInputStream(InputStream in)
DataOutputStream(OutputStream out)

DataOutputStream提供如下几种写入字符串的方法
writeBytes(String)由于java中的字符时unicode编码,是双字节的,writeBytes只是将字符串中的每一个字符的低字节内 容写入目标设备中
writeChars(String)将字符串中的每一个字符的两个字节都写到目标设备中
writeUTF(String)将字符串按照UTF编码后的字节长度写入目标设备中,然后才是每一个字节的utf编码
writeInt(int)
writeFloat(float)

DataInputStream只提供一个readUTF()方法返回字符串,这是因为要在一个连续的字节流读取一个字符串。如果没有特殊的标记作为一个字符串的结尾,并且事先也不知道这个字符串的长度,也就无法知道读取到什么位置才是这个字符串的结束。DataOutputStream中只有writeUTF()方法向目标设备中写入字符串的长度。所以我们也只能准确的读回写入的字符串。

写入到文件
FileOutputStream fs = new FileOutputStream(file);
DataOutputStream ds = new DataOutputStream(fs);
ds.writeUTF(“使用writeUTF()方法写入数据”);
ds.writeChars(“使用writeChars()方法写入数据”);
ds.writeBytes(“使用writeBytes()方法写入数据”);
ds.writeInt(2000);
ds.writeDouble(Math.random());
ds.writeBoolean(true);
ds.flush();
ds.close();
fs.close();

从文件读出
FileInputStream fis = new FileInputStream(file);
DataInputStream dis = new DataInputStream(fis);
System.out.println(“readUTF: ” + dis.readUTF());
System.out.println(“readChar: ” + dis.readChar());
System.out.println(“readByte: ” + dis.readByte());
System.out.println(“readint: ” + dis.readInt());
System.out.println(dis.readBoolean());
System.out.println(dis.readDouble());
dis.close();
dis.close();

本博文中所有内容均参考《Java从入门到精通》这本书~