2011-11-22 7 views
5

생 바이트 스트림을 사용하여 내 컨퍼런스 채팅 응용 프로그램에서 TCP 파일 전송을 구현하기 위해 객체 스트림을 통해 전송할 파일을 훨씬 쉽게 전송할 수 있다고 판단했습니다. 파일은 메모리 내 File 객체로 대상 (중앙 서버 또는 다운로드 클라이언트)에 전송되고 저장됩니다. 그러나 이러한 파일은 File 객체로만 사용됩니다. 클라이언트가 파일을 열 수 있어야합니다. Java에서 File 객체를 하드 디스크 파일로 저장하거나 Java를 통해 파일 객체를 여는 방법이 있습니까?Java 저장/열기 파일 객체

답변

8

"파일 개체"는 무엇을 의미합니까? java.io.File을 의미합니까?

클래스 java.io.File은 단지 디렉토리 이름과 파일 이름을 나타냅니다. 그것은 파일의 내용을 담을 수있는 객체가 아닙니다.

당신은 예를 들어 메모리의 byte 배열은, 다음 네, 당신이 파일이 저장할 수있는 데이터가있는 경우 :

byte[] data = ...; 

OutputStream out = new FileOutputStream(new File("C:\\someplace\\filename.dat")); 
out.write(data); 
out.close(); 

읽고 쓰는 방법을 배우고 오라클의 자바 튜토리얼에서 Basic I/O Lesson를 참조하십시오 파일은 FileInputStreamFileOutputStream입니다. Data Handlers

당신은 Data Sources로하지만 당신에게 "투명"방식으로 파일을 전송하는 데 사용할 수 있습니다에

+0

java.io.File이 파일 내용을 저장할 수 없다는 것을 알지 못했다. board so :( –

1

당신이 보일 것입니다.

+0

감사합니다, 앞으로 그들을 보게 될 것입니다. –

0

나는 내가 객체 스트림을 통해 전송 원하는 파일을 보낼 훨씬 쉽게 결정했다 "

그것은 나쁜 생각이 아니다는 :.. 메모리 대기 시간 (즉, 시간과 공간을) 비용 . 파일 이름과 파일 크기를 알려주는 바이트를 보내고 받는다.

+0

PrintWriter를 사용하여 파일 이름을 먼저 보내려고했습니다. 그 다음 BufferedOutputStream을 사용하여 미가공 바이트를 가져온다. 파일 이름과 바이트는 보낸 사람 측에서 문제없이 보낼 것입니다. 수신 측에서도 파일 이름을받을 수는 있지만 원시 바이트를 수신 할 수는 없습니다. 단지 빈 파일을 만들었습니다. 객체 스트림을 사용하도록 전환하면 작동하는 것 같았습니까? –

+1

@RichardStokes 작동하지 않을 것입니다. 연결 수명 동안 양쪽에서 동일한 스트림을 사용하십시오. PrintWriter에는 버퍼가 있고, BufferedOutputStream에는 버퍼가 있고, BufferedReader에는 버퍼가 있고, BufferedInputStream에는 버퍼가 있습니다. 전선에서 일관성을 유지할 버퍼가 너무 많습니다. writeUTF()/readUTF(), writeLong()/readLong() 및 write() 및 read()를 사용하여 파일 이름을 보내는 모든 것에 대해 DataOutputStream/DataInputStream을 사용합니다. – EJP

+0

와우 감사합니다. 훌륭하게 철저한 설명입니다. –