上传文件和下载文件(Java程序操作硬盘数据)
IO流是进行数据间传输的
流向(参照物 :程序)
输入 读 Reader
输出 写 write
数据类型
字节流
字节输入流 读取数据 InputStreame(抽象类)
字节输出流 写入数据 OutPutStreame(抽象类)
字符流
字符输入流 读取数据 Reader(抽象类)
FileOutputStream(File file)
字符输出流 写入数据 write(抽象类)
若文本文件能读懂就用字符流,其中字符流是以字节流为基础的
三: FileOutputStream(字节输出流OutPutStreame的子类)的构造方法
FileOutputStream(String name)
package io; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * IO流是进行数据间传输的 * 流向(参照物 :程序) * 输入 读 Reader * 输出 写 write * 数据类型 * 字节流 * 字节输入流 读取数据 InputStreame * 字节输出流 写入数据 OutPutStreame * 字符流 * 字符输入流 读取数据 Reader * 字符输出流 写入数据 write * * 若文本文件能读懂就用字符流,其中字符流是以字节流为基础的。 * * 需求:需要往一个文本文件中输入一hello io; * FileOutputStream的构造方法 * FileOutputStream(File file) * FileOutputStream(String name) */ public class FileOutputStreamDemo { public static void main(String[] args) throws IOException { /*//第一种构造方法FileOutputStream(File file) File file = new File("file.txt"); FileOutputStream fos = new FileOutputStream("file");*/ //第二种构造方法 FileOutputStream fos = new FileOutputStream("file.txt"); /* * 创建字节输出流对象做了几件事情 * A: 调用系统功能去创建文件 * B:创建fos对象 * C:把fos对象指向这个文件 * */ fos.write("hello.io".getBytes()); //释放资源 //关闭此文件输出流并释放与此流有关的所有系统资源 fos.close(); //为什么要用close()那? //A:让流对象变成垃圾,因为这样就能被垃圾回收器回收啦。 //B:通知系统去释放跟该文件相关的资源 } }
四:字节流写数据的三种方式
public void write(int b) 写一个字节
public void write(byte[] b) 写一个字节数组
public void write(byte[] b,int off,int len) 写一个字节数组的一部分
五:字节流写数据常见的几个问题
1)创建字节输出流到底做了哪些事情?
A : 创建字节输出流对象 B:写数据 C:释放资源
2)数据写成功后,为什么要close()?
A:让流对象变成垃圾,因为这样就能被垃圾回收器回收啦 B:通知系统去释放跟该文件相关的资源
3)如何实现数据的换行?
windows:\r\n linux:\n Mac:\r 而一些高级记事本软件可以识别任意换行符号。
4)如何实现数据的追加写入?
用构造方法带第二个参数是true的情况即可。
FileOutputStream fos = new FileOutputStream("fos.txt",ture);
六 字节输入流操作步骤
A:创建字节输入流对象
B:调用read()方法读取数据,并把数据显示在控制台
C:释放资源
七 读取数据的方式
package io; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * 字节输入流操作步骤 * A:创建字节输入流对象 * B:调用read()方法读取数据,并把数据显示在控制台 * C:释放资源 * 读取的方法 * public int read() 一次读取一个字节 * public int read(byte[] b) 一次读取一个字节数组 */ public class IoDemo04 { public static void main(String[] args) throws IOException { //创建字节输入流对象 FileInputStream fis = new FileInputStream("fos.txt"); //调用read()方法读取数据,并把数据显示在控制台 int red = 0; //读取 赋值 判断 while((red = fis.read())!= -1){ System.out.print((char)red); } //释放资源 fis.close(); } }
八 练习题
package io; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * 1 把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 * 先读 FileInputStream a.txt * 后写 FileoutputStream b.txt * 2 把c:\\a.txt内容复制到h:\\b.txt中 * 3 把f:\\华清宫.jpg内容复制到当前项目目录下的mn.jpg中 * 4 把f:\\哥有老婆.mp4复制到当前项目目录下的copy.mp4中 */ public class IoDemo05 { public static void main(String[] args) throws IOException { /* 第一题 封装数据源 FileInputStream fis = new FileInputStream("a.txt"); 封装目的地 FileOutputStream fos = new FileOutputStream("b.txt"); //1 把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 //先读取 int red =0; while ((red = fis.read())!= -1){ //再写入 fos.write(red); }*/ /**********************************************************************/ /*第二题 把c:\\a.txt内容复制到h:\\b.txt中 封装数据源 FileInputStream fis = new FileInputStream("c:\\a.txt"); 封装目的地 FileOutputStream fos = new FileOutputStream("h:\\b.txt"); //先读取 int red =0; while ((red = fis.read())!=-1){ //再写入 fos.write(red); }*/ /**********************************************************************/ /*第三题 把f:\\华清宫.jpg内容复制到当前项目目录下的mn.jpg中 FileInputStream fis = new FileInputStream("f:\\华清宫.jpg"); FileOutputStream fos = new FileOutputStream("mn.jpg"); //先读取 int red =0; while ((red = fis.read())!=-1){ //再写入 fos.write(red); }*/ /**********************************************************************/ // 第四题 // 把f:\\哥有老婆.mp4复制到当前项目目录下的copy.mp4中 FileInputStream fis = new FileInputStream("f:\\哥有老婆.mp4"); FileOutputStream fos = new FileOutputStream("copy.mp4"); //先读取 int red =0; while ((red = fis.read())!=-1){ //再写入 fos.write(red); } //释放资源 fis.close(); fos.close(); } }
九:注意:计算机中中文的存储分两个字节
第一个字节肯定是负数
第二个字节常见的是负数,可能有正数,但是没影响
package io; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * 一次读取一个字节数组 int read(byte[] b) int是实际读取的数据个数 */ public class IoDemo06 { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("TransLog.java"); // FileOutputStream fos = new FileOutputStream("zxx.txt"); /* //第一次读取 byte[] by = new byte[5]; int len = fis.read(by); System.out.println(len); System.out.println(new String(by)); //第二次读取 len = fis.read(by); System.out.println(len); System.out.println(new String(by)); //第三次读取 len = fis.read(by); System.out.println(len); System.out.println(new String(by));*/ //释放资源 byte[] by = new byte[1024]; int len = 0; while((len = fis.read(by))!= -1){ System.out.print(new String(by, 0,len)); } fis.close(); // fos.close(); } }十 带缓冲区的字节类,这种类又被称为缓冲类(高效类)
BufferedOutputStream 写数据
BufferedInputStream 读数据
构造方法可以指定缓冲区的大小,默认缓冲区的大小就足够了
为什么不传递一个具体的文件或文件路径,而是传递OutputStream对象呢?
原因很简单,字节缓冲区流仅仅提供缓冲区,为高效设计的,但是呢,真正的读写操作还是靠基本的流对象实现。