3

This should be easy, but I can't get my head around it right now. I wanna send some bytes over a socket, like

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);
}

That works, but now I dont want to writeByte to the Outputstream, but read from a binary file, then write it out. I know(?) I need a FileInputStream to read from, I just can't figure out hot to construct the whole thing.

Can someone help me out?

1

3 Answers 3

4
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();
}

This would be the naive approach without proper exception handling - in a real-world setting you'd have to make sure to close the streams if an error occurs.

You might want to check out the Channel classes as well as an alternative to streams. FileChannel instances, for example, provide the transferTo(...) method that may be a lot more efficient.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, it works and really helps me out, that buffer array thing is new to me.
2
        Socket s = new Socket("localhost", TCP_SERVER_PORT);

        String fileName = "....";

create a FileInputStream using a fileName

    FileInputStream fis = new FileInputStream(fileName);

create a FileInputStream File Object

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

to read from the file

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

reading from it byte after byte

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

or reading from it buffer wise

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

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

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

Comments

0

read a byte from the input and write the same byte to the output

or with a byte buffer it like this:

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

note that you don't need to use the DataStreams for this

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.