(以下资料来自三更草堂)
IO流
1 IO流概述
当需要进行数据的传输的时候可以使用IO流来进行。例如:把磁盘中文件的数据读取到内存中。把内存中的数据写入到磁盘中。把网络中的数据读取到内存中。
2 IO流分类
IO流根据处理数据类型的不同分为字符流和字节流,根据数据流向不同分为输入流和输出流,对输入流只能进行读操作,对输出流只能进行写操作。
数据类型 | 流向 | 顶层父类 |
---|---|---|
字节流 | 输入(读) | java.io.InputStream |
字节流 | 输出(写) | java.io.OutputStream |
字符流 | 输入(读) | java.io.Reader |
字符流 | 输出(写) | java.io.Writer |
3 字节输入流
所有字节输入流的父类是 java.io.InputStream ,它是以字节为单位的输入流 。
3.1 FileInputStream概述
FileInputStream是用来读取文件数据的字节输入流。
3.2 FileInputStream对象创建
构造方法如下:
FileInputStream(String name) throws FileNotFoundException //传入文件路径创建对象
FileInputStream(File file) throws FileNotFoundException //传入文件路径的File对象来创建流对象
3.3 读取数据
我们可以使用FileInputStream来读取文件中的字节数据。
2.3.3.1 一次读取一个字节
核心方法如下:
public int read() throws IOException // 读取一个字节的数据作为返回值返回 返回值为-1时代表以及没有内容了
文本文件中存储的是字符,我们使用字节流读取。
怎么一次性全都读出来?返回值是-1的时候就读完了
读完要释放:
//释放资源
fis2.close();
2.3.3.2 一次读取一个字节数组
核心方法如下:
public int read(byte b[]) throws IOException //传入一个字节数组,最多读取一个字节数组的数据,并且会把数据存入数组中,返回值代表本次读取到的字节的个数。 如果返回值为-1代表没有数据了
如何使用读取字节数组一次读完?返回值为 -1 代表没有数据了
4. 字节输出流
所有字节输出流的父类是 java.io.OutputStream ,它是以字节为单位的输出流 。
我们就以FileOutputStream为例进行学习。
4.1 FileOutputStream概述
FileOutputStream是用来往文件中写入数据的字节输出流。
4.2 FileOutputStream对象创建
常用构造方法如下:
FileOutputStream(String name) throws FileNotFoundException //传入文件路径创建对象
FileOutputStream(File file) throws FileNotFoundException //传入文件路径的File对象来创建流对象
4.3 写数据
我们可以使用FileOutputStream来往文件中写入字节数据。
4.3.1 一次写一个字节
核心方法如下:
public void write(int b) throws IOException //传入一个字节数据,把字节数据写入文件
范例:
4.3.2 一次写一个字节数组
核心方法如下:
public void write(byte b[]) throws IOException // 存入一个字节数组,把字节数组中的数据全部写入文件
public void write(byte b[], int off, int len) throws IOException //存入一个字节数组,把字节数组中从off索引开始len个元素写入文件
注意会把之前写的清空,然后再写入。
fos.write(bytes,0,2); 也可以部分部分
4.4文件续写
如果用之前的构造方法创建的流对象,每次流对象创建的时候就会把文件中的内容情况。所以没有办法实现续写的效果。如果需要续写就需要使用另外的构造方法。
FileOutputStream(String name, boolean append) throws FileNotFoundException //第二个参数代表是否续写
FileOutputStream(File file, boolean append) throws FileNotFoundException //第二个参数代表是否续写
字节流练习
文件复制
public static void main(String[] args) throws IOException {
//复制文件 循环的读写 知道操作完所有的数据为止
//将1.txt文件内容 复制到 同目录下test文件夹下的copy.txt文件里面
FileInputStream fis = new FileInputStream("D:\\\\学习笔记\\\\JAVA\\\\JavaSE进阶\\\\io-test\\1.txt");
FileOutputStream fos = new FileOutputStream("D:\\\\学习笔记\\\\JAVA\\\\JavaSE进阶\\\\io-test\\test\\copy.txt",true);
int n;
while ((n= fis.read()) != -1) {
fos.write(n);
}
fis.close();
fos.close();
}
文件夹复制
public class Test09 {
public static void main(String[] args) throws IOException {
//要求定义一个方法,该方法能够实现文件夹的复制,考虑有子文件夹的情况
File srcDir = new File("C:\\Users\\root\\Desktop\\test");
File dest = new File("C:\\Users\\root\\Desktop\\test2");
copyDir(srcDir,dest);
}
//File srcDir 源文件夹
//File dest要复制到哪个目录
public static void copyDir(File srcDir,File dest ) throws IOException {
if(!(srcDir.exists()&&srcDir.isDirectory())){
throw new RuntimeException("源文件夹必须存在并且是一个文件夹");
}
if(!dest.isDirectory()){
throw new RuntimeException("目标文件夹必须是一个文件夹");
}
//1.在目标文件夹下创建一个和源文件夹同名的文件夹destDir
File destDir = new File(dest,srcDir.getName());
destDir.mkdirs();
//2.获取源文件夹下的所有子文件
File[] files = srcDir.listFiles();
if(files!=null){
//3.遍历数组,复制每一个文件到目标文件夹destDir下
for (File file : files) {
if(file.isFile()){
copyFile(file,destDir);
}else {
//复制文件夹
copyDir(file,destDir);
}
}
}
}
//源文件的路径 File srcFile
//目标文件的存放目录路径 File destDir
public static void copyFile(File srcFile,File destDir) throws IOException {
//在destDir下创建一个和srcFile同名的文件
File destFile = new File(destDir,srcFile.getName());
//读取源文件 把读到的数据写入目标文件destFile
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(destFile);
byte[] bytes = new byte[1024];
int len;
while((len=fis.read(bytes))!=-1){
//把读到的内容写入新文件中
fos.write(bytes,0,len);
}
//释放资源
fis.close();
fos.close();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/87987.html