FileInputStream&FileOutputStream

本文深入讲解Java中的IO流概念,包括InputStream和OutputStream的基本使用,字节流与字符流的区别,以及FileInputStream和FileOutputStream的具体操作方法,如写入字符、读取文件内容,并通过实例演示如何复制文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java IO

InputStream:输入流
OutputStream:输出流

java中的流分为 :
低级流 :数据有明确来源和去向.
高级流(过滤流,处理流):不能独立存在,必须依托于另一个流.使用高级流是为了简化读写操作.

根据读写的数据单位通常分为字节流和字符流
字节流:以字节为单位读写数据
字符流:以字符为单位读写数据

文件字节输入输出流:
FileInputStream:文件输入流 (从文件中读取)
FileOutPutStream:文件输出流(向文件中写)

FileOutputStream:写方法
write(int d):一次写一个字节,写int的低8位
write(byte[]d):一次将字节数组中所有字节写出
write(byte[] d,int offset,int len):一次将字节数组中从offset开始连续写len个字节
用法与RandomAccessFile的写方法一样

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 文件输出流
 * FileOutputStream是一个节点流.数据有明确的来源
 * 来自文件 且他是一个字节流,以字节为单位写出数据
 * @author Administrator
 *
 */
public class FileOutPutStreamDemo {

	public static void main(String[] args) throws IOException {
		File file=new File("output.dat");//创建File实例
		if(!file.exists()){file.createNewFile();}//不存在就创建一个
		
		//创建一个用于写文件的输出流
		//java.io.FileOutputStream
		FileOutputStream fos=new FileOutputStream(file);//FileOutputStream 实例
		//写入一个字符a
		//write(int d):一次写一个字节,写的是int的低8位
		
		fos.write('a');//写入基本与RandomAccessFile无二致
		fos.close();
		

	}

}

将String转为byte[]并且写入文件

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 使用输出流写字符串到文件中
 * @author Administrator
 *
 */
public class FileOutputStreamWriteString {

	public static void main(String[] args) throws IOException {
		File file=new File("output.dat");
		if(!file.exists()){file.createNewFile();}
		
		/**
		 * 重载的构造方法
		 * 第二个参数为一个boolean值
		 * true:允许从文件末尾追加行内容
		 * false:每次从文件开始写(清空上一次的内容)
		 */
		FileOutputStream fos=new FileOutputStream(file,true);//重载方法
		String str="我爱!";
		//将字符串转换为字节数组
		byte[] data=str.getBytes("UTF-8");
		//将字节数组中所有字节一次性写出
		fos.write(data);
		fos.close();
		

	}

}

事实上,并不需要让File实例化,但是!!
要确保给出的是一个文件以及有可以创建文件的权限!!!
不能是目录以及无创建文件的权限.

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutPutStreamDemo2 {

	public static void main(String[] args) throws IOException {
		//可以根据字符串指定路径,对该文件进行操作
		FileOutputStream fos=new FileOutputStream("outDemo.txt",true);
		fos.write('A');
		fos.write('B');
		fos.close();

	}

}

FileIntputStream 文件输入流 以字节为单位读取数据
intread():一次读取一个字节,返回的int值只有低八位有效,若返回的值为-1说明EOF
int read(byte[] d): 一次读取一个byte[] ,返回值是读取了多少个byte值.
int read(byte[] d,int offset,intlen):尝试读取len个字节,存入给定数组,存入位置从offset开始,返回值为实际读取的字节数.
例如:
文件中的内容{0,1,2,3,4,5,6,7,8,9}
byte[] b=new byte[10];
int sum=fis.red(b,1,8); 返回的sum是8
b= ==>{0,0,1,2,3,4,5,6,7,0}

FileInputStream

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * FileInputScream读取文件内容
 * @author Administrator
 *
 */
public class FileInputStreamDemo {

	public static void main(String[] args) throws IOException {
		File file=new File("output.txt");
		FileInputStream fis=new FileInputStream(file);
		
//			for(int d=-1;;){
//				if((d=fis.read())!=-1){
//					System.out.print(Integer.toHexString(d)+" ");
//				}else{break;}
//			}
		
		
//		byte[] buf=new byte[102];
//		int sum=fis.read(buf);
//		//字符串重载构造方法
//		//String(byte[] data,int offset,int len,String charset)
//		String str=new String(buf,0,sum,"UTF-8");
		
		//根据操作的文件对象,获取文件大小并创建字节数组
		byte[] buf=new byte[(int)file.length()];
		fis.read(buf);
		String str=new String(buf,"utf-8");
		System.out.println(str);
		fis.close();

	}

}

FileInputStream也有一个重载方法

import java.io.FileInputStream;
import java.io.IOException;

/**
 * FileInputStream的重载构造方法
 * FileInputStream(String filename)
 * 根据字符串描述的文件路径,读取该文件
 * @author Administrator
 *
 */
public class FileInputStreamDemo2 {

	public static void main(String[] args) throws IOException {
		//文件不存在直接报错
		FileInputStream fis=new FileInputStream("output.txt");
		/**
		 * FileInputStream的方法
		 * int available():返回当前输入流允许读取的总字节量
		 * 这里就相当于是文件的大小
		 * 注意,该方法是InputStream中定义的,就是说所有的输入流都有该方法.但是实现上有细微差别,
		 * 不建议使用该方法将字节数组的长度定为返回值
		 */
		byte[] buf=new byte[fis.available()];
		fis.read(buf);
		String str=new String(buf,"UTF-8");
		System.out.println(str);
		fis.close();

	}

}

使用文件输入输出流复制文件

>import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyDemo2 {

	public static void main(String[] args) throws IOException {
		FileInputStream fis=new FileInputStream("o.jar");
		FileOutputStream fos=new FileOutputStream("o1.jar");
		byte[] buf=new byte[1024*10];
		for(int i=0;;){
			if((i=fis.read(buf))>0){
				fos.write(buf,0,i);
			}else{break;}
		}
		
		fis.close();
		fos.close();
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值