首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在java中将wav文件从一个目录复制到另一个目录?

如何在java中将wav文件从一个目录复制到另一个目录?
EN

Stack Overflow用户
提问于 2012-07-26 11:57:54
回答 1查看 1.7K关注 0票数 0

在我的程序中,我在描述如何将文件从远程服务器复制到本地计算机的JSch包的文档中使用了JSch的改编。虽然程序似乎正常工作,但文件在复制过程中似乎已损坏,当我试图从bash播放它们时,我会收到一个错误,即"play formats:无法打开输入文件‘79_97_729.wav’:WAVE: RIFF header not“。

我的复制方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void copyFile(File file, String newName) throws JSchException, IOException{

    String prefix = null;
    if (new File(destination).isDirectory()){
        prefix = destination + File.separator;
    }

    JSch jsch = new JSch();
    Session session = jsch.getSession("username", "network");
    session.setUserInfo(new MyUserInfo());
    session.connect();

    String command = "scp -f " + file.getAbsolutePath();
    Channel channel = session.openChannel("exec");
    ((ChannelExec)channel).setCommand(command);

    OutputStream out = channel.getOutputStream();
    InputStream in = channel.getInputStream();

    channel.connect();

    byte[] buf = new byte[1024];

    // send '\0'
    buf[0]=0; out.write(buf, 0, 1); out.flush();

    while(true){
        int c=checkAck(in);
        if(c!='C'){
            break;
        }

        // read '0644 '
        in.read(buf, 0, 5);

        long filesize=0L;
        while(true){
            if(in.read(buf, 0, 1)<0){
                // error
                break;
            }
            if(buf[0]==' ')break;
            filesize=filesize*10L+(long)(buf[0]-'0');
        }

        // send '\0'
        buf[0]=0; out.write(buf, 0, 1); out.flush();

        // read a content of lfile
        fos=new FileOutputStream(prefix == null ? destination : prefix + newName);
        int foo;
        while(true){
            if(buf.length<filesize) foo=buf.length;
            else foo=(int)filesize;
            foo=in.read(buf, 0, foo);
            if(foo<0){
                // error
                break;
            }
            fos.write(buf, 0, foo);
            filesize-=foo;
            if(filesize==0L) break;
        }
        fos.close();
        fos=null;

        // send '\0'
        buf[0]=0; out.write(buf, 0, 1); out.flush();
    }

    session.disconnect();
}

对于我复制的文件是wav格式的事实,我可以做一些调整来控制吗?任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2012-07-26 13:03:23

这就是我所用的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.regex.Pattern;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class Scp {
    private static final Logger log = LoggerFactory.getLogger( Scp.class );
    private static final Pattern validMode = Pattern.compile( "^[0-8]{3,4}$" );
    private Session session;
    private String message;
    private String mode = "0664";
    private int bufferSize = 1024;

    public Scp( Session session ) {
        log.trace( "creating scp object" );
        this.session = session;
    }

    public String getMessage() {
        return message;
    }

    public String getMode() {
        return mode;
    }

    public int send( String localPath, String remotePath )
            throws JSchException, IOException {
        log.trace( "copying '{}' to '{}'", localPath, remotePath );
        int ack = 0;

        Channel channel = null;
        try {
            channel = session.openChannel( "exec" );
            ((ChannelExec) channel).setCommand( new StringBuilder( "scp -p -t " )
                    .append( remotePath ).toString() );
            OutputStream channelOut = channel.getOutputStream();
            InputStream channelIn = channel.getInputStream();

            channel.connect();

            if ( (ack = checkAck( channelIn )) != 0 ) return ack;

            File localFile = new File( localPath );
            channelOut.write( new StringBuilder( "C" )
                    .append( mode )
                    .append( " " )
                    .append( localFile.length() )
                    .append( " " )
                    .append( localFile.getName() )
                    .append( "\n" )
                    .toString().getBytes() );
            channelOut.flush();

            if ( (ack = checkAck( channelIn )) != 0 ) return ack;

            FileInputStream fileIn = new FileInputStream( localFile );
            try {
                byte[] buffer = new byte[bufferSize];
                int bytesRead;
                while ( (bytesRead = fileIn.read( buffer, 0, bufferSize )) >= 0 ) {
                    channelOut.write( buffer, 0, bytesRead );
                }

                // finish the stream by writing a null terminator
                buffer[0] = 0;
                channelOut.write( buffer, 0, 1 );
                channelOut.flush();
            }
            finally {
                if ( fileIn != null ) {
                    try {
                        fileIn.close();
                    }
                    catch ( Exception e ) {
                        log.warn( "failed to close filehandle: {}", e );
                    }
                }
                fileIn = null;
            }

            if ( (ack = checkAck( channelIn )) != 0 ) return ack;
        }
        finally {
            if ( channel != null && channel.isConnected() ) {
                channel.disconnect();
            }
        }

        message = "success";
        return ack;
    }

    private int checkAck( InputStream in ) throws IOException {
        int b = in.read();

        if ( b == 1 || b == 2 ) {
            StringBuilder builder = new StringBuilder();
            int c;
            while ( (c = in.read()) != '\n' ) {
                builder.append( (char) c );
            }
            message = builder.toString();
        }

        return b;
    }

    public void setBufferSize( int bufferSize ) {
        this.bufferSize = bufferSize;
    }

    /**
     * Sets the mode of the destination file. By default, it is 0664.
     * 
     * @param mode
     *            The mode to set the destination file to.
     */
    public void setMode( String mode ) {
        if ( !validMode.matcher( mode ).matches() ) {
            throw new IllegalArgumentException( "invalid mode, must be 3 or 4 octal numbers (/^[0-8]{3,4}$/)" );
        }
        this.mode = (mode.length() == 3) ? ("0" + mode) : mode;
    }
}

