JavaSE——day16IO流

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();
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_38930706/article/details/80345316