2019/1/13 面向对象与多线程综合实验-输入输出流 教师:段鹏飞
实验 3-实验目的 了解Java中I/O流的概念和种类; 掌握字节流处理和字符流处理,包括File类, InputStream/OutputStream及其子类,Reader/Writer及其子 类; 熟练掌握文件的顺序处理,随机访问处理; 熟悉对象串行化的概念和方法。
实验内容 (1)完善showFileList()方法,实现档案信息浏览,在未讲数据库之前,系统中已存在档案信息放置在Hashtable中,提供新版DataProcessing类,该类实现了对应数据的查找、插入操作。 (2)完善uploadFile()方法,实现档案数据的上传,在未讲网络之前,该方法只需实现在指定目录中读取文件,并将其拷贝至其他目录中,此外还需将相关档案信息写入对应Hashtable中。 (3)完善downloadFile(),实现档案数据下载,目前只需要实现根据档案号,在Hashtable中查找得到文件位置,然后读取文件并将其拷贝至指定目录中。
根据流动方向的不同,流分为输入流和输出流; 对于输入和输出流,由于传输格式的不同,又分为字节流和字符流: 流的类型 根据流动方向的不同,流分为输入流和输出流; 对于输入和输出流,由于传输格式的不同,又分为字节流和字符流: 字节流是指8位的通用字节流,以字节为基本单位,在java.io包中,对于字节流进行操作的类大部分继承于InputStream(输入字节流)类和OutputStream(输出字节流)类; 字符流是指16位的Unicode字符流,以字符(两个字节)为基本单位,非常适合处理字符串和文本,对于字符流进行操作的类大部分继承于Reader(读取流)类和Writer(写入流)类。
Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四) 字节流和字符流 Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四) Java中其他多种多样变化的流均是由它们派生出来的
节点流类型
处理流类型
FileInputStream类的构造方法 构 造 方 法 说 明 FileInputStream(File file) throws FileNotFoundException 使用File对象创建文件输入流对象,如果文件打开失败,将抛出异常 FileInputStream(String name) 使用文件名或路径创建文件输入流对象,如果文件打开失败,将抛出异常
FileInputStream类的常用方法 方 法 原 型 说 明 int read() throws IOException 读取文件中的数据,一次读取一个字节,读取的数据作为返回值返回,如果读到文件末尾则返回-1,有可能抛异常,必须捕捉 int read(byte[] b) 读取文件中的数据,将读到的数据存放到byte型数组中,并返回读取的字节的数量,未读到数据返回-1,有可能抛异常,必须捕捉 void close() 关闭流对象,有可能抛异常,必须捕捉
FileInputStream对象读文件示例1 public class FileInputStreamDemo1 { public static void main(String[] args) { try { File file = new File("test.txt"); //创建文件对象 //使用文件对象创建文件输入流对象,相当于打开文件 FileInputStream fis = new FileInputStream(file); for (int i = 0; i < file.length(); i++) { char ch = (char)(fis.read()); //循环读取字符 System.out.print(ch); } System.out.println(); fis.close(); //关闭流 } catch (FileNotFoundException fnfe) { System.out.println("文件打开失败。"); } catch (IOException ioe) { ioe.printStackTrace();
FileInputStream对象读文件示例2 public class FileInputStreamDemo2 { public static void main(String[] args) { try { File file = new File("test.txt"); //创建文件对象 FileInputStream fis = new FileInputStream(file); //根据文件的字节长度创建字节数组 byte[] buf = new byte[(int)(file.length())]; fis.read(buf); //读取文件中的数据存放到字节数组中 String str = new String(buf); //利用字节数组创建字符串 System.out.println(str); //打印字符串 fis.close(); //关闭流 } catch (FileNotFoundException fnfe) { System.out.println("文件打开失败。"); } catch (IOException ioe) { ioe.printStackTrace(); }
FileOutputStream类的构造方法 构 造 方 法 说 明 FileOutputStream(File file) throws FileNotFoundException 使用File对象创建文件输出流对象,如果文件打开失败,将抛出异常 FileOutputStream(File file, boolean append) 使用File对象创建文件输出流对象,并由参数append指定是否追加文件内容,true为追加,false为不追加,异常情况同上 FileOutputStream(String name) 直接使用文件名或路径创建文件输出流对象,异常情况同上 FileOutputStream(String name, boolean append) 直接使用文件名或路径创建文件输出流对象,并由参数append指定是否追加,异常情况同上
FileOutputStream类的常用方法 方 法 原 型 说 明 void write(int b) throws IOException 往文件中写数据,一次写一个字节,有可能抛异常,必须捕捉 void write(byte[] b) 往文件中写数据,将byte数组中的数据全部写入到文件中,有可能抛异常,必须捕捉 void close() 关闭流对象,有可能抛异常,必须捕捉
FileOutputStream对象写文件示例1 public class FileOutputStreamDemo1 { //在函数内部不进行异常处理,将异常抛出函数外部 public static void main(String[] args) throws IOException String str = "Hello world!"; File file = new File("test.txt"); //创建文件对象 //通过文件对象创建文件输出流对象 //附加第二个参数true,指定进行文件追加,默认为不追加 FileOutputStream fos = new FileOutputStream(file, true); //逐个将字符写入到文件中 for (int i = 0; i < str.length(); i++) fos.write(str.charAt(i)); } fos.close(); //关闭流
FileOutputStream对象写文件示例2 public class FileOutputStreamDemo2 { //在函数内部不进行异常处理,将异常抛出函数外部 public static void main(String[] args) throws Exception String str = "I Love Java"; //通过文件名创建文件输出流对象 FileOutputStream fos = new FileOutputStream("test.txt"); //将字符串转化为字节数组 byte[] buffer = str.getBytes(); //将字节数组中包含的数据一次性写入到文件中 fos.write(buffer); //关闭流 fos.close(); }
FileInputStream/FileOutputStream小结 由于采用字节方式进行数据传输,不必考虑数据的格式问题,这两个类对文件操作的效率较高; 可以使用这两个类完成复制文件的操作。
复制文件示例 public class CopyFileDemo { public static void main(String[] args) throws IOException { File srcFile = new File("src.dat"); //源文件对象 File destFile = new File("dest.dat"); //目标文件对象 if (!(destFile.exists())) { //判断目标文件是否存在 destFile.createNewFile(); //如果不存在则创建新文件 } //使用源文件对象创建文件输入流对象 FileInputStream fis = new FileInputStream(srcFile); //使用目标文件对象创建文件输出流对象 FileOutputStream fos = new FileOutputStream(destFile); byte[] buf = new byte[1024]; //创建字节数组,作为临时缓冲 System.out.println("开始复制文件..."); while (fis.read(buf) != -1) { //循环从文件输入流中读取数据 fos.write(buf); //写入到文件输出流中(注意文件多写) System.out.println("文件复制成功!"); fis.close(); //关闭流 fos.close();
2019/1/13 谢谢