它为所有类型的媒体传输提供了可靠的服务。

下面是一个单元测试,演示了这对于wav文件是有效的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import static org.junit.Assert.assertTrue;


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;


import javax.crypto.NoSuchPaddingException;


import org.junit.Test;
import org.mitre.asias.sch.Scp;


import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;


public class ScpTest {
    @Test
    public void testScpWav() throws JSchException, IOException, NoSuchAlgorithmException, NoSuchPaddingException {
        String dotSshDir = "C:/Cygwin/home/me/.ssh";
        JSch jsch = new JSch();
        jsch.setKnownHosts( dotSshDir + "/known_hosts" );
        jsch.addIdentity( dotSshDir + "/id_dsa" );

        Session session = jsch.getSession( "me", "localhost" );
        session.connect();

        Scp scp = new Scp( session );
        scp.send( "data/SpeechOn.wav", "/tmp/" );

        assertTrue( Arrays.equals( readFileFully( "data/SpeechOn.wav" ), readFileFully( "C:/Cygwin/tmp/SpeechOn.wav" ) ) );
    }

    public byte[] readFileFully( String fileName ) throws IOException {
        InputStream is = null;
        try {
            is = new FileInputStream( new File( fileName ) );
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();

            int nRead;
            byte[] data = new byte[16384];

            while ( (nRead = is.read( data, 0, data.length )) != -1 ) {
                buffer.write( data, 0, nRead );
            }

            buffer.flush();

            return buffer.toByteArray();
        }
        finally {
            if ( is != null ) {
                is.close();
            }
        }

    }
}

您应该能够对这个单元测试进行适当的修改,修改您的dotSshDir源文件/目标文件的位置,它应该可以工作。对我来说是的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11677087

