专门做婚庆的网站有哪些,建设校园网站的好处,站长收录查询,上海普陀网站建设公司IO流
啥是流
1、IO#xff1a;输入 \ 输出流#xff1a;一种抽象概念#xff0c;是对数据传输的总称#xff0c;也就是说#xff0c;数据在设备间的传输称为流#xff0c;流的本质#xff0c;是数据传输IO流#xff0c;就是用来#xff0c;处理设备间的数据传输问题…IO流
啥是流
1、IO输入 \ 输出流一种抽象概念是对数据传输的总称也就是说数据在设备间的传输称为流流的本质是数据传输IO流就是用来处理设备间的数据传输问题的。如文件复制、文件上传、文件下载2、按照数据类型分类1、字节流字节输入流InputStream作为基类字节输出流OutputStream作为基类2、字符流字符输入流字符输入流 Reader作为基类字符输出流字符输出流 Writer作为基类按照流向分类1、输出流OutputStream、Writer作为基类2、输入流InputStream、Reader作为基类一般来说所说的IO流的分类是按照数据类型来分的。
字节流读数据
1、字节流抽象基类InputStream这个抽象类是字节输入流的所有类的超类OutputStream这个抽象类是字节输出流的所有类的超类子类名特点子类名称都是以其父类名作为子类名的后缀
常用方法
1、InputStream类的常用方法int read(int b)用于从输入流中读取下一个字节的数据并返回这个字节的整数值0-255当调用 read(int b) 方法时它会从输入流中读取下一个字节的数据并将这个字节的整数值返回如果成功读取到数据返回值是表示该字节的整数值0-255如果已经到达流的末尾即没有更多可用的数据可读取此时返回值是 -1这个方法的返回值是一个整数范围在 0 到 255 之间表示读取到的字节的值。如果返回 -1表示已经读取到流的末尾没有更多数据可供读取。总之int read(int b) 方法用于逐个读取字节数据并以整数形式返回每个字节的值直到到达流的末尾为止。int read(byte[] b)从输入流中读取数据并将数据存储在缓冲区数组b中它返回实际读取的字节数如果因为已经到达流的末尾而没有更多的数据可读则可能返回小于数组长度的值如果发生I/O错误将抛出IOException。说白了就是fis.read(buffer)方法返回的是实际从输入流中读取的字节数具体来说这个方法的作用是从FileInputStream对象fis中读取数据并将读取到的字节内容存储到指定的字节数组buffer中。当 fis.read(buffer)方法被调用时它会尽可能地读取数据填充到buffer数组中返回实际读取的字节数如果成功读取了数据则返回的是实际读取的字节数如果已经到达文件末尾返回值将是-1。再解释fis.read(buffer) 是一次性读取数据到指定的字节数组buffer中返回值bytesRead是实际读取的字节数而不是总的字节数。如果bytesRead的值等于 buffer的长度表示整个 buffer 数组已经被填满里面包含了读取的数据。如果bytesRead的值小于 buffer的长度表示只有部分数据被读取到 buffer 中。int read(byte[] b, int off, int len)从输入流中读取最多len个字节的数据并将这些数据存储到字节数组b中从数组索引off开始的位置它返回实际读取的字节数如果因为已经到达流的末尾而没有更多的数据可读则返回的字节数可能小于lenvoid close()关闭输入流关闭一个已经关闭的流是合法的调用多次close()方法不会有任何效果一旦流被关闭任何后续尝试从流中读取数据或写入数据都将抛出IOException。2、InputStream类常用的子类有FileInputStream用于从文件中读取数据FileInputStream是Java的一个类它用于从文件中读取原始的字节流当你需要读取文件内容并将其作为字节序列处理时可以使用FileInputStream类。这个类的构造函数FileInputStream(String name)接受一个String类型的参数这个参数是文件在文件系统中的路径名当调用这个构造函数时Java会在指定的路径下打开这个文件并创建一个与这个文件相连接的FileInputStream对象一旦对象被创建你就可以使用它的方法来读取文件内容了。例子 需求读取文件中的内容然后输出import java.io.FileInputStream;
import java.io.IOException;
public class StudyIO {public static void main(String[] args) {String filePath D:/io/hello.txt;FileInputStream fis null;try {// 创建一个FileInputStream对象打开指定路径的文件fis new FileInputStream(filePath);// 创建一个字节数组作为缓冲区byte[] buffer new byte[1024];int bytesRead;// 读取文件内容到缓冲区直到文件末尾while ((bytesRead fis.read(buffer)) ! -1) {// 处理读取到的字节这里只是简单地将它们转换为字符串并打印String data new String(buffer, 0, bytesRead);System.out.print(data); // ------ 打印的是 D:/io/hello.txt 这个hello.txt的内容}} catch (IOException e) {// 处理可能发生的异常如文件未找到或读取错误e.printStackTrace();} finally {// 关闭FileInputStream释放系统资源try {if (fis ! null) {fis.close();}} catch (IOException e) {e.printStackTrace();}}}
}
字节流写数据 字节流抽象基类InputStream这个抽象类是字节输入流的所有类的超类OutputStream这个抽象类是字节输出流的所有类的超类子类名特点子类名称都是以其父类名作为子类名的后缀常用方法
1、OutputStream类的常用方法void write(int c)将指定的字节(通过其整数表示形式)写入文件输出流实际上它会取int参数的低8位(即一个字节)并将其写入文件。FileOutputStream fos new FileOutputStream(example.txt);fos.write(65); // 写入ASCII码为65的字符即Afos.close();void write(byte[] buf)将整个字节数组写入文件输出流。它会写入数组中的每个字节直到数组结束。byte[] data {H, e, l, l, o};FileOutputStream fos new FileOutputStream(example.txt);fos.write(data); // 写入字符串Hello的字节表示fos.close()void write(byte[] b, int off, int len)从字节数组的指定偏移量开始写入指定长度的字节到文件输出流off开始写入的数组中的偏移量len要写入的字节数byte[] data {a, b, c, d, e, f};FileOutputStream fos new FileOutputStream(example.txt);fos.write(data, 2, 3); // 从偏移量2开始写入3个字节即写入cdefos.close();void close()此方法关闭文件输出流一旦流被关闭任何进一步的写操作都会抛出IOException2、OutputStream类常用的子类有FileOutputStream用于向文件中写入数据a. FileOutputStream(String name)创建一个文件输出流以指定的名称写入文件如果文件不存在则尝试创建它如果文件已经存在则其内容将被覆盖。b. FileOutputStream(File file)使用File对象创建一个文件输出流以写入文件。c. FileOutputStream(FileDescriptor fdObj)使用文件描述符创建一个文件输出流文件描述符通常与已经打开的文件相关联。使用FileOutputStream时通常会使用try-with-resources语句来确保流在不再需要时自动关闭这样可以避免资源泄漏。
例子
import java.io.FileOutputStream;
import java.io.IOException;public class StudyIO_2 {public static void main(String[] args) {// String testWriteName test.txt; // 在项目的目录下创建test.txtString testWriteName D:/io/test.txt; // 在指定路径下创建test.txtbyte[] data Hello-World!.getBytes();try(FileOutputStream fos new FileOutputStream(testWriteName)){fos.write(data);System.out.println(Data written to testWriteName);} catch (IOException e){e.printStackTrace();System.out.println(Data written to testWriteName);}}
}
文件复制功能
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {public static void main(String[] args) {/*应该在循环外部创建FileOutputStream因为在循环内部创建的话每次读取到数据块时都会创建一个新的 FileOutputStream 对象这会导致每次迭代时都覆盖 dnf-2.txt 文件的内容。*/FileOutputStream fos null;FileInputStream fis null;try {fis new FileInputStream(D:/io/test.txt);fos new FileOutputStream(D:/io/dnf-2.txt);byte[] buffer new byte[1024];int bytesRead;// 读取文件并写入另一个文件while ((bytesRead fis.read(buffer)) ! -1) {fos.write(buffer, 0, bytesRead); // 写入读取到的数据块}} catch (IOException e) {e.printStackTrace();} finally {try {if (fis ! null) fis.close();if (fos ! null) fos.close();} catch (IOException e) {e.printStackTrace();}}}
}
字节缓冲流 1、BufferedOutputStream该类实现缓冲输出流通过设置这样的输出流应用程序可以向底层输出流写入字节而不必为写入的每个字节导致底层系统的调用。构造方法字节缓冲输出流 BufferedOutputStream(OutputStream out)2、BufferedInputStream创建BufferedInputStream将创建一个内部的缓冲数组当从流中读取或跳过字节时内部缓冲区将根据需要从所包含的输入流中重新填充一次很多字节构造方法字节缓冲输入流 BufferedInputStream(InputStream in)综合1、2为什么构造方法需要的是字节流而不是具体的文件或者路径呢因为字节缓冲流仅仅提供缓冲区而真正的读写数据还得依靠基本的字节流对象进行操作。chatGPT的解释在Java的I/O流框架中BufferedOutputStream 和 BufferedInputStream都是用于提高I/O操作效率的缓冲流。a. 它们的工作原理是在内存中创建一个缓冲区这个缓冲区用于临时存储要写入或读取的数据。当向输出流写入数据时数据首先被写入缓冲区直到缓冲区满或者显式地调用flush()方法才会将数据从缓冲区写入到底层的输出流。当从输入流读取数据时会首先尝试从缓冲区中读取如果缓冲区为空则再从底层输入流中读取数据填充缓冲区。b.构造方法需要字节流(OutputStream 或 InputStream)作为参数而不是具体的文件或路径是因为BufferedOutputStream 和 BufferedInputStream 被设计为通用的缓冲流它们可以与任何实现了OutputStream 或 InputStream 接口的流对象一起使用这意味着它们不仅可以用于文件I/O还可以用于网络通信、内存流(如ByteArrayOutputStream和ByteArrayInputStream)等任何需要进行字节读写的地方。总之BufferedOutputStream(OutputStream out)这里的out参数是一个基本的字节输出流对象它可以是任何类型的输出流比如FileOutputStream用于写入文件SocketOutputStream用于网络通信等BufferedOutputStream会将这个输出流包装起来提供缓冲功能。BufferedInputStream(InputStream in)这里的in参数是一个基本的字节输入流对象它也可以是任何类型的输入流比如FileInputStream用于读取文件SocketInputStream用于从网络读取数据等BufferedInputStream会将这个输入流包装起来提供缓冲功能。
例子 需求有一个source.txt的文件我们想要将其内容复制到一个新的文件target.txt中。代码
import java.io.*;
public class BufferedStreamsExample {public static void main(String[] args) {File sourceFile new File(D:/io/source.txt);File targetFile new File(D:/io/target.txt);try (// 创建BufferedInputStream对象读取源文件BufferedInputStream bis new BufferedInputStream(new FileInputStream(sourceFile));// 创建BufferedOutputStream对象写入目标文件BufferedOutputStream bos new BufferedOutputStream(new FileOutputStream(targetFile));) {// 创建一个字节数组作为缓冲区byte[] buffer new byte[1024];int bytesRead;// 读取源文件的内容到缓冲区直到没有更多的数据可读while ((bytesRead bis.read(buffer)) ! -1){bos.write(buffer, 0, bytesRead);}// 刷新输出流以确保所有数据都被写出bos.flush();System.out.println(文件复制完成);} catch (IOException e){e.printStackTrace();System.out.println(文件复制过程中发生错误);}}
}代码讲解
首先创建一个BufferedInputStream来读取source.txt文件的内容创建一个BufferedOutputStream来写入target.txt文件其次使用一个字节数组buffer作为中间缓冲区在循环中不断地从源文件读取数据到缓冲区然后将缓冲区的数据写入目标文件直到源文件的末尾最后调用bos.flush()是为了确保所有缓冲的数据都被写出到底层输出流中。