FileOutputStream
FileOutputStream 文件输出流,作用:把内存中的数据写入到硬盘的文件中.
写入数据的原理(内存–>硬盘)
java程序 -->JVM虚拟机–>os(操作系统)–>os调用写数据的方法 --> 把数据写入到文件中
构造方法:
-
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
-
FileOutputStream(File file)创建一个向指定File对象表示中写入数据的文件输出流。
参数:写入数据的目的地
String name:目的地是一个文件的路径
File file:目的地是一个文件
构造方法的作用:
1.创建一个FileOutputStream对象
2.会根据构造方法中传递的文件/文件路径,创建一个空的文件
3.会把FileOutputStream对象指向创建好的文件
字节输出流的使用步骤
1.创建一FileOutputStream对象,构造方法中传递写入数据的目的地
2.调用FileOutputStream对象中的方法write,把数据写入到文件中
3.释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提供程序的效率)
//1.创建一FileOutputStream对象,构造方法中传递写入数据的目的地
FileOutputStream fileOutputStream = new FileOutputStream("D://upload/a.txt");
//2.调用FileOutputStream对象中的方法write,把数据写入到文件中
fileOutputStream.write(323332221);//因为是字节流把十进制整数转二进制整数,输出时系统会自动把字节转字符的是{
//3.释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提供程序的效率)
fileOutputStream.close();
一次写多个字节的方法
FileOutputStream fileOutputStream2 = new FileOutputStream("D://upload/b.txt");
//write(byte[] b)
//如果写的第一个字节是正数(0-127),那么显示的时候查询ASCII表
//如果写的第一个字节是负数,他和第二个字节组成一个中文.查询的是系统的面容码表gbk
byte[] bytes = {65, 66, 67};//表示ABC
fileOutputStream2.write(bytes);//因为是字节流把十进制整数转二进制整数,输出时系统会自动把字节转字符的是{
//String中 byte[] getBytes()方法可以把字符串转成字节数组
fileOutputStream2.write(",什么妖魔鬼怪".getBytes());//gbk一个中文两个字节,utf-8 一个中文三个字节
fileOutputStream2.close();
追加写,两个参数的构造方法
-
FileOutputStream(String name,boolean append)
创建一个向具有指定name的文件中写入数据的输出文件流 -
FileOutputStream(File file,boolean append)
创建一个向指定File对象表示的文件中写入数据的文件输出流
参数
String name,File file :写入数据的目的地
boolean append:追加开关
true:创建对象不会覆盖源文件,继续在文件的末尾追加写数据
false:创建一个新文件,覆盖源文件
写换行:写换行符 windows:\r\n linux:/n mac:/r
FileOutputStream fileOutputStream3 = new FileOutputStream("D://upload/b.txt", true);
fileOutputStream3.write("\r\n".getBytes());
fileOutputStream3.write("追加的数据".getBytes());
fileOutputStream3.close();
FileInputStream
FileInputStream:文件字节输入 作用:把硬盘文件中的数据,读取到内存中使用
读取数据的原理(硬盘–>内存)
java程序–>JVM–>OS–>OS读取数据的方法–>读取文件
构造方法:
- FileInputStream(String name)
- FileInputStream(File file)
参数:读取文件的数据源
String name:文件的路径,File file:文件
字节输入流的使用步骤
1.创建FileInputStream对象,构造方法中绑定要读取的数据源
2.使用FileInoutStream对象中的方法read,读取文件
3.释放资源
注意:如果文件是utf-8的中文 会乱码
//1.创建FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fileInputStream = new FileInputStream("D://upload/b.txt");
//2.使用FileInoutStream对象中的方法read,读取文件
//int read()读取文件中的一个字节并返回,读取到文件定位末尾返回-1
int len =fileInputStream.read();
System.out.println(len);
int len2 =fileInputStream.read();
System.out.println(len2);
//3.释放资源
fileInputStream.close();
通过while循环读取全部字节
int len3 = 0;//记录读取到的字节
while((len3 = fileInputStream.read())!=-1){
System.out.println(len3);
}
再优化:int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
可以每次读多个一般设为1024(1k)
补充:String构造方法
String(byte[] b)把字节数组转换为字符串
String(byte[] b, int offset, int lenth)把字节数组的一部分转换为字符串, offset:数组的开始索引,length:转换的字节长度.
byte[] bytes1 =new byte[2];
int len4=fileInputStream.read(bytes1);
System.out.println(len4);//2
System.out.println(Arrays.toString(bytes1));//[65,66]
System.out.println(new String(bytes1));//AB
字节数组方式:通过while循环读取全部字节
byte[] bytes2= new byte[1024];//储存读取到的多个字节
int len5 = 0;//记录每次读取到的有效字节个数
while((len5 = fileInputStream.read(bytes2))!=-1){
System.out.println(new String(bytes2,0,len5));
}
通过输入输出完成文件复制
//文件复制D://upload/0d552d5a53bf49d68983fb82b9879009.jpg-->D://upload/b.jpg
FileInputStream fileInputStream5 =new FileInputStream("D://upload/0d552d5a53bf49d68983fb82b9879009.jpg");
FileOutputStream fileOutputStream5 =new FileOutputStream("D://upload/b.jpg");
// int len6 = 0;//记录读取到的字节
while((len6 = fileInputStream5.read())!=-1){
fileOutputStream5.write(len6);
}
//字节数组缓存 使复制效率提高
byte[] bytes7= new byte[1024];//储存读取到的多个字节
int len7 = 0;//记录每次读取到的有效字节个数
while((len7 = fileInputStream5.read(bytes7))!=-1){
fileOutputStream5.write(bytes7,0,len7);
}
//先关闭输出,再关闭输入,
fileOutputStream5.close();
fileInputStream5.close();
}