Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用IO扫描仪/System.out复制视频和照片?_Java_Video_System.out - Fatal编程技术网

Java 如何使用IO扫描仪/System.out复制视频和照片?

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

我使用io scanner/System.out复制文本文件。我尝试用同样的技术复制pdf、视频和图像文件。结果是文件被复制,但已损坏(无法打开)。此外,文件大小不等于原始文件大小

代码

}

p/s:不使用IO其他。(例如:BufferedInput/OutputStream)

存在两个问题(至少):

  • 您可以使用
    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();
            }
        }