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);//正确示例 // } }
Sign in to make a reply
Best of Me