IO的分类
根据数据的流向分为:输⼊流和输出流。
输⼊流 :把数据从 其他设备 上读取到 内存 中的流。
输出流 :把数据从 内存 中写出到 其他设备 上的流。
格局数据的类型分为:字节流和字符流。
字节流 :以字节为单位,读写数据的流。
字符流 :以字符为单位,读写数据的流。
字节输出流【OutputStream】
java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到⽬
的地。它定义了字节输出流的基本共性功能⽅法。
public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b) :将 b.length字节从指定的字节数组写⼊此输出流。
public void write(byte[] b, int off, int len) :从指定的字节数组写⼊ len 字节,
从偏移量 off 开始输出到此输出流。
public abstract void write(int b) :将指定的字节输出流。
⼩贴⼠:
close⽅法,当完成流的操作时,必须调⽤此⽅法,释放系统资源。
FileOutputStream类
构造⽅法
public FileOutputStream(File file) :创建⽂件输出流以写⼊由指定的 File对象表示的
⽂件。
public FileOutputStream(String name) :创建⽂件输出流以指定的名称写⼊⽂件。
当你创建⼀个流对象时,必须传⼊⼀个⽂件路径。该路径下,如果没有这个⽂件,会创建该⽂
件。如果有这个⽂件,会清空这个⽂件的数据。
举例
public class FileOutputStreamConstructor throws IOException {
public static void main(String[] args) {
// 使⽤File对象创建流对象
File file = new File("a.txt");
FileOutputStream fos = new FileOutputStream(file);
// 使⽤⽂件名称创建流对象
FileOutputStream fos = new FileOutputStream("b.txt");
}
}
写出字节数据
public class FOSWrite {
public static void main(String[] args) throws IOException {
// 使⽤⽂件名称创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
// 写出数据
fos.write(97); // 写出第1个字节
fos.write(98); // 写出第2个字节
fos.write(99); // 写出第3个字节
// 关闭资源
fos.close();
}
}
输出结果:
abc
public class FOSWrite {
public static void main(String[] args) throws IOException {
// 使⽤⽂件名称创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
// 字符串转换为字节数组
byte[] b = "Java程序员".getBytes();
// 写出字节数组数据
fos.write(b);
// 关闭资源
fos.close();
}
}
输出结果:
Java程序员
public class FOSWrite {
public static void main(String[] args) throws IOException {
// 使⽤⽂件名称创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
// 字符串转换为字节数组
byte[] b = "abcde".getBytes();
// 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。
fos.write(b, 2, 2);
// 关闭资源
fos.close();
}
}
输出结果:
cd
数据追加续写
如何保留⽬标⽂件中数据,还能继续添加新数据呢?
public FileOutputStream(File file, boolean append) : 创建⽂件输出流以写⼊由指定的 File对象表示的⽂件。
public FileOutputStream(String name, boolean append) :创建⽂件输出流以指定的名称写⼊⽂件。
这两个构造⽅法,参数中都需要传⼊⼀个boolean类型的值, true 表示追加数据, false 表示
清空原有数据。这样创建的输出流对象,就可以指定是否追加续写了,代码使⽤演示:
public class FOSWrite {
public static void main(String[] args) throws IOException {
// 使⽤⽂件名称创建流对象
FileOutputStream fos = new FileOutputStream("fos.txt",true);
// 字符串转换为字节数组
byte[] b = "abcde".getBytes();
// 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。
fos.write(b);
// 关闭资源
fos.close();
}
}
⽂件操作前:cd
⽂件操作后:cdabcde
写出换⾏
Windows系统⾥,换⾏符号是 \r\n 。
回⻋符 \r 和换⾏符 \n :
回⻋符:回到⼀⾏的开头(return)。
换⾏符:下⼀⾏(newline)。
系统中的换⾏:
Windows系统⾥,每⾏结尾是 回⻋+换⾏ ,即 \r\n ;
Unix系统⾥,每⾏结尾只有 换⾏ ,即 \n ;
Mac系统⾥,每⾏结尾是 回⻋ ,即 \r 。从 Mac OS X开始与Linux统⼀。
java.io.InputStream 抽象类是表示字节输⼊流的所有类的超类,可以读取字节信息到内存中。
它定义了字节输⼊流的基本共性功能⽅法。
public void close() :关闭此输⼊流并释放与此流相关联的任何系统资源。
public abstract int read() :从输⼊流读取数据的下⼀个字节。
public int read(byte[] b) :从输⼊流中读取⼀些字节数,并将它们存储到字节数组 b中 。
** FileInputStream类**
构造⽅法
FileInputStream(File file) :通过打开与实际⽂件的连接来创建⼀个 FileInputStream
,该⽂件由⽂件系统中的 File对象 file命名。
FileInputStream(String name) :通过打开与实际⽂件的连接来创建⼀个
FileInputStream ,该⽂件由⽂件系统中的路径名 name命名
当你创建⼀个流对象时,必须传⼊⼀个⽂件路径。该路径下,如果没有该⽂件,会抛出
FileNotFoundException 。
构造举例,代码如下:
public class FileInputStreamConstructor throws IOException{
public static void main(String[] args) {
// 使⽤File对象创建流对象
File file = new File("a.txt");
FileInputStream fos = new FileInputStream(file);
// 使⽤⽂件名称创建流对象
FileInputStream fos = new FileInputStream("b.txt");
}
}
读取字节数据
public class FISRead {
public static void main(String[] args) throws IOException{
// 使⽤⽂件名称创建流对象
FileInputStream fis = new FileInputStream("read.txt");
// 定义变量,保存数据
int b ;
// 循环读取
while ((b = fis.read()) != -1) {
System.out.println((char)b);
}
// 关闭资源
fis.close();
}
}
输出结果:
a
b
c
d
e
public class FISRead {
public static void main(String[] args) throws IOException{
// 使⽤⽂件名称创建流对象.
FileInputStream fis = new FileInputStream("read.txt"); // ⽂件中为abcde
// 定义变量,作为有效个数
int len;
// 定义字节数组,作为装字节数据的容器
byte[] b = new byte[2];
// 循环读取
while (( len= fis.read(b)) != -1) {
// 每次读取后,把数组的有效字节部分,变成字符串打印
System.out.println(new String(b, 0, len));// len 每次读取的有效字节个数
}
// 关闭资源
fis.close();
}
}
输出结果:
ab
cd
e