Java 如何使用IO扫描仪/System.out复制视频和照片?
我使用io scanner/System.out复制文本文件。我尝试用同样的技术复制pdf、视频和图像文件。结果是文件被复制,但已损坏(无法打开)。此外,文件大小不等于原始文件大小 代码 } p/s:不使用IO其他。(例如:BufferedInput/OutputStream)存在两个问题(至少):Java 如何使用IO扫描仪/System.out复制视频和照片?,java,video,system.out,Java,Video,System.out,我使用io scanner/System.out复制文本文件。我尝试用同样的技术复制pdf、视频和图像文件。结果是文件被复制,但已损坏(无法打开)。此外,文件大小不等于原始文件大小 代码 } p/s:不使用IO其他。(例如:BufferedInput/OutputStream)存在两个问题(至少): 您可以使用nextLine()读取下一个“\r\n”,'\n','\r','\u2028','\u2029'或'\u0085',并丢弃任何作为行分隔符的内容(一个或两个字符)。由于您甚至没有使用ap
nextLine()
读取下一个“\r\n”
,'\n'
,'\r'
,'\u2028'
,'\u2029'
或'\u0085'
,并丢弃任何作为行分隔符的内容(一个或两个字符)。由于您甚至没有使用append(text).append('\n')
我怀疑这是否能正确复制多行文本,更不用说二进制文件了,因为每个可能的行终止符可能有不同的含义Scanner
和StringBuilder
对二进制数据不安全。作为关于各国的文件:
流中的字节使用底层平台的默认字符集转换为字符
如果输入文件中的任何字节序列无效,例如UTF-8(这是一个常见的默认字符集),它将被一个通用的“无法读取输入”字符悄悄替换。对于文本文件,这可能意味着将“ä”转换为“ä”�', 对于二进制文件,这可能导致整个文件不可用byte[]
api。但是,您也可以使用一个字符集,该字符集在创建扫描仪
和打印流
时接受所有不变的字节序列,如ISO-8859-1;您仍然需要避免使用抑制找到的行分隔符的行API
这应该可以做到:
import java.awt.Desktop;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
/**
* Created for http://stackoverflow.com/a/25351502/1266906
*/
public class CopyFile {
public static void main(String[] args) {
long start = System.currentTimeMillis();
copyFile(new File("H:\\a.pdf"), new File("H:\\b.pdf"));// 2 file input, output
System.out.println(System.currentTimeMillis() - start);
}
public static void copyFile(File input, File output) {
try {
try (FileInputStream inputStream = new FileInputStream(input);
OutputStream outputStream = new FileOutputStream(output)) {
byte[] buffer = new byte[4096];
do {
int readBytes = inputStream.read(buffer);
if (readBytes < 1) {
// end of file
break;
} else {
outputStream.write(buffer, 0, readBytes);
}
} while (true);
}
// Open result
Desktop.getDesktop().open(output);
} catch (Exception e) {
e.printStackTrace();
}
}
}
导入java.awt.Desktop;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.io.PrintStream;
/**
*创建用于http://stackoverflow.com/a/25351502/1266906
*/
公共类复制文件{
公共静态void main(字符串[]args){
长启动=System.currentTimeMillis();
copyFile(新文件(“H:\\a.pdf”)、新文件(“H:\\b.pdf”);//2文件输入、输出
System.out.println(System.currentTimeMillis()-start);
}
公共静态无效复制文件(文件输入、文件输出){
试一试{
try(FileInputStream-inputStream=newfileinputstream(input);
OutputStream OutputStream=新文件OutputStream(输出)){
字节[]缓冲区=新字节[4096];
做{
int readBytes=inputStream.read(缓冲区);
if(readBytes<1){
//文件结束
打破
}否则{
写入(缓冲区,0,读取字节);
}
}虽然(正确);
}
//公开结果
Desktop.getDesktop().open(输出);
}捕获(例外e){
e、 printStackTrace();
}
}
}
在Java 7之前,您需要使用try finally:
public static void copyFile(File input, File output) {
try {
FileInputStream inputStream = new FileInputStream(input);
try {
OutputStream outputStream = new FileOutputStream(output);
try {
byte[] buffer = new byte[4096];
do {
int readBytes = inputStream.read(buffer);
if (readBytes < 1) {
// end of file
break;
} else {
outputStream.write(buffer, 0, readBytes);
}
} while (true);
} finally {
outputStream.close();
}
} finally {
inputStream.close();
}
// Open result
Desktop.getDesktop().open(output);
} catch (Exception e) {
e.printStackTrace();
}
}
publicstaticvoidcopyfile(文件输入、文件输出){
试一试{
FileInputStream inputStream=新的FileInputStream(输入);
试一试{
OutputStream OutputStream=新文件OutputStream(输出);
试一试{
字节[]缓冲区=新字节[4096];
做{
int readBytes=inputStream.read(缓冲区);
if(readBytes<1){
//文件结束
打破
}否则{
写入(缓冲区,0,读取字节);
}
}虽然(正确);
}最后{
outputStream.close();
}
}最后{
inputStream.close();
}
//公开结果
Desktop.getDesktop().open(输出);
}捕获(例外e){
e、 printStackTrace();
}
}
public static void copyFile(File input, File output) {
try {
FileInputStream inputStream = new FileInputStream(input);
try {
OutputStream outputStream = new FileOutputStream(output);
try {
byte[] buffer = new byte[4096];
do {
int readBytes = inputStream.read(buffer);
if (readBytes < 1) {
// end of file
break;
} else {
outputStream.write(buffer, 0, readBytes);
}
} while (true);
} finally {
outputStream.close();
}
} finally {
inputStream.close();
}
// Open result
Desktop.getDesktop().open(output);
} catch (Exception e) {
e.printStackTrace();
}
}