当前位置: 代码迷 >> Android >> FileInputStream.read()的值总为-1的有关问题
  详细解决方案

FileInputStream.read()的值总为-1的有关问题

热度:427   发布时间:2016-04-28 00:29:55.0
FileInputStream.read()的值总为-1的问题
今天我用 java 写了一个 Android  手机 客户端 向  服务器 发送文件的小程序。
大致的步骤是
用 FileInputStream 读取 文件信息
,将 FileInputSTream 的数据 写入一个 byte[ ] 里。
把 byte[ ]的数据  write  到一个 DataOutputStream里,
然后透过 socket 把 DataOutputStream flush 出去,让 server socket 接收后解码输出文件。。

但奇怪的是,我在进行 第二步时 发现 FilieInputStream.read() 返回的数值总是为 -1

首先,我确定 文件的路径是没错的,文件确实存在。
第二,要发送的是一个 3gp 格式的音频文件,为了确定文件路径没错,我特地用一个 MediaPlayer的方法读取了该文件,确定播放成功。。。(代码中的chatting.audioPlay(Path)便是播放 这个文件的方法。。Path是文件的路径。) 

以下是客户端的代码。。烦请协助查找错漏

首先在某一个activity中新建FileTransfer 类(继承Thread),并调用 构造函数,开始发送 录音文件。

 FileTransfer upload=new FileTransfer(path, "192.168.0.117", 1314);
    upload.start();

//path是文件路径,
"1921680.117", "1314"是 服务器IP 和  端口,确定连接正常。

、///、以下是  FileTransfer类及 构造方法  的   源码。


package com.example.start;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.OutputStream;
import java.net.Socket;

import com.example.english.chatting;

import android.util.Log;

public class FileTransfer extends Thread {
 int read;
 Socket sk;
 FileInputStream fis;
 DataOutputStream dataOut;
 public static String hostIP;
 public static int Port;
 public static String Path;
 byte[] fileByte=null;



 public void run(){
 Log.i("11", "sock start");
 fileByte=new byte[1024];

//  chatting.audioPlay(Path);
      //这是我用于测试 路径是否正确的  方法,实现播放 Path路径所指向的 3gp音频文件,试验证明//播放成功,

 try{
 sk=new Socket(hostIP,Port);  
     OutputStream skgos=sk.getOutputStream();
     dataOut=new DataOutputStream(skgos);
     
    try 
    { File file=new File(Path);
     fis=new FileInputStream(file);
    }catch(FileNotFoundException e){Log.v("",e.toString());}
//此处特地把 FileInputStream放到一个 try里执行,为了捕捉 FileNotFoundException ,结果发现没有捕//捉到这个异常,证明文件路径没错  


while((read=fis.read(fileByte,0,fileByte.length))!=-1);
{   
Log.v("read","read"+" "+read);
              //问题出在这里,当我输出 read的时候,发现其为-1


// String aa=fileByte.toString();
// String bb=new String(fileByte,0,fileByte.length);
// Log.i("aa","aa"+"" + aa);
// Log.i("bb",bb);

dataOut.write(fileByte,0,read);}




  dataOut.flush();
  dataOut.close();
 }catch(Exception e){Log.e("sock","sock"+" "+e.toString());}
 
 }
 public FileTransfer(String Path,String hostIP,int Port) 
 {  
this.Path=Path;
this.hostIP=hostIP;
this.Port=Port;

}
 
 }

以下是 chatting.audioPlay( )的源码

public static void audioPlay(String path){
if(mp==null)
{mp=new MediaPlayer();Log.i("media player","build mp object ");}
try{mp.reset();
mp.setDataSource(path);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();

}catch(Exception e){Log.e("AudioPlay",e.toString());}

}


------解决思路----------------------
-1的话是文件读到头了,查看日志是否有错误信息
  相关解决方案