Java学习笔记——IO(字节流)

IO概述

IO的分类
根据数据的流向分为:输⼊流和输出流。
输⼊流 :把数据从 其他设备 上读取到 内存 中的流。
输出流 :把数据从 内存 中写出到 其他设备 上的流。
格局数据的类型分为:字节流和字符流。
字节流 :以字节为单位,读写数据的流。
字符流 :以字符为单位,读写数据的流。

** 顶级⽗类**
Java学习笔记——IO(字节流)_第1张图片

字节流

字节输出流【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");
 }
}

写出字节数据

  1. 写出字节: write(int b) ⽅法,每次可以写出⼀个字节数据,代码使⽤演示:
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
  1. 写出字节数组: write(byte[] b) ,每次可以写出数组中的数据,代码使⽤演示:
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程序员
  1. 写出指定⻓度字节数组: write(byte[] b, int off, int len) ,每次写出从off索引开
    始,len个字节,代码使⽤演示:
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统⼀。

字节输⼊流【InputStream】

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");
 }
}

读取字节数据

  1. 读取字节: read ⽅法,每次可以读取⼀个字节的数据,提升为int类型,读取到⽂件末尾,
    返回 -1 ,代码使⽤演示:
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
  1. 使⽤字节数组读取: read(byte[] b) ,每次读取b的⻓度个字节到数组中,返回读取到的
    有效字节个数,读取到末尾时,返回 -1 ,代码使⽤演示:
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

你可能感兴趣的:(java)