bufferedreader.readline一直读第一行
时间: 2023-09-19 09:05:53 浏览: 155
如果 `BufferedReader.readLine()` 一直读取第一行,可能是因为在读取完第一行后没有正确地将指针移动到下一行。可以尝试在读取完每一行后调用 `BufferedReader.readLine()` 来移动指针。此外,还可以检查文件是否存在并确保文件中有多于一行的内容。如果文件只有一行,那么 `BufferedReader.readLine()` 只会读取一行并返回 `null`。
相关问题
public void initGrammar(BufferedReader bufferedReader){ String line = ""; try { line = bufferedReader.readLine(); String[] temp = line.split(" "); Global.NotTerminal.add(temp[0]); Production sproduction = new Production(temp[0]); for(int i = 2;i<temp.length;i++){ Global.Terminal.add(temp[i]); sproduction.right.add(temp[i]); } Global.productionList.add(sproduction); Global.start = temp[0]; while ((line = bufferedReader.readLine()) != null){ temp = line.split(" "); Global.NotTerminal.add(temp[0]); Production production = new Production(temp[0]); for(int i = 2;i<temp.length;i++){ Global.Terminal.add(temp[i]); production.right.add(temp[i]); } Global.productionList.add(production); } Global.Terminal.removeAll(Global.NotTerminal); }catch (Exception e){ e.printStackTrace(); } }转python
以下是将该Java方法转换为Python函数的示例代码:
```python
def initGrammar(bufferedReader):
line = ""
try:
line = bufferedReader.readline()
temp = line.split(" ")
Global.NotTerminal.add(temp[0])
sproduction = Production(temp[0])
for i in range(2, len(temp)):
Global.Terminal.add(temp[i])
sproduction.right.add(temp[i])
Global.productionList.add(sproduction)
Global.start = temp[0]
while line:
line = bufferedReader.readline()
if not line:
break
temp = line.split(" ")
Global.NotTerminal.add(temp[0])
production = Production(temp[0])
for i in range(2, len(temp)):
Global.Terminal.add(temp[i])
production.right.add(temp[i])
Global.productionList.add(production)
Global.Terminal.difference_update(Global.NotTerminal)
except Exception as e:
print(e)
```
在这个Python函数中,我们使用了类似于Java方法的结构。我们首先定义了一个变量`line`,并设置为空字符串。然后,我们使用`try-except`语句块来捕获可能发生的异常。
在`try`块中,我们首先读取`bufferedReader`对象中的第一行,并将其拆分为一个非终结符和一系列终结符。然后,我们将这些符号添加到全局符号表中,并创建一个产生式对象,将其左部设置为该非终结符,并将其右部设置为这些终结符。接着,我们将该产生式对象添加到全局产生式列表中,并将该非终结符设置为起始符号。
接下来,我们使用一个`while`循环来读取每一行,并重复上述过程,将每个新的产生式对象添加到全局产生式列表中。最后,我们从全局终结符集合中删除所有的非终结符。
与Java方法不同的是,我们在Python函数中使用了`range()`函数来生成一个范围,以便迭代字符串中的每个元素。此外,我们使用了`Global.Terminal.difference_update()`方法来删除非终结符。
CloseableHttpClient httpClient= HttpClients.createDefault(); HttpGet httpGet=new HttpGet("http://fileservice-test.kube.com/fileservice/api/file/download?path=2023/07/06/A/1688633674343010000010939.pdf&downloadToken=E75E05D320954E19B2B9C1DB482342BD"); CloseableHttpResponse response=httpClient.execute(httpGet); try { HttpEntity httpEntity=response.getEntity(); if(httpEntity!=null){ String httpheader = httpEntity.getContentType().toString(); long contentlength=httpEntity.getContentLength(); // 打印实体信息 System.out.println("Content Type: " + httpheader); System.out.println("Content Length: " + contentlength); try (InputStream inputStream=httpEntity.getContent()){ BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream)); String line = ""; while ((reader.readLine()!=null)){ line=line+reader.readLine(); } System.out.println(line+"执行一次"); String lines = ""; while ((reader.readLine()!=null)){ lines=reader.readLine(); System.out.println(lines+"执行一次"); } }
在你的代码中,你在第一个while循环中读取了所有行并将其添加到`line`变量中。然后,你再次尝试使用同一个`BufferedReader`对象 `reader` 在第二个while循环中读取行。但是,由于第一个循环已经读取了所有行,此时`reader`已经到达末尾,所以第二个循环不会执行。
如果你想在第一个循环之后再次读取行,你需要重新创建一个新的`BufferedReader`对象。修改代码如下所示:
```java
try (InputStream inputStream = httpEntity.getContent()) {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
System.out.println("执行一次");
// 创建新的 BufferedReader 对象
BufferedReader newReader = new BufferedReader(new InputStreamReader(inputStream));
String lines = "";
while ((lines = newReader.readLine()) != null) {
System.out.println(lines);
System.out.println("执行一次");
}
}
```
这样,你就可以在第一个循环中读取所有行,并在第二个循环中再次读取所有行。注意,在第二个循环中,我们创建了一个新的`BufferedReader`对象 `newReader` 来读取行,因为之前的`reader`已经到达末尾。
阅读全文