从 BufferedReader 中缺少多行中的第一个字符
Missing first character in many lines while from BufferedReader
我正在尝试打印 URL 的内容,但第一个字符在很多行中都丢失了。就像在下面的输出中一样,DOCTYPE、head 和 html 标签中缺少“<”。
我试过在 while 循环中使用 readLine 方法,但它显示了一个更奇怪的 DOCTYPE 输出,缺少头标签,最后为 null。
代码 1:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class urlConnect {
public static void main(String[] args) throws Exception {
URL urlObj = new URL("https://soundcloud.com");
URLConnection conn = urlObj.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((br.read()) != -1) {
System.out.println((br.readLine()));
}
}
}
输出 1:
!DOCTYPE html>
<html lang="en">
head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
...
...
...
</body>
/html>
代码2:
while ((br.readLine()) != null) {
System.out.println((br.readLine()));
}
输出2:
<head>
<link rel="dns-prefetch" href="//style.sndcdn.com">
<link rel="dns-prefetch" href="//api-v2.soundcloud.com">
<link rel="dns-prefetch" href="//secure.quantserve.com">
<link rel="dns-prefetch" href="//api.soundcloud.com">
<link rel="dns-prefetch" href="//i1.sndcdn.com">
<link rel="dns-prefetch" href="//i3.sndcdn.com">
<link rel="dns-prefetch" href="//wis.sndcdn.com">
<link rel="dns-prefetch" href="//pixel.quantserve.com">
...
...
...
<script type="text/javascript">window.__sc_version = "1495803442";
</body>
null
Here's BufferedReader.read()
的 javadoc,是这样写的:
Reads a single character.
Returns:
The character read, as an integer in the range 0 to 65535 (0x00-0xffff), or -1 if the end of the stream has been reached
现在,让我们看一下代码:
while ((br.read()) != -1) {
System.out.println((br.readLine()));
}
您正在检查 return 值 read
以查看是否已到达流的末尾。但是,您并未打印该值(它未存储在任何引用中,因此在比较后会丢失)。理想情况下,您需要打印该值以及整行,例如:
String line;
while((line = br.readLine()) != null){
System.out.println(line);
}
这是完整的工作代码。我参考了 Oracle Java 文档 https://docs.oracle.com/javase/tutorial/networking/urls/readingURL.html
import java.util.*;
import java.lang.*;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
public class TestURL
{
public static void main (String[] args) throws java.lang.Exception
{
URL oracle = new URL("https://soundcloud.com/");
BufferedReader in = new BufferedReader(
new InputStreamReader(oracle.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
我正在尝试打印 URL 的内容,但第一个字符在很多行中都丢失了。就像在下面的输出中一样,DOCTYPE、head 和 html 标签中缺少“<”。
我试过在 while 循环中使用 readLine 方法,但它显示了一个更奇怪的 DOCTYPE 输出,缺少头标签,最后为 null。
代码 1:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class urlConnect {
public static void main(String[] args) throws Exception {
URL urlObj = new URL("https://soundcloud.com");
URLConnection conn = urlObj.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((br.read()) != -1) {
System.out.println((br.readLine()));
}
}
}
输出 1:
!DOCTYPE html>
<html lang="en">
head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
...
...
...
</body>
/html>
代码2:
while ((br.readLine()) != null) {
System.out.println((br.readLine()));
}
输出2:
<head>
<link rel="dns-prefetch" href="//style.sndcdn.com">
<link rel="dns-prefetch" href="//api-v2.soundcloud.com">
<link rel="dns-prefetch" href="//secure.quantserve.com">
<link rel="dns-prefetch" href="//api.soundcloud.com">
<link rel="dns-prefetch" href="//i1.sndcdn.com">
<link rel="dns-prefetch" href="//i3.sndcdn.com">
<link rel="dns-prefetch" href="//wis.sndcdn.com">
<link rel="dns-prefetch" href="//pixel.quantserve.com">
...
...
...
<script type="text/javascript">window.__sc_version = "1495803442";
</body>
null
Here's BufferedReader.read()
的 javadoc,是这样写的:
Reads a single character.
Returns: The character read, as an integer in the range 0 to 65535 (0x00-0xffff), or -1 if the end of the stream has been reached
现在,让我们看一下代码:
while ((br.read()) != -1) {
System.out.println((br.readLine()));
}
您正在检查 return 值 read
以查看是否已到达流的末尾。但是,您并未打印该值(它未存储在任何引用中,因此在比较后会丢失)。理想情况下,您需要打印该值以及整行,例如:
String line;
while((line = br.readLine()) != null){
System.out.println(line);
}
这是完整的工作代码。我参考了 Oracle Java 文档 https://docs.oracle.com/javase/tutorial/networking/urls/readingURL.html
import java.util.*;
import java.lang.*;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
public class TestURL
{
public static void main (String[] args) throws java.lang.Exception
{
URL oracle = new URL("https://soundcloud.com/");
BufferedReader in = new BufferedReader(
new InputStreamReader(oracle.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}