IO流
在设备与设备之间的一种数据传输。
分类
按流的方向分:输入流:读文件 从硬盘上读取出来文件,输入到文件中。
输出流:写文件 将文件的内容读出来,写到盘中新的文件中。
按处理数据类型分为:字节流:字节输入流InputStream 字节输出流:OutputStream
字符流: 字符输入流Reader 字符输出流:Writer
以上4个类都是抽象类,不能直接创建对象,我们只能用他们的子类创建对象。
一些常用的子实现类:FileInputStream,FileOutputStream,FileReader,FileWriter
开发步骤:
①创建字节输出流对象 ②写数据 ③关闭资源
字节输出流
例子:
import java.io.FileOutputStream; public class OutputStream { public static void main(String[] args) throws Exception { //创建字节输出流对象 /** * 1)构造了输出流对象 (系统创建对象) * 2)指向了当前项目下输出fos.txt */ FileOutputStream out = new FileOutputStream("fos.txt"); //写字节 out.write("hello".getBytes()); //关闭资源 /** * 1)将文件和流对象不建立关系了 (fos对象不指向fos.txt) * 2)及时释放掉流对象所占用的内存空间 */ out.close(); } }关于字节输出流写数据的方法
public void write(int b):一次写一个字节
public void write(byte[] b) :一次写一个字节数组
public void write(byte[] b, int off,int len):一次写一部分字节数组
我们在写字节流的时候可以一次写一个字节、可以一次写一个字节数组、可以一次写一部分字节数组。
例子:
import java.io.FileNotFoundException; import java.io.FileOutputStream; public class Test2 { public static void main(String[] args) throws Exception { FileOutputStream out = new FileOutputStream("fos2.txt"); for(int x = 0 ;x < 10 ;x++) { // out.write(("hello"+x+"\n").getBytes());//这样写的兼容性太差了,不同操作系统换行不一定都是\n //一般高级记事本都换行都有效果写入换行符/r/n out.write(("hello"+x).getBytes()); out.write(("\r\n").getBytes()); } out.close(); } }
我们还可以使用这种构造方法指定末尾追加:当append为true时
FileOutputStream(File file, boolean append)
创建一个向指定 File
对象表示的文件中写入数据的文件输出流。这种构造方式当append定义为true时自动添加到末尾。(但是当我把append改成false后怎么还是自动添加到末尾?!)
字节输入流
开发步骤:
1)创建字节文件输入流对象
2)读数据
3)释放资源
public abstract int read():一次读取一个字节
public int read(byte[] b):一次读取一个字节数组 (读取实际的字节数)
代码(一次读取一个字节):
//使用输入流将文件中的adcsupport读出并在控制台打印 FileInputStream fis = new FileInputStream("down.txt") ; int by = 0 ;//必须要给by初始化为0,否则输出会缺少 while((by=fis.read()) != -1) { System.out.print((char)by); } fis.close();
为什么不能直接用fis.read()作为循环的和判断的值而是要先给by初始化为0,然后把fis.read()的值赋给by,遍历输出by的值???
构造方法摘要
构造方法摘要 | |
---|---|
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的 File 对象 file 指定。 |
|
FileInputStream(FileDescriptor fdObj) 通过使用文件描述符 fdObj 创建一个 FileInputStream ,该文件描述符表示到文件系统中某个实际文件的现有连接。 |
|
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的路径名 name 指定。 |
方法摘要
int |
read() 从此输入流中读取一个数据字节。 |
int |
read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 |
int |
read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。 |
void |
close() 关闭此文件输入流并释放与此流有关的所有系统资源。 |
代码(一次读取一个字节数组) :
package IO.file.inputstream; import java.io.FileInputStream; public class InputStreamDemo2 { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream("down.txt") ; //一次读取一个字节数组 //指定字节数组的长度是:1024或者1024的倍数 byte[] by =new byte[1024] ; int length = 0 ; while((length = fis.read(by)) != -1) { System.out.println(new String(by , 0 ,length)); } fis.close(); } }
复制内容
即是从一个文件中读取内容写到另一个文件中。
思路:①封装目的文件和源文件 ②进行边读边写 ③释放资源
代码:
import java.io.FileInputStream; import java.io.FileOutputStream; public class Test { public static void main(String[] args) throws Exception { //创建src和dest的对象 FileOutputStream fileOutputStream = new FileOutputStream("dest.txt"); FileInputStream fileInputStream = new FileInputStream("src.txt"); //遍历fis文件内容并写入fos中 int by = 0 ; while((by=fileInputStream.read()) != -1) { fileOutputStream.write(by); } if(fileOutputStream != null) { fileOutputStream.write(97); } //关闭资源 fileOutputStream.close(); fileInputStream.close(); } }
如果源文件和目的文件不在同一目录中,那么创建流对象时需要加绝对路径。当然,这种复制不仅仅针对的是文本文件,图片也可以,甚至我猜测视频也可以。下面是复制图面的例子:
import java.io.FileInputStream; import java.io.FileOutputStream; public class Test1 { public static void main(String[] args) throws Exception { //创建复制的源文件对象保护伞.jpg和目的文件对象umbrella.jpg FileInputStream fileInputStream = new FileInputStream("保护伞.jpg"); FileOutputStream fileOutputStream = new FileOutputStream("umbrella.jpg"); byte[] byt = new byte[1024] ; int len = 0 ; while((len=fileInputStream.read(byt)) != -1 ) {//注意这里的read方法是有参的,作用是读取byt长度的字节 fileOutputStream.write(byt , 0 , len); } fileOutputStream.close(); fileInputStream.close(); } }
的