Java : BufferedReader가 라인 이상을 읽습니까?
-
11-09-2019 - |
문제
나는 소켓과 함께 Java로 프로그램을 만들고 있습니다. 클라이언트와 클라이언트에서 서버로 명령을 보낼 수 있습니다. 명령을 읽으려면 a를 사용합니다 BufferedReader
. 그것들을 쓰려면, a PrintWriter
하지만 이제 파일을 전송하고 싶습니다 저것 소켓 (단순히 두 번째 연결을 만드는 것이 아닙니다).
먼저 파일에 포함 된 바이트 수에 outputStream에 씁니다. 예를 들어 40000 바이트. 그래서 나는 숫자를 씁니다 40000
소켓을 통해, 그러나 연결의 다른 쪽은 읽습니다. 78
.
그래서 나는 생각했다 : BufferedReader
단순한 라인 이상을 읽습니다 (전화로 readLine()
) 그리고 그런 식으로 나는 파일 데이터에서 바이트를 잃습니다. 그들이 버퍼에 있기 때문입니다 BufferedReader
.
그래서 숫자 78
전송하려는 파일의 바이트입니다.
이런 식으로 생각하는 방식입니다. 그렇다면이 문제를 해결하는 방법.
잘 설명했으면 좋겠어요.
여기 내 코드가 있지만 내 기본 언어는 네덜란드입니다. 따라서 일부 가변적 인 이름은 스탠드 소리를 낼 수 있습니다.
public void flushStreamToStream(InputStream is, OutputStream os, boolean closeIn, boolean closeOut) throws IOException {
byte[] buffer = new byte[BUFFERSIZE];
int bytesRead;
if ((!closeOut) && closeIn) { // To Socket from File
action = "Upload";
os.write(is.available()); // Here I write 400000
max = is.available();
System.out.println("Bytes to send: " + max);
while ((bytesRead = is.read(buffer)) != -1) {
startTiming(); // Two lines to compute the speed
os.write(buffer, 0, bytesRead);
stopTiming(); // Speed compution
process += bytesRead;
}
os.flush();
is.close();
return;
}
if ((!closeIn) && closeOut) { // To File from Socket
action = "Download";
int bytesToRead = -1;
bytesToRead = is.read(); // Here he reads 78.
System.out.println("Bytes to read: " + bytesToRead);
max = bytesToRead;
int nextBufferSize;
while ((nextBufferSize = Math.min(BUFFERSIZE, bytesToRead)) > 0) {
startTiming();
bytesRead = is.read(buffer, 0, nextBufferSize);
bytesToRead -= bytesRead;
process += nextBufferSize;
os.write(buffer, 0, bytesRead);
stopTiming();
}
os.flush();
os.close();
return;
}
throw new IllegalArgumentException("The only two boolean combinations are: closeOut == false && closeIn == true AND closeOut == true && closeIn == false");
}
다음은 해결책입니다.
제임스 제안 덕분에
제 생각에는 Laginimaineb Anwser는 솔루션의 일부였습니다.
명령을 읽으십시오.
DataInputStream in = new DataInputStream(is); // Originally a BufferedReader
// Read the request line
String str;
while ((str = in.readLine()) != null) {
if (str.trim().equals("")) {
continue;
}
handleSocketInput(str);
}
이제 FlushstreamToStream :
public void flushStreamToStream(InputStream is, OutputStream os, boolean closeIn, boolean closeOut) throws IOException {
byte[] buffer = new byte[BUFFERSIZE];
int bytesRead;
if ((!closeOut) && closeIn) { // To Socket from File
action = "Upload";
DataOutputStream dos = new DataOutputStream(os);
dos.writeInt(is.available());
max = is.available();
System.out.println("Bytes to send: " + max);
while ((bytesRead = is.read(buffer)) != -1) {
startTiming();
dos.write(buffer, 0, bytesRead);
stopTiming();
process += bytesRead;
}
os.flush();
is.close();
return;
}
if ((!closeIn) && closeOut) { // To File from Socket
action = "Download";
DataInputStream dis = new DataInputStream(is);
int bytesToRead = dis.readInt();
System.out.println("Bytes to read: " + bytesToRead);
max = bytesToRead;
int nextBufferSize;
while ((nextBufferSize = Math.min(BUFFERSIZE, bytesToRead)) > 0) {
startTiming();
bytesRead = is.read(buffer, 0, nextBufferSize);
bytesToRead -= bytesRead;
process += nextBufferSize;
os.write(buffer, 0, bytesRead);
stopTiming();
}
os.flush();
os.close();
return;
}
throw new IllegalArgumentException("The only two boolean combinations are: closeOut == false && closeIn == true AND closeOut == true && closeIn == false");
}
마티 -.
해결책
DatainputStream은 사용하려는 것입니다. 또한 사용 가능한 () 메소드는 일반적으로 쓸모가 없으므로 사용하지 마십시오.
다른 팁
나는 당신의 설명을 따랐는지 확실하지 않습니다.
그러나 예 - 버퍼드 리더가 실제로 얼마나 읽을 것인지에 대한 진정한 제어가 없습니다. 그러한 독자의 요점은 버퍼를 보충하는 데 필요한 기초 자원의 덩어리를 낙관적으로 읽는 것입니다. 그래서 처음 전화 할 때 readLine
, 내부 버퍼는 요청에 서비스를 제공하기에 충분하지 않으며 꺼져서 버퍼에 느끼는 많은 바이트를 읽으십시오. 기본 소스에서 일반적으로 당신이 요청한 것보다 훨씬 더 많습니다. 버퍼가 채워지면 버퍼링 된 컨텐츠에서 라인을 반환합니다.
따라서 버퍼링 리더에서 입력 스트림을 감싸면 동일한 버퍼 리더를 통해 해당 스트림 만 읽어야합니다. 당신이하지 않으면 데이터를 잃게 될 것입니다 (일부 바이트가 소비되었고 이제는 완충식 리더의 캐시에 앉아 있습니다).
버퍼링 리더는 그것이 기본 입력 스트림에서 유일하게 독서라고 가정합니다.
그것은 기본 스트림에서 읽기 수를 최소화하는 것이 목적입니다 (매우 깊이 위임 할 수 있으므로 비싸다). 이를 위해 버퍼를 유지하고 읽기에 의해 채워집니다. 가능한 많은 바이트 기본 스트림에 대한 단일 호출로 그것에.
그렇습니다. 진단이 정확합니다.
여기에 야생 찌르기 -40000은 이진의 1001110001000000입니다. 이제, 처음 7 개의 비트는 1001110입니다. 이는 2 바이트의 정보를 쓰고 있지만 7 비트를 읽습니다.