2012-05-16 92 views
3

这应该很容易,但我现在无法理解它。我想通过套接字发送一些字节,像Java:从二进制文件读取,通过套接字发送字节

Socket s = new Socket("localhost", TCP_SERVER_PORT); 
DataInputStream is = new DataInputStream(new BufferedInputStream(s.getInputStream())); 

DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(s.getOutputStream())); 

for (int j=0; j<40; j++) { 
    dos.writeByte(0); 
} 

这工作,但现在我不想writeByte到的OutputStream,而是从二进制文件读取,然后写出来。我知道(?)我需要一个FileInputStream来读取,我无法弄清楚构建整个事情。

有人可以帮我吗?

+1

http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html介绍了如何从创建的FileInputStream一个文件名。 – dhblah

回答

3
public void transfer(final File f, final String host, final int port) throws IOException { 
    final Socket socket = new Socket(host, port); 
    final BufferedOutputStream outStream = new BufferedOutputStream(socket.getOutputStream()); 
    final BufferedInputStream inStream = new BufferedInputStream(new FileInputStream(f)); 
    final byte[] buffer = new byte[4096]; 
    for (int read = inStream.read(buffer); read >= 0; read = inStream.read(buffer)) 
     outStream.write(buffer, 0, read); 
    inStream.close(); 
    outStream.close(); 
}

这将是不正确的异常处理的简单方法 - 在真实世界的设置,您就必须确保如果发生错误,关闭流。

您可能想要查看Channel类以及流的替代方法。例如,FileChannel实例提供了可能效率更高的transferTo(...)方法。

+0

谢谢,它的工作,真的帮助我,缓冲阵列的事情对我来说是新的。 – FWeigl

0

从输入读取一个字节和相同的字节写入到输出

或用字节的缓冲区这样的:

inputStream fis=new fileInputStream(file); 
byte[] buff = new byte[1024]; 
int read; 
while((read=fis.read(buff))>=0){ 
    dos.write(buff,0,read); 
} 

注意,你不需要使用数据流进行这

2
 Socket s = new Socket("localhost", TCP_SERVER_PORT); 

     String fileName = "...."; 

使用的文件名

FileInputStream fis = new FileInputStream(fileName); 

创建一个FileInputStream文件对象

 FileInputStream fis = new FileInputStream(new File(fileName)); 

从文件

DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(
     s.getOutputStream())); 

读取字节后,从它字节读取创建一个FileInputStream

int element; 
    while((element = fis.read()) !=1) 
    { 
     dos.write(element); 
    } 

或读取缓存明智

byte[] byteBuffer = new byte[1024]; // buffer 

    while(fis.read(byteBuffer)!= -1) 
    { 
     dos.write(byteBuffer); 
    } 

    dos.close(); 
    fis.close();