Java输入输出流的使用详细介绍(一)
执键写春秋 232 7

Java IO

►▻什么是流? 在 Java 中所有数据都是使用流读写的。流是一组有序的数据序列,将数据从一个地方带到另一个地方。根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种。按处理数据单位的不同,可以分为字节流(InputStream/OutputStream-8 位)和字符流(Reader/Writer-16 位)。 ►▻java.io包 java.io包中最重要的就是5个类和1个接口,5个类指的是File、OutputStream、InputStream、Reader和Writer;1个接口指的是Serializable。

1. 操作文件的类——File

1.1 File类的基本介绍

在java.io包里,唯一与文件本身有关的类就是File类。通过该类可以实现文件创建、删除文件等操作。【什么是文件?文件可认为是相关记录或放在一起的数据的集合。】

1.2 File类中常用的方法和常量

序号 方法或常量 类型 描述
1 public boolean exists() 普通 测试此抽象路径名表示的文件或目录是否存在。
2 public boolean delete() 普通 删除此抽象路径名表示的文件或目录。
3 public long length() 普通 返回此抽象路径名表示的文件的长度。
4 public boolean mkdir() 普通 创建单级目录
5 public boolean canExecute() 普通 测试应用程序是否可以执行此抽象路径名表示的文件。
6 public boolean canRead() 普通 测试应用程序是否可以读取此抽象路径名表示的文件。
7 public boolean canWrite() 普通 测试应用程序是否可以修改此抽象路径名表示的文件。
8 public boolean mkdirs() 普通 创建多级目录
9 public boolean isDirectory() 普通 测试此抽象路径名表示的文件是否为目录。
10 public File​(String pathname) 构造 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
11 public static String pathSeparator 常量 通与系统相关的路径分隔符,为方便起见,表示为字符串。
更多常用的方法和常量可以去看一下File类文档:https://www.runoob.com/manual/jdk11api/java.base/java/io/File.html
### 1.3 使用File类操作文件
操作一:创建一个新文件
操作二:判断是文件还是目录,以及判断文件的可读性
操作三:判断路径是否存在,如果不存在就创建
操作四:删除一个指定文件
操作五:判断是否是目录,如果是则列出全部内容
```
package person.xsc.practice;

import java.io.File; import java.io.IOException;

public class FileDemo {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    //一:创建一个新文件
    File file=new File("C:\\Users\\你是小朱老师呀\\Desktop\\test.txt");
    try {
        file.createNewFile();
    }catch(IOException e) {
        e.printStackTrace();
    }
    //二:判断是文件还是目录,以及判断文件的可读性
       if(file.isDirectory()) {
           System.out.println("文件/目录:"+file.getPath()+"这是一个目录");
       }else {
           System.out.println("文件/目录:"+file.getPath()+"这是一个文件");
       }
       if(file.canRead()&&file.canWrite()) {
           System.out.println("读写性:这个文件既可以读还可以写");
       }else if(file.canRead()) {
           System.out.println("读写性:这个文件只可以读");
       }else if(file.canWrite()) {
           System.out.println("读写性:这个文件只可以写");
       }
    //三+四、判断路径是否存在,如果不存在就创建
       File file2=new File("C:\\Users\\你是小朱老师呀\\Desktop\\XSC");
       if(file2.exists()) {
           file2.delete();
       }else {
           file2.mkdirs();
           try {
               new File(file2,"test2.txt").createNewFile();
               new File(file2,"test3.txt").createNewFile();
               new File(file2,"XSC1").mkdir();
               new File(file2,"XSC2").mkdir();
               new File(file2,"XSC3").mkdir();
           } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
           }
       }
       //五、判断是否是目录,如果是则列出全部内容
       if(file2!=null) {
           if(file2.isDirectory()) {
               File[] f=file2.listFiles();
               for(int i=0;i<f.length;++i) {
                   System.out.println("目录"+(i+1)+":"+f[i]);
               }
           }else {
               System.out.println(file2);
           }
       }
}

}

## 2. 字节流基本操作
字节流主要操作byte类型数据,以byte数组为准,主要操作类是OutputStream类和InputStream类。具体分类如下:
![image](https://img-hello-world.oss-cn-beijing.aliyuncs.com/imgs/0e2ff468628edbbf6738d23441009943.png)
![image](https://img-hello-world.oss-cn-beijing.aliyuncs.com/imgs/3185106a16de1da6e9bf1e5b8483d1b0.png)
### 2.1 字节输出流:OutputStream
OutputStream是整个IO包中字节输出流的最大父类,此类的定义如下:

public abstract class OutputStream extends Object implements Closeable, Flushable 此抽象类是表示输出字节流的所有类的超类。 输出流接受输出字节并将它们发送到某个接收器。 需要定义OutputStream的子类的应用程序必须始终至少提供一个写入一个输出字节的方法。

#### 2.1.1 OutputStream类常用的方法
|序号|方法|类型|描述|
|-|-|-|-|
|1|public void close()|普通|关闭此输出流并释放与此流关联的所有系统资源。|
|2|public void flush()|普通|刷新此输出流并强制写出任何缓冲的输出字节。|
|3|public void write​(byte[] b)|普通|将 b.length字节从指定的字节数组写入此输出流。|
|4|public void write​(byte[] b, int off, int len)|普通|将从偏移量 off开始的指定字节数组中的 len字节写入此输出流。|
|5|public abstract void write​(int b)|普通|将指定的字节写入此输出流。|
#### 2.1.2 实现FileOutputStream类从向文件中写入内容
##### 2.1.2.1 FileOutputStream类中的方法
|序号|方法|说明|
|-|-|-|
|1|public void write​(byte[] b)|将指定字节数组中的 b.length字节写入此文件输出流。|
|2|public void close()|关闭此文件输入流并释放与此流有关的所有系统资源|
|3|public void write​(byte[] b, int off, int len)|将从偏移量 off开始的指定字节数组中的 len字节写入此文件输出流。|
|4|public void write​(int b)|将指定的字节写入此文件输出流。|
##### 2.1.2.2 向文件中写入内容

package person.xsc.practice;

import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream;

public class OutputStreamDemo {

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    //找到一个文件
    File file=new File("C:\\Users\\你是小朱老师呀\\Desktop\\test.txt");
    //通过子类实例化父类对象
    OutputStream outputStream=new FileOutputStream(file,true);
    //进行写入操作
    byte[]b=new String("世界,你好").getBytes();
    outputStream.write(b);
    //关闭输入流
    outputStream.close();
}

}

这里注意如果在实例化父类对象时,知识这样FileOutputStream​(File file)去构造,在写入的时候回覆盖文件中原先内容,如果想要接在原先内容后面,应该通过FileOutputStream​(File file, boolean append)去构造。
### 2.2 字节输入流:InputStream
同OutputStream一样,InputStream本身也是一个抽象类,必须依靠其子类,如果从文件中读取就需要依靠子类FileInputStream。
####  2.2.1 InputStream类常用的方法
|序号|方法|类型|描述|
|-|-|-|-|
|1|public int available()|普通|返回可以从此输入流中无阻塞地读取(或跳过)的字节数的估计值,可以是0,或者在检测到流结束时为0。|
|2|public void close()|普通|关闭此输入流并释放与该流关联的所有系统资源。|
|3|public abstract int read()|普通|从输入流中读取下一个数据字节。|
|4|public int read​(byte[] b)|普通|从输入流中读取一些字节数并将它们存储到缓冲区数组 b 。|
#### 2.2.2 实现FileInputStream类从文件中读取内容
##### 2.2.2.1 FileInputStream类中的方法
|序号|方法|说明|
|-|-|-|
|1|public int read()|从输入流中读取一个数据字节|
|2|public int read(byte[] b)|从输入流中将最多b.length个字节的数据读入一个byte数组中|
|3|public int  read(byte[] b, int off, int len) |从输入流中将最多len个字节的数据读入byte数组中,off表示偏移量|
|4|public void close()|关闭此文件输入流并释放与此流有关的所有系统资源|
##### 2.2.2.2 从文件中读取内容

package person.xsc.practice; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class InputStreamDemo { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub //找到一个文件 File file=new File("C:\Users\你是小朱老师呀\Desktop\test.txt"); //通过子类实例化父类对象 InputStream inputStream=new FileInputStream(file); byte[] b=new byte[(int)file.length()]; int length=inputStream.read(b); //关闭输入流 inputStream.close(); System.out.println("读入数据的长度:"+length+'\n'+"内容:"+new String(b)); }
}

评论区

索引目录