本文首发自「慕课网」,想理解更多 IT 干货内容,程序员圈内热闻,欢送关注!
作者 | 慕课网精英讲师 ColorfulC
本篇文章将会介绍根本输入输出的 Java 规范类,你将理解到什么是输出和输出,什么是流;输入输出流的利用场景,File 类的应用,什么是文件,Java 提供的输入输出流相干 API 等内容。1. 什么是输出和输入(I / O)1.1 基本概念输出 / 输入这个概念,对于计算机相关业余的同学并不生疏,在计算中,输出 / 输入(Input / Output,缩写为 I / O)是信息处理系统(例如计算机))与外界(可能是人类或其余信息处理系统)之间的通信。输出是零碎接管的信号或数据,输入是从零碎发送的信号或数据。那么在 Java 中,什么是输出和输入呢?要了解这个概念,可将 Java 平台视作一个零碎。Java 平台是一个孤立的零碎,零碎之外的所有货色都是它的环境。零碎与其环境之间的交互是一种双向对话。零碎要么从其环境接管音讯,要么将其消息传递给环境。当零碎接管到音讯时,将其称为输出,与之相同的是输入。Java 提供了两个用于 I / O 的包:较旧的 java.io 包(不反对符号链接)和较新的 java.nio(“new io”)包,它对 java.nio.file 的异样解决进行了改良。1.2 简略的 Java 输入——打印内容到屏幕始终以来,咱们都在向屏幕输入内容以验证咱们编写的代码逻辑。向屏幕输入内容非常简单,能够由以下两种形式来实现:// 打印 Hello World,不换行
System.out.print(“Hello World”);
代码块 12// 打印 Hello Java,并换行
System.out.println(“Hello Java”);
代码块 121.3 简略的 Java 输出——从键盘输入 java.util 包下的 Scanner 类可用于获取用户从键盘输入的内容,咱们在 Java Scanner 类这一大节曾经介绍过具体应用,实例如下:import java.util.Scanner;
/**
- @author colorful@TaleLin
*/
public class ScannerDemo {
public static void main(String[] args) {
// 创立扫描器对象
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的姓名:");
// 能够将用户输出的内容扫描为字符串
String name = scanner.nextLine();
// 打印输出
System.out.println("你好".concat(name).concat(",欢送来到慕课网!"));
// 敞开扫描器
scanner.close();}
}
代码块 123456789101112131415161718 运行后果:请输入您的姓名:
Colorful
你好 Colorful,欢送来到慕课网!
代码块 1232. 什么是流(Stream)Java 中最根本的输出 / 输出是应用流来实现的。流是代表数据源和数据指标的对象,怎么了解这句话呢?简略来说,能够读取作为数据源的流,也能够写入作为数据指标的流。Java 中的流是长度不确定的有序字节序列,它是一连串流动的字符,是以先进先出的形式发送信息的通道。3. 输入输出流的利用场景下面咱们曾经理解了输入输出流的基本概念,那么它具体是做什么用的呢?在 web 产品的开发中,最常开发的性能就是上传文件到服务器了,这个文件的读写过程就要用到输入输出流。对于计算机中文件的读写、复制和删除等操作也都要用到输入输出流。输入输出流能够说是无处不在,上面咱们将会介绍 Java 中输入输出流相干的 API。4. File 类在 Java 中,提供了 java.io.File 类对文件和目录进行操作。File 意思为文件,文件在计算机中十分重要,咱们编写的 word 文档、PPT 演示文稿、运行游戏的.exe 可执行文件以及咱们编写的 Java 源代码等等都是文件。4.1 实例化要实例化 File 对象,须要传入一个文件或目录的门路。File 类提供了如下 4 个构造方法:File(File parent, String child):从父形象路径名和子路径名字符串创立新的文件实例;File(String pathName):通过将给定的路径名字符串转换为形象路径名,创立一个新的文件实例(最罕用);File(String parent, String child):从父路径名字符串和子路径名字符串创立新的文件实例;File(URI uri):通过将给定的文件: URI 转换为形象路径名,创立一个新的文件实例。以 Windows 零碎为例,在桌面下有一个 imooc 目录,该目录下有一个 Hello.java 文件和一个空的 images 目录,截图如下:
咱们能够单击 Windows 的门路栏,来获取 imooc 目录的绝对路径:
有了目录和文件以及门路。咱们别离实例化两个 File 对象,实例如下:import java.io.File;
public class FileDemo1 {
public static void main(String[] args) {
// 传入目录绝对路径
File dir = new File("C:\\Users\\Colorful\\Desktop\\imooc\\images");
// 传入文件绝对路径
File file = new File("C:\\Users\\Colorful\\Desktop\\imooc\\Hello.java");
// 打印两个 File 对象
System.out.println(dir);
System.out.println(file);
}
}
代码块 12345678910111213 咱们能够间接打印 File 对象,File 类重写了 toString()办法,查看 Java 源码,toString()办法间接返回了 getPath()实例办法,此办法返回构造方法传入的门路字符串:
运行后果:C:\Users\Colorful\Desktop\imooc\images
C:\Users\Colorful\Desktop\imooc\Hello.java
代码块 12 下面代码中,应用 \ 示意 Windows 下的门路分隔符 \,Linux 和 MacOS 下应用正斜杠 / 作为门路分隔符。假如是同样的目录构造,在 MacOS 和 Linux 下是这样示意的:File dir = new File(“/Users/Colorful/Desktop/imooc/images”);
代码块 1 因为 Windows 平台和其余平台门路分隔符不同,应用不同平台的开发者就难以保障门路分隔符的对立。为了保障代码更好的兼容性,File 类下提供了一个动态变量 separator,用于示意以后平台的零碎分隔符:// 依据以后平台输入 / 获取 \
System.out.println(File.separator);
代码块 124.2 绝对路径和相对路径在实例化 File 对象时,既能够传入绝对路径,也能够传入相对路径。绝对路径是以根目录结尾的残缺的全门路,下面代码实例中传入的是绝对路径,咱们再来看看什么是相对路径,以及如何传入相对路径。相对路径指的是以后文件所在的门路引起的跟其它文件(或文件夹)的门路关系。听起来有点绕,咱们举例来说明一下,在 imooc 目录下新建一个 FileDemo2.java 文件,此时 imooc 目录的文件目录树结构如下:└── imoooc
├── FileDemo2.java
├── Hello.java
└── images
代码块 1234 内容如下:import java.io.File;
import java.io.IOException;
public class FileDemo2 {
public static void main(String[] args) throws IOException {
// 传入目录相对路径
File dir = new File(".\\images");
File imoocDir = new File("..\\imooc");
// 传入文件相对路径
File file = new File(".\\Hello.java");
}
}
代码块 123456789101112 下面代码的 File 构造方法中传入的就是相对路径,代码中的. 示意当前目录,.. 示意下级目录。Tips:咱们在实例化 File 对象时,不会产生对磁盘的操作,因而即便传入的文件或目录不存在,代码也不会抛出异样。只有当调用 File 对象下的一些办法时,才会对磁盘进行操作。File 对象下有 3 个示意门路的实例办法:String getPath():将形象路径名转换为路径名字符串;String getAbsolute():返回此形象路径名的绝对路径名字符串;String getCanonicalPath():返回此形象路径名的标准路径名字符串。咱们能够调用这 3 个办法并打印后果,实例如下:import java.io.File;
import java.io.IOException;
public class FileDemo2 {
public static void main(String[] args) throws IOException {
// 传入目录相对路径
File imagesDir = new File(".\\images");
File imoocDir = new File("..\\imooc");
// 传入文件相对路径
File file = new File(".\\Hello.java");
System.out.println("-- imagesDir ---");
System.out.println(imagesDir.getPath());
System.out.println(imagesDir.getAbsolutePath());
System.out.println(imagesDir.getCanonicalPath());
System.out.println("-- imoocDir ---");
System.out.println(imoocDir.getPath());
System.out.println(imoocDir.getAbsolutePath());
System.out.println(imoocDir.getCanonicalPath());
System.out.println("-- file ---");
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
}
}
代码块 123456789101112131415161718192021222324252627 运行后果:– imagesDir —
.\images
C:\Users\Colorful\Desktop\imooc.\images
C:\Users\Colorful\Desktop\imooc\images
— imoocDir —
..\imooc
C:\Users\Colorful\Desktop\imooc..\imooc
C:\Users\Colorful\Desktop\imooc
— file —
.\Hello.java
C:\Users\Colorful\Desktop\imooc.\Hello.java
C:\Users\Colorful\Desktop\imooc\Hello.java
代码块 123456789101112 通过运行后果能够看出,标准路径名就是把. 和.. 转换为规范的绝对路径。4.3 判断对象是文件还是目录咱们能够通过如下两个办法判断 File 对象是文件还是目录:boolean isFile():测试此形象路径名示意的文件是否为一般文件;boolean isDirectory():测试此形象路径名示意的文件是否为目录。实例如下:import java.io.File;
public class FileDemo3 {
public static void printResult(File file) {// 调用 isFile()办法并接管布尔类型后果
boolean isFile = file.isFile();
String result1 = isFile ? "是已存在文件" : "不是已存在文件";
// 掉用 isDirectory()办法并接管布尔类型而己过
boolean directory = file.isDirectory();
String result2 = directory ? "是已存在目录" : "不是已存在目录";
// 打印该 file 对象是否是已存在文件 / 目录的字符串后果
System.out.print(file);
System.out.print('\t' + result1 + '\t');
System.out.println(result2);
}
public static void main(String[] args) {
// 传入目录绝对路径
File dir = new File("C:\\Users\\Colorful\\Desktop\\imooc\\images");
// 传入文件绝对路径
File file = new File("C:\\Users\\Colorful\\Desktop\\imooc\\test.java");
FileDemo3.printResult(dir);
FileDemo3.printResult(file);
}
}
代码块 1234567891011121314151617181920212223242526 运行后果:C:\Users\Colorful\Desktop\imooc\images 不是已存在文件 是已存在目录
C:\Users\Colorful\Desktop\imooc\test.java 不是已存在文件 不是已存在目录
代码块 12 代码中咱们封装了一个静态方法 printResult(),此办法打印 File 对象是否是文件 / 目录。值得注意的是,咱们的磁盘中不存在 C:\Users\Colorful\Desktop\imooc\test.java,因而无论调用 isFile()办法还是 isDirectory()办法,其返回后果都为 false。4.4 创立和删除目录 4.4.1 创立目录对于一个不存在的目录,咱们能够应用 boolean mkdir()办法创立一个目录。例如,咱们想在 imooc 目录下创立一个 codes 目录,就能够应用该办法编写一段创立目录的代码。实例如下:import java.io.File;
public class FileDemo4 {
public static void main(String[] args) {
// 传入目录绝对路径
File dir = new File("C:\\Users\\Colorful\\Desktop\\imooc\\codes");
if (!dir.exists()) {// 调用 mkdir() 办法
boolean result = dir.mkdir();
if (result) {System.out.println("目录创立胜利");
}
}
}
}
代码块 12345678910111213141516 代码中咱们调用了 File 对象的 boolean exists()办法,此办法用于测试由此形象路径名示意的文件或目录是否存在。当不存在时,咱们才去创立目录。运行代码前,imooc 文件目录树结构如下:└── imoooc
├── FileDemo2.java
├── Hello.java
└── images
代码块 1234 运行后果:目录创立胜利
代码块 1 运行代码后,imooc 目录下多了一个 codes 目录,树结构如下:└── imoooc
├── FileDemo2.java
├── Hello.java
├── images
└── codes
代码块 12345 另外,File 类也提供了一个 boolean mkdirs()办法,用来创立由这个形象路径名命名的目录,包含任何必要但不存在的父目录。实际上是在递归执行 mkdir()办法。4.4.2 删除目录如果咱们想要删除刚刚创立的 codes 目录,能够调用 boolean delete()办法,实例如下:import java.io.File;
public class FileDemo5 {
public static void main(String[] args) {
// 传入目录绝对路径
File dir = new File("C:\\Users\\Colorful\\Desktop\\imooc\\codes");
if (dir.exists()) {// 调用 delete() 办法
boolean deleted = dir.delete();
if (deleted) {System.out.println("删除目录胜利");
}
}
}
}
代码块 123456789101112131415 运行代码前,imooc 文件目录树结构如下:└── imoooc
├── FileDemo2.java
├── Hello.java
├── images
└── codes
代码块 12345 运行后果:删除目录胜利
代码块 1 运行代码后,树结构如下:└── imoooc
├── FileDemo2.java
├── Hello.java
└── images
代码块 12344.5 创立和删除文件对于文件类型的 File 对象,能够通过 boolean createNewFile()办法创立一个新文件,应用 boolean delete()办法删除文件。其调用办法和创立 / 删除目录雷同,此处不再赘述。对于更多 File 对象的操作,可翻阅官网文档。5. InputStream 抽象类 5.1 概述 java.io.InputStream 抽象类是 Java 提供的最根本的输出流,它是所有输出流的父类。其最罕用的形象办法 int read()签名如下:public abstract int read() throws IOException;
代码块 1 这个办法用于读取输出流的下一个字节,返回的 int 如果为 -1,则示意曾经读取到文件开端。InputStream 与其子类的 UML 图如下所示:
5.2 FileInputStream 实现类咱们将以最罕用的 FileInputStream 实现类为例进行学习。其余实现类大同小异,如有须要可翻阅官网文档。FileInputStream 就是从文件流中读取数据,咱们在 imooc 目录下新建一个文本文档 Hello.txt,并输出如下内容:
读取 Hello.txt 文件中数据的实例代码如下:import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamDemo1 {
public static void main(String[] args) throws IOException {
// 实例化文件流
FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Colorful\\Desktop\\imooc\\Hello.txt");
for (;;) {int n = fileInputStream.read();
if (n == -1) {// read() 办法返回 -1 则跳出循环
break;
}
// 将 n 强制转换为 char 类型
System.out.print((char) n);
}
// 敞开文件流
fileInputStream.close();}
}
代码块 12345678910111213141516171819202122 运行后果:Hello imooc!
代码块 1 如果咱们关上了一个文件并进行操作,不要遗记应用 close()办法来及时敞开。这样能够让零碎开释资源。6. OutputStream 抽象类 6.1 概述 OutPutStream 抽象类是与 InputStream 对应的最根本的输入流,它是所有输入流的父类。其最罕用的形象办法 void write(int b)签名如下:public abstract void write(int b) throws IOException;
代码块 1 这个办法用于写入一个字节到输入流。OutputStream 与其子类的 UML 图如下所示:
6.2 FileOutputStream 实现类咱们同样以最罕用的 FileOutputStream 实现类为例进行学习。其余实现类大同小异,如有须要可翻阅官网文档。FileOutputStream 就是向文件流中写入数据,上面咱们向 imooc 目录下的文本文档 Hello.txt 输出一段字符串 HHH。残缺实例如下:import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo1 {
public static void main(String[] args) throws IOException {FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Colorful\\Desktop\\imooc\\Hello.txt");
// 写入 3 个 H 字符
fileOutputStream.write(72);
fileOutputStream.write(72);
fileOutputStream.write(72);
fileOutputStream.close();}
}
代码块 1234567891011121314 运行代码后,Hello.txt 前面胜利写入了 3 个字符 H。7. 小结通过本篇文章,咱们晓得了什么是输入输出流的概念,输入输出流常常用于上传文件到服务器的场景。想要通过 Java 操作文件和目录,要学会应用 java.io.File 类,InputStream 和 OutputStream 别离是所有输出流和所有输入流的父类,FileInputStream 实现了文件流的输出,FileOutputStream 实现了文件流的输入。还有很多其它实现类咱们没有介绍到,但应用办法大同小异,心愿同学能够在用到时自行查阅文档来学习。
欢送关注「慕课网」,发现更多 IT 圈优质内容,分享干货常识,帮忙你成为更好的程序员!