速(尚)学堂第十章IO技术章末作业自写答案

速(尚)学堂第十章IO技术章末作业自写答案

第四次在CSDN发文章,正在学JAVA,学习了第十章IO技术后,对章末作业做了解答,全部手工自己写的,选择题也有一些自己的看法,编码题的话,注释不能写太多不然会显得比较杂乱,如果有大家哪里有疑惑的话可以私信我,大神勿喷哦,嘻嘻!

选择题
1.B //在使用Java IO流实现对文本文件的读写过程中,需要处理的是IOException异常,IOException又有很多子类异常,如FileNotFoundException、FileExistsException等,故选择B答案。
2.BD //在Java的IO操作中,使用flush()方法可以实现手动刷新,每一次都可以将缓冲容器的内容刷新出来。在每次关闭I输出的时候,调用close()方法的时候系统内部也会自动调用一次flush()方法,故答案选BD。
3.B //Reader类提供了read()方法,读取单个字符到输入流中,没有提供read(int n)的重载。Writer类提供了write(int n)方法,表示向输出流中写入字节数为n的某单个字符;还提供了write(String s)的重载,表示向输出流中写入字符串s。故选B答案。
4.C //在java中路径分隔符有两种表示:第一种使用反斜杠“\”表示路径分隔符时,需要加上一个转义符号“\”,即用两个反斜杠(\\)才能表示路径分隔符;第二种就是用正斜杠“/”,一个正斜杠就可表示路径分隔符,故语句2有错。FileWriter是OutputStreamWriter的子类,里面并没有提供writerToEnd(String s)的方法,故语句3有错。综上,该程序有两处错误,分别为语句2和语句3,选C。
5.D //在使用IO流(除字节数组流外)时,需要在使用完以后关闭IO流,原则“后进先关,从外到内”,最后关闭流的时候,会有一个异常要处理,要么手动处理,要么直接抛出,否则会有编译错误,故语句4有错,选D答案。

编码题

  1. 实现字节数组和任何基本类型和引用类型执行的相互转换
    提示:使用ByteArrayInutStream和ByteArrayOutputStream。
package FinalTest;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 1. 实现字节数组和任何基本类型和引用类型执行的相互转换 
 * 提示:使用ByteArrayInputStream和ByteArrayOutputStream。
 * 
 * @author 皮
 *
 */
public class FinalTest01 {

