Discuss / Java / transferTo以外的方法,坑和错误总结

transferTo以外的方法,坑和错误总结

Topic source

Best of Me

#1 Created at ... [Delete] [Delete and Lock User]


		try (InputStream input = new FileInputStream(source); OutputStream output = new FileOutputStream(target)) {

			// 方法1:transferTo复制法,最简单不容易出错

//			input.transferTo(output);

			// 方法2:输入到缓存区再输出,中文正常输出

//			byte[] buffer = new byte[1000];//一次读取1000字节

//			int i =input.read(buffer);

//			while (i != -1) {//用for循环可以避免遗漏更新计时器进入死循环;

//				output.write(buffer, 0, i);//写入到输入代码的结束,避免把byte数组的空字符串也写入

//				i = input.read(buffer);//这行代码没写会进入死循环;

//			}

//			方法3:转字符串再输出-中文乱码

//			StringBuilder sbd=new StringBuilder(2000);

//			byte[] buffer=new byte[2000];

//			int i=input.read();

//			while(i!=-1){

//				sbd.append((char)i);//因为utf-8字符编码下一个中文占用3个字节,char只有2个字节强制转型,精度丢失,所以导致乱码

//				i=input.read();//又忘记更新计时器!!!

//			}

//			buffer=sbd.toString().getBytes();

//			output.write(buffer);

//			方法4:一个个字节边写边读,中文正常输出

//			int i;

//			while((i=input.read())!=-1) {

//			output.write(i);

//			}

			// 错误示例1:乱码输出,问题在于56行读了一次,57行又读了一次导致读入数据不连续,应该用i代替

//			while(input.read()!=-1) {

//			output.write(input.read());

//			}

			// 错误示例2:错误原因,没有控制停止输出,结尾会有乱码

//			byte[] buffer = new byte[1000];

//			int m;

//			int i;

//			for (i = 0; (m = input.read()) != -1; i++) {

//				buffer[i] = (byte) m;

//			}

//			 output.write(buffer);//错误示例

			// output.write(buffer,0,i);//正确示例

//			}

		}


  • 1

Reply