我无法使用WiFi-Direct传输整个文件。文件发送者指示整个文件已复制到套接字输出流。文件接收器仅接收大约一半的文件。
我查看了原始文件的内容和存储接收到的数据的文件的内容,发现接收方只接收原始文件的片段。例如,它将接收字节0-100,然后将其跳转到字节245-350。
为什么接收方只接收文件的一部分而不是整个文件?
private class FileReceiveThread(val channel: Channel) : TransmissionThread() {
private var mFileName: String = ""
private var mFileSize: Long = 0L
private var mBytesReceivedTotal = 0L
override fun run() {
try {
Timber.d("File receive thread running: fileSize=$mFileSize, fileName=$mFileName")
val outputFile = File.createTempFile("file", "")
val fileOutput = outputFile.outputStream()
val channelInput = DataInputStream(channel.getInputStream().unwrap())
val inputBuffer = mutableListOf<Byte>()
var numBytesRemaining = mFileSize
while (mBytesReceivedTotal < mFileSize) {
val buffer = ByteArray(FILE_TX_BUFFER_SIZE)
var bytesCopiedTotal = 0L
channelInput.readFully(buffer)
inputBuffer.addAll(buffer.toTypedArray())
bytesCopiedTotal += FILE_TX_BUFFER_SIZE
mBytesReceivedTotal += bytesCopiedTotal
Timber.v("Bytes received total: $mBytesReceivedTotal")
fileOutput.write(inputBuffer.toByteArray())
inputBuffer.clear()
}
onTransmitComplete?.invoke()
} catch (e: Exception) {
e.printStackTrace()
}
}
fun start(filename: String, size: Long) {
mFileName = filename
mFileSize = size
start()
}
}
private class FileSendThread : TransmissionThread() {
var mFile: File? = null
var mOutputStream: OutputStream? = null
override fun run() {
if (mFile != null && mOutputStream != null) {
Timber.i("Copying file input stream to output stream")
val inputStream = mFile!!.inputStream()
val channelStream = mOutputStream!!
val buffer = ByteArray(FILE_TX_BUFFER_SIZE)
while (inputStream.read(buffer) > 0) {
channelStream.write(buffer)
}
Timber.d("Wrote file to output stream")
inputStream.close()
Timber.d("No more data to send")
onTransmitComplete?.invoke()
} else Timber.d("Parameters null: file=$mFile")
}
fun start(file: File, stream: OutputStream) {
mFile = file
mOutputStream = stream
start()
}
}
while (inputStream.read(buffer) > 0) {
channelStream.write(buffer)
}
read()通常不会填充整个缓冲区。因此,如果您编写缓冲区,则仅在缓冲区被填充为止。
var totalbytesread = 0;
var nread;
while ((nread = inputStream.read(buffer)) > 0) {
channelStream.write(buffer, 0, nread)
totalbytesread += nread;
}
channelStream.close()';
记录已读取的总字节数。您的原始代码会导致收到的文件更大,因此还有其他发现。.