	public static void main(String[] args) {
		convertTest1();
		System.out.println();
		convertTest2();
		System.out.println();
		convertTest3();
	}
	public static void convertTest1() {
		
		String str = "黑曼巴";
		byte[] b1 = str.getBytes();//字符串转换为字节数组,为bais获取源数组
		StringBuilder sb = new StringBuilder("[");
		for(byte b:b1) {
			sb.append(b+",");
		}
		sb.setCharAt(sb.length()-1, ']');
		System.out.println("字符串“黑曼巴”转为字节数组为:"+sb);
		ByteArrayInputStream bais = new ByteArrayInputStream(b1);
		
		byte[] flush = new byte[1024];//缓冲容器,暂存数据
		int len=-1;
		try {//字节数组转换为字符串
			while((len=bais.read(flush))!=-1) {
				String msg = new String(flush,0,len,"gbk");//指定字符集,以防乱码
				System.out.println("将字节数组还原为字符串为:"+msg);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
	}
	//自定义类转、字节数组相互转换
	public static void convertTest2() {
		Kobe k = new Kobe("科比布莱恩特", 24);
		
		ByteArrayOutputStream baos = null;
		ObjectOutputStream oos = null;
		
		ByteArrayInputStream bais = null;
		ObjectInputStream ois = null;
		try {
			baos = new ByteArrayOutputStream();
			oos = new ObjectOutputStream(baos);
			oos.writeObject(k);//自定义类写到字节数组
			StringBuilder sb = new StringBuilder("[");
			for(byte b:baos.toByteArray()) {
				sb.append(b+",");
			}
			sb.setCharAt(sb.length()-1, ']');
			System.out.println("自定义类Kobe转换为字节数组为:"+sb);
			bais = new ByteArrayInputStream(baos.toByteArray());
			ois = new ObjectInputStream(bais);
			if(k instanceof Kobe) {
				Kobe kk;
				try {//字节数组读取到程序,即又还原为自定义类
					kk = (Kobe)ois.readObject();
					System.out.println("将字节数组还原成自定义类:"+kk.getName()+kk.getNumber());
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}
		} catch (IOException e1) {
			e1.printStackTrace();
		}finally {//应该先关闭最外层的包装流,即“后开的先关闭”
			if(ois!=null) {
				try {
					ois.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(bais!=null) {
				try {
					bais.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(oos!=null) {
				try {
					oos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(baos!=null) {
				try {
					baos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void convertTest3() {
		int i = 24;
		char c = 'k';
		boolean b = true;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		DataOutputStream dos = new DataOutputStream(baos);
		try {
			dos.writeInt(i);
			dos.writeChar(c);
			dos.writeBoolean(b);
			StringBuilder sb = new StringBuilder("[");
			for(byte bb:baos.toByteArray()) {
				sb.append(bb+",");
			}
			sb.setCharAt(sb.length()-1, ']');
			System.out.println("这几个基本数据类型转换字节数组为:"+sb);
			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
			DataInputStream dis = new DataInputStream(bais);
			int i1 = dis.readInt();
			char c1 = dis.readChar();
			boolean b1 = dis.readBoolean();
			System.out.println("将字节数组还原为几个数据类型后为:"+i1+","+c1+","+b1);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}
class Kobe implements java.io.Serializable{
	private String name;
	private int number;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public Kobe() {
	}
	public Kobe(String name, int number) {
		super();
		this.name = name;
		this.number = number;
	}
	
}

运行结果:
运行结果
2.这道题还是很有意思的,如果想要进步,真的需要自己从头写到尾,因为也是初学者,所以是根据自己的逻辑来写的,功能能实现,但是没有做进一步的完善和处理一些情况,注释也写不了太多,如果有不懂且需要帮助的小伙伴,请私信我吧,我再详细解释一下为啥这样写。

package FinalTest;

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

/**目录我自己改了
 *  2. 复制文件夹"C:\\JAVAfile测试\\JAVA目录2"下面所有文件和子文件夹内容到"C:\\JAVAfile测试"
 *  提示:涉及单个文件复制、目录的创建、递归的使用
 * @author 皮
 *
 */
public class FinalTest02 {
	public static void main(String[] args) {
		copy(new File("C:\\JAVAfile测试\\JAVA目录2"), new File("C:\\JAVAfile测试"));
	}
	//将src目录下的所有文件目录拷贝到dest中,只实现了拷贝已存在目录的功能,还没有进一步完善
	public static void copy(File src, File dest) {
		File firstFile = dest;// 先产生一个文件对象,目标文件夹的位置
		for (File f : src.listFiles()) {// 获取目录的子孙级文件对象
			if (f.isDirectory()) {// 如果下一级是目录,则将该目录用文件对象记录下来
				String dirName = f.getName();
				
				File dirFile = new File(firstFile, dirName);
				if (!(dirFile.exists())) {// 如果该目录在dest中不存在,则创建它
					dirFile.mkdirs();
				}
				copy(f, src.getParentFile());// 递归调用,需思考一下写哪个文件对象做参数
			}
			if (f.isFile()) {// 如果遍历了是文件的话则直接读取他并写出他,即单个文件的复制
				FileInputStream fis = null;
				FileOutputStream fos = null;
				try {
					fis = new FileInputStream(f);// 输出流,源为该文件
					fos = new FileOutputStream(firstFile.getAbsolutePath() + File.separator + f.getName());// 输入流,输入到目标文件夹并且要包含该文件
					byte[] flush = new byte[1024 * 10];
					int len;
					try {
						while ((len = fis.read(flush)) != -1) {
							fos.write(flush, 0, len);
							fos.flush();
						}
					} catch (IOException e) {
						e.printStackTrace();
					}
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} finally {
					if (fos != null) {
						try {
							fos.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
					if (fis != null) {
						try {
							fis.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}

			}
		}
	}
}

运行结果:
运行结果
3.

package FinalTest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

package FinalTest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

/**目录自己改了
 * 3. 使用IO包中的类读取“C:\JAVAfile测试”中的FinalTest03.txt文本文件的内容,
 * 每次读取一行内容,
 * 将每行作为一个输入放入ArrayList的泛型集合中
 * 并将集合中的内容使用加强for进行输出显示。
 * @author 皮
 *
 */
public class FinalTest03 {
	public static void main(String[] args) {
		File src = new File("C:/JAVAfile测试/FinalTest03.txt");
		InputStreamReader isr = null;
		BufferedReader r = null;
		try {
			isr = new InputStreamReader(new FileInputStream(src),"gbk");
			r = new BufferedReader(isr);
			List<String> list = new ArrayList<>();
			String data = "";
			try {
				while((data=r.readLine())!=null) {
					list.add(data);//list将读取出的一行添加进去
					System.out.println(data);
				}
				System.out.println();
				System.out.println("以下是对list容器的遍历结果:");
				for(String s:list) {
					System.out.println(s);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}finally {//应该先关闭最外层的包装流,即“后开的先关闭”
			if(r!=null) {
				try {
					r.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(isr!=null) {
				try {
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}

运行结果:
运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值