复制
相关文章
java 把文件从一个目录复制到另一个目录
方法一:简单粗暴,直接使用copy(),如果目标存在,先使用delete()删除,再复制;
崔笑颜
2020/06/08
1.9K0
java从一个目录拷贝文件到另一个目录下
** * 复制单个文件 * @param oldPath String 原文件路径 如:c:/fqf.txt * @param newPath String 复制后路径 如:f:/fqf.txt * @return boolean */ public void copyFile(String oldPath, String newPath) { try { int bytesum = 0; int byteread = 0; File oldfile = new File(oldPath
shirayner
2018/08/10
9980
golang把文件复制到另一个目录
//本程序 主要功能是把A文件夹下的文件与B目录下文件对比,如果找到就覆盖到B相应的目录下。 // 用法: merge A目录 B目录 // merge.go package main import ( "flag" "fmt" "os" "path/filepath" "strings" "time" "github.com/Unknwon/com" ) const ( IsDirectory =
李海彬
2018/03/27
1.2K0
golang把文件复制到另一个目录
//本程序 主要功能是把A文件夹下的文件与B目录下文件对比,如果找到就覆盖到B相应的目录下。 // 用法: merge A目录 B目录 // merge.go package main import ( "flag" "fmt" "os" "path/filepath" "strings" "time" "github.com/Unknwon/com" ) const ( IsDirectory =
李海彬
2018/03/27
2.1K0
Java_io_02_从一个目录拷贝文件到另一个目录下
java从一个目录拷贝文件到另一个目录下   http://www.cnblogs.com/langtianya/p/4857524.html
shirayner
2018/08/10
4810
java文件夹复制到指定目录
版权声明:本文为博主原创文章,未经博主允许不得转载。 最近一个项目需要文件夹复制 废话不说上代码 public class FileUtils { public static void copy(File orig, File dest) { // 用于改后缀后复制 BufferedReader buf = null; PrintWriter out = null; try { buf = new BufferedReader(new InputStrea
DencyCheng
2018/11/05
4.1K0
如何在SQL Server中将表从一个数据库复制到另一个数据库
在某些情况下,作为DBA,您需要将模式和特定表的内容从数据库复制到同一实例中或在不同的SQL实例中,例如从生产数据库中复制特定表到开发人员以进行测试或排除故障。 SQL Server提供了许多方法,可以用来执行表的数据和模式复制过程。为了研究这些方法中的每一个,我们将考虑下面的场景: 托管SQL服务器:localhost。这两个数据库都驻留在同一个SQL Server 2014实例中。 源数据库:AdventureWorks2012。 目标数据库:SQLShackDemo。 将从源数据库复制到目标数据库的表
程序你好
2018/07/20
8.3K0
java删除文件目录及文件_Java删除文件,目录
Today we will look into Java delete file and java delete directory examples. Earlier we learned how to create a file in java.
全栈程序员站长
2022/09/06
4.5K0
flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中?
由于keys返回 map 键的Iterable<String>,因此您可以使用where方法检查所需的键,然后可以基于旧 map 值填充值。
徐建国
2021/08/30
1.4K0
Linux之将目录bind到另一个目录
    注意,这个和软连接是不一样的. 记录下. List-1 [xx@xxxx]# more /etc/fstab ... 目录A 目录B none rw,bind 0 0 ...     这俩个目录要手动创建,之后执行mount -a     这样写入目录B其实操作就是目录A
克虏伯
2019/12/31
1.4K0
java目录删除_java删除文件及目录[通俗易懂]
public void del(String filepath) throws IOException{
全栈程序员站长
2022/09/05
3.7K0
列举出linux文件和目录常用的命令_linux复制文件到另一个目录
pwd 是 Print Working Directory 的缩写,也就是显示目前所在目录的命令。
全栈程序员站长
2022/09/19
3.5K0
文件、目录_文件目录表
文件是一种抽象机制,它提供了一种方式用来存储信息以及在后面进行读取。可能任何一种机制最重要的特性就是管理对象的命名方式。
全栈程序员站长
2022/09/20
2.3K0
文件、目录_文件目录表
java 删除目录下所有文件_Java删除文件、目录及目录下所有文件的方法实例
本文主要实现的功能是删除某个目录及目录下的所有子目录和文件,涉及到的知识点:File.delete()用于删除“某个文件或者空目录”!所以要删除某个目录及其中的所有文件和子目录,要进行递归删除。
全栈程序员站长
2022/09/01
3.5K0
linux中将tar压缩文件解压到指定目录
示例 1:将tar文件提取到/tmp/rumenz目录 在第一个示例中,我将解压 rumenz.tar文件到目录/tmp/rumenz。一定要确保/tmp/rumenz目录存在 不存在就创建一个/tmp/rumenz目录 # mkdir /tmp/rumenz 将文件rumenz.tar解压缩到/tmp/rumenz目录 # tar -xvf `rumenz.tar` -C /tmp/rumenz/ 在上面的示例中,我使用-v选项来显示 tar 解压的进度。 使用--directory参数也可以 # t
入门笔记
2022/06/02
37.5K0
如何在 Linux 中将主目录移动到新分区或磁盘?
如果您是 Linux 新手或打算放弃 Windows 并切换到 Linux 的人,那么本文将对您很有用,这篇分步文章将引导您完成在 Linux 中将主目录移动到新分区或驱动器的过程。
网络技术联盟站
2022/03/02
3.3K0
如何在 Linux 中将主目录移动到新分区或磁盘?
antd 如何在 src目录下 引入 Public 目录下的文件
useMemo 计算结果是 return 回来的值, 主要用于 缓存计算结果的值 ,应用场景如: 需要 计算的状态
憧憬博客
2020/07/27
2.9K0
msbuild 修改 VisualStudio 文件复制到输出目录的路径
在默认的 VisualStudio 可以右击任意的文件,让这个文件在编译时复制到输出目录,但是这个选项将会在复制到输出目录时带上这个文件所在 VisualStudio 的文件夹结构。本文告诉大家几个方法让 VisualStudio 的文件可以在编译时输出到自定义的任意路径
林德熙
2020/02/17
3.6K1
Java监听目录文件变更
Java 7中提供了java.nio.file.WatchService用来监听文件系统目录变更,用起来还是比较简单的,在这里记录一下。 创建一个WatchService 代码如下: 1 WatchService watcher = FileSystems.getDefault().newWatchService(); 当然一个WatchService是关联着操作系统资源的,需要完全的关闭,所以一般像下面这样写: WatchService watcher = null; try { watcher =
jeremyxu
2018/05/10
4.5K1
linux环境下将某个目录下的文件复制或者移动到另一个目录下[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172231.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/25
5.6K0

相似问题

如何在Java中将特定文件从一个目录复制到另一个目录

12

在Java中将文件从一个目录复制到另一个目录

3415

如何在Java中将整个内容从一个目录复制到另一个目录?

30

在java中将文件从一个目录复制到另一个目录将引发NoSuchFileException。

12

在jenkins中将文件从一个目录复制到另一个目录

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文