输入与输出
输入输出流
对于数据源(文件、程序、数据库)和程序来说,程序从数据源中获取数据,称为输入流,即read;数据源从程序获得数据,称为输出流,即write。抽象类InputStream
和OutputStream
构成了输入输出类层次结构
读写字节
使用InputStream
的子类FileInputStream
和OutputStream
的子类FileOutputStream
,这些子类又被称为字节流
int read()
从数据源中读入一个字节,并返回该字节。当碰到输入流的结尾时返回-1
public void inputTest throws IOException {
FileInputStream fileInputStream = new FileInputStream("文件路径");
// 这里的文件路径既可以是相对路径也可以是绝对路径
int by = 0;
while (by = fileInputStream.read() != 1) {
System.out.print((char)by);
}
fileInputStream.close();
}
byte[] readAllBytes()
产生一个数组,包含可以从当前流中读入的所有字节
public void inputTest throws IOException {
FileInputStream fileInputStream = new FileInputStream("文件路径");
byte[] bytes;
bytes = fileInputStream.readAllBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.print((char) bytes[i]);
}
}
void write(byte[] b)
写入所有字节的数据到字符数组b中
public void outputTest() throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("file\\2.txt");
byte[] bytes = "BiStar".getBytes();
fileOutputStream.write(bytes);
}
使用close()
方法来关闭输入/输出流
完整的流家族
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YoI78Tyg-1616140025611)(G:\Gitee\notes-on-java-core-technology\Java笔记\高级特性\IO流.png)]
本章重点学习BufferedStream
、Writer
和Reader
等,其它不表
组合输入/输出流过滤器
FileInputSteam
和FileOutputStream
只能单字节读写或者给定字节读写,显然对于读写速度是很受影响的
我们可以通过组合的方式实现缓冲区的字节流读写
public class TestIo {
public void copyBase() {
FileInputStream fileInputStream = new FileInputStream("文件路径");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
FileOutputStream fileOutputStream = new FileOutputStream("文件路径");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
int by = 0;
while ((by = bufferedInputStream.read()) != -1) {
bufferedOutputStream.write(by);
}
}
}
文件输入与输出
字符(中文)流和字节流的区别:
字符流虽然以字节流为基础创建的,但是字节流可以支持声音,视频,图片,文本等所有文件类型,而字符流只支持文本文件。
字符流首先就需要考虑字符编码问题(character encoding),InputStreamReader
类就可以将输入流转化成指定的编码格式:
var in = new InputStreamReader(new FileInputStream("文件路径"), StandardCharsets.UTF_8);
如何写出文件输出
对于文本输出,可以使用PrintWriter
(书上介绍的是PrintWriter
,更常用的应该是FileWriter
和FileReader
)
var out = new PrintWriter("文件名",StandardCharsets.UTF_8);
out.print();
var fileWriter = ("文件名");
fileWriter.write("");// 其实操作方式和FileOutputStream类似
如何读入文本输入
最简单的处理任意文本的方式使用Scanner
类。
更常用的是使用FileReader
类,使用方法类似
可以使用中的
newLine
方法来换行
字符编码格式
Java针对字符使用的是Unicode标准。其中最常见的就是UTF_8标准。
操作文件
Path
相对路径:从当前文件夹出发的路径
绝对路径:从根目录出发的路径
类UNIX系统的路径分隔符是/,而Windows系统的路径分隔符是\\
java.nio.file.Path
Path toAbsolutePath()// 返回与该路径等价的绝对路径
java.nio.file.Paths
static Paths get(String first,String ... more);// 连接给定的字符串创建一个路径
创建文件、读写文件、复制移动
Files类包括了一系列操作文件、路径的静态方法
static void delete(Path path);// delete a file
static boolean isExecutable(Path path);// 测试一个文件是否可执行
static byte[] readAllBytes(Path path);// 读取文件的所有内容
static Path writeString(Path path, Charset charset);// 写入一个字符串到文件
static Path createFile(Path path);//创建一个空文件
static Path createDirectory(Path path);// 创建新路径
static Path copy(Path from, Path to);// 将from复制到给定位置,并返回to
static Path move(Path from, Path to);// 将from移动到给定位置,并返回to
File
类(基本不含静态方法)
boolean delete();// 删除抽象路径名表示的文件或者路径
String getAbsolutePath();// 返回绝对路径
String getPath();// 将抽象路径名转换为一个路径名字符串
boolean mkdir();// 创建一个抽象路径
String toString();// 返回路径名字符串
String getName();// 返回抽象文件名
bsolutePath();// 返回绝对路径
String getPath();// 将抽象路径名转换为一个路径名字符串
boolean mkdir();// 创建一个抽象路径
String toString();// 返回路径名字符串
String getName();// 返回抽象文件名