Java---IO流讲解(1)
2023-12-24 16:45:15
文章目录
1. File类
1.1 File类概述和构造方法
?1. File:它是文件和目录路径名的抽象表示,文件和目录是可以通过File封装成对象的。
?2. 构造方法:
方法名 | 说明 |
---|---|
File pathname | 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例 |
File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的File实例 |
File(File parent, String child) | 从父抽象路径名和子抽象路径名字符串来创建新的File实例 |
import java.io.File;
public class Demo {
public static void main(String[] args) {
File f1 = new File("D:\\123\\java.txt");
System.out.println(f1); //D:\123\java.txt
File f2 = new File("D:\\123","java.txt");
System.out.println(f2); //D:\123\java.txt
File f3 = new File("D:\\123");
File f4 = new File(f3,"java.txt");
System.out.println(f4); //D:\123\java.txt
}
}
1.2 File类创建功能
方法名 | 说明 |
---|---|
public boolean createNewFile() | 当具有该名称的文件不存在时,创建一个由该抽象路径命名的新空文件 |
public boolean mkdir() | 创建由此抽象路径名命名的目录 |
public boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录 |
public class Demo {
public static void main(String[] args) throws IOException {
File f1 = new File("D:\\123\\java.txt");
f1.createNewFile();
File f2 = new File("D:\\123\\java");
f2.mkdir();
File f3 = new File("D:\\123\\java1\\java2");
f3.mkdirs();
}
}
1.3 File类删除功能
方法名 | 说明 |
---|---|
public boolean delete() | 删除由此抽象路径名表示的文件或目录 |
public class Demo {
public static void main(String[] args) throws IOException {
File f1 = new File("D:\\123\\java.txt");
f1.createNewFile();
File f2 = new File("D:\\123\\java");
f2.mkdir();
File f3 = new File("D:\\123\\java1\\java2");
f3.mkdirs();
f1.delete();
}
}
2. IO流
2.1 IO流概述
?1. IO:输入和输出(Input/Output)。
?2. 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输成为流,流的本质是数据传输。
?3. IO流就是用来处理设备间传输问题的。常见的应用:文件复制、文件传输、文件下载。
2.2 分类
?1. 按照数据的流向:(1) 输入流:读数据。 (2) 输出流:写数据。
?2. 按照数据类型来分:(1) 字节流。 (2) 字符流。
?简单来说:如果数据在记事本上打开,我们能读懂里面的内容就使用字符流;反之使用字节流。
3 字节流
3.1 字节流写数据
?1. 字节流抽象类:
InputStream
:这个抽象类是表示字节输入流的所有类的超类。OutputStream
:这个抽象类是表示字节输出流的所有类的超类。- 子类名特点:子类名称都是以其父类名作为子类名的后缀。
?2. FileOutputStream
:文件输出流用于将数据写入File。步骤:(1) 创建字节输出流对象。 (2) 调用字节输出流对象。 (3) 释放资源。
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException { //文件名注意加引号
FileOutputStream f=new FileOutputStream("D:\\fos.txt");
f.write(97);
f.close();
}
}
3.2 字节流写数据的3种格式
方法名 | 说明 |
---|---|
void write(int b) | 将指定的字节写入此文件输出流,一次写一个字节数据 |
void write(byte[] b) | 将b.length字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据 |
void write(byte[] b, int off, int len) | 将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,一次写一个字节数组的部分数据 |
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException { //文件名注意加引号
FileOutputStream f=new FileOutputStream("D:\\fos.txt");
f.write(97);
byte[] bys={98,99,100,101};
f.write(bys);
f.write(bys,1,3);
f.close();
}
}
3.3 字节流写数据的两个小问题
?1. 如何实现换行?写完数据后加换行符:f.write("\r\n".getBytes())
。
?2. 如何实现追加写入?创建文件时加第二个参数:true
。
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException { //文件名注意加引号
FileOutputStream f=new FileOutputStream("D:\\fos.txt",true);
f.write(97);
byte[] bys={98,99,100,101};
f.write(bys);
f.write("\r\n".getBytes());
f.write(bys,1,3);
f.close();
}
}
3.4 字节流写数据加异常处理
?在前面展现的一些代码块中都是通过throws IOException
完成的,也可以改成try...catch
。
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) { //文件名注意加引号
try {
FileOutputStream f = new FileOutputStream("D:\\fos.txt", true);
f.write(97);
byte[] bys = {98, 99, 100, 101};
f.write(bys);
f.write("\r\n".getBytes());
f.write(bys, 1, 3);
f.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
3.5 字节流读数据
?1. FileInputStream
:从文件系统中的文件获取输入字节。步骤:(1) 创建字节输入流对象。 (2) 调用字节输入流对象的读数据方法。 (3) 释放资源。
?2. 一次读一个字节数据的代码块:
import java.io.*;
public class Demo {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("D:\\fos.txt");
//第一次读数据
int by=fis.read();
System.out.println(by);//97
System.out.println((char)by);//a
//第二次读数据
by=fis.read();
System.out.println(by);//98
System.out.println((char)by);//b
fis.close();
}
}
?优化读:
public class Demo {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("D:\\fos.txt");
int by;
while((by=fis.read())!=-1){
System.out.print((char)by);
//不加ln,可以读取到换行
}
}
}
?3. 一次读一个字节数组数据的代码块:
import java.io.*;
public class Demo {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("D:\\fos.txt");
byte[] bys=new byte[5];
int len= fis.read(bys);
System.out.println(len);//5 表示读入的个数
System.out.println(new String(bys,0,len));
len= fis.read(bys);
System.out.println(len);//5 表示读入的个数
System.out.println(new String(bys,0,len));
len= fis.read(bys);
System.out.println(len);//5 表示读入的个数
System.out.println(new String(bys,0,len));
//hello\r\n
//world\r\n
fis.close();
}
}
?优化读:
import java.io.*;
public class Demo {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("D:\\fos.txt");
byte[] bys=new byte[1024];//一般是1024整数倍
int len;
while((len= fis.read(bys))!=-1){
System.out.print(new String(bys,0,len));
}
fis.close();
}
}
3.6 字节缓冲流
?1. 字节缓冲流是为了提高读取和写入字节的效率,构造方法有两个:
- 字节缓冲输出流:
BufferedOutputStream(OutputStream out)
。 - 字节缓冲输入流:
BufferedInputStream(InputStream in)
。
?2. 为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
- 字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作。
import java.io.*;
public class Demo {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream("D:\\fos.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
bos.write("hello\r\n".getBytes());
bos.write("world\r\n".getBytes());
bos.close();
FileInputStream fis=new FileInputStream("D:\\fos.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
//一次读取一个字节方式
//int by;
//while ((by=bis.read())!=-1){
// System.out.print((char)by);
//}
//bis.close();
//一次读取一个字节数组方式
byte[] by=new byte[1024];
int len;
while((len=bis.read(by))!=-1){
System.out.print(new String(by,0,len));
}
bis.close();
}
}
文章来源:https://blog.csdn.net/m0_62881487/article/details/135160464
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!