我正在使用BufferedReader和PrintWriter遍历输入文件的每一行,对某些行进行更改,然后输出结果.如果一行没有进行更改,它只是按原样打印到输出文件.然而,出于某种原因,该过程提前结束.代码看起来像这样:
BufferedReader in = new BufferedReader(new FileReader("in.txt"));
FileOutputStream out = new FileOutputStream("out.txt");
PrintWriter p = new PrintWriter(out);
String line = in.readLine();
while(line!=null)
{
if(line is special)
do edits and p.println(edited_line);
else
p.println(line);
line = in.readLine();
}
Run Code Online (Sandbox Code Playgroud)
但是,由于一些奇怪的原因,这个过程在我的输入文件的最末端过早地结束(实际打印出一半的一行).这有什么明显的原因吗?while循环显然以null结尾.它是我的250k +行txt文件的末尾.谢谢!
以下代码在Android 1.5-2.2.1中运行良好,但它不在2.3及更高版本中.
BufferedReader rd;
rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = rd.readLine()) != null){
sb.append(line);
}
rd.close();
Run Code Online (Sandbox Code Playgroud)
stracktrace:
01-30 08:21:42.668: WARN/System.err(594): java.io.IOException: BufferedInputStream is closed
01-30 08:21:42.668: WARN/System.err(594): at java.io.BufferedInputStream.streamClosed(BufferedInputStream.java:116)
01-30 08:21:42.728: WARN/System.err(594): at java.io.BufferedInputStream.read(BufferedInputStream.java:274)
01-30 08:21:42.728: WARN/System.err(594): at org.apache.harmony.luni.internal.net.www.protocol.http.UnknownLengthHttpInputStream.read(UnknownLengthHttpInputStream.java:40)
01-30 08:21:42.758: WARN/System.err(594): at java.io.InputStreamReader.read(InputStreamReader.java:255)
01-30 08:21:42.758: WARN/System.err(594): at java.io.BufferedReader.fillBuf(BufferedReader.java:128)
01-30 08:21:42.758: WARN/System.err(594): at java.io.BufferedReader.readLine(BufferedReader.java:357)
Run Code Online (Sandbox Code Playgroud)
这是一个问题吗?2.3中有什么变化吗?
我正在编写一个客户端应用程序,它将通过tcp/ip接收连续的数据流.我遇到的问题是缓冲的阅读器对象没有接收到任何数据,并且挂在readline方法上.
服务器的工作方式是连接到它,然后发送身份验证信息以接收数据.我的代码的要点如下
socket = new Socket(strHost, port);
authenticate();
inStream = new BufferedReader(new InputStreamReader(socket.getInputStream()));
process(inStream);
authenticate()
{
PrintWriter pwriter = new PrintWriter(socket.getOutputStream(), true);
pwriter.println(authString);
}
process(BufferedReader bufferedReader)
{
while((line = bufferedReader.readLine()) != null)
dostuff
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个示例服务器应用程序,它以一种方式发送数据(我认为)服务器正在发送数据并且它连接,并接收和处理数据.我可以在我的应用程序中正常连接到服务器.我也可以telnet到服务器并写入身份验证字符串并使用telnet接收大量数据.但是我的应用程序只是挂在readLine与服务器,我不明白为什么.
进入的数据(通过telnet atleast)看起来像是以下的连续流:
data;data;data;data;data
data;data;data;data;data
Run Code Online (Sandbox Code Playgroud)
为什么我的应用程序挂在readline上,我没有正确输出身份验证行?我没有收到任何错误......
编辑 我的示例服务器代码(正常工作)...再次这只是模仿我认为真实服务器正在运行的方式,但我可以连接到我的应用程序中只是没有从真实服务器接收数据.
public static void main(String[] args) throws IOException
{
ServerSocket serverSocket = null;
try
{
serverSocket = new ServerSocket(1987);
}
catch (IOException e)
{
System.out.println("Couldn't listen on port: 1987");
System.exit(-1);
}
Socket clientSocket = null;
try
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用BufferedReader和InputStreamReader从流读入来创建一个从读者创建的长字符串.它最多可达100,000行,然后抛出500错误(服务器上的调用失败).我不确定是什么问题,有什么比这个方法更快?它的工作线路数千,但我正在使用大型数据集.
BufferedReader in = new BufferedReader(new InputStreamReader(newConnect.getInputStream()));
String inputLine;
String xmlObject = "";
StringBuffer str = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
str.append(inputLine);
str.toString();
}
in.close();
Run Code Online (Sandbox Code Playgroud)
提前致谢
我有一个缓冲读取器等待输入但由于某种原因它不等待第二次读取并继续打印我的第三个print语句.
码:
BufferedReader inFromUser=new BufferedReader(new InputStreamReader(System.in));
char letter,xVal;
int yVal;
System.out.println("Please enter a letter for your word.(a-z)");
letter=(char)inFromUser.read();
System.out.println("Please enter a X location for this piece.(A-J)");
xVal=(char)inFromUser.read();
System.out.println("Please enter a Y location for this piece.(0-9)");
yVal=inFromUser.read();
Run Code Online (Sandbox Code Playgroud)
示例执行如下:请输入您的单词的字母.//在这里等待输入
一个
请输入此作品的X位置.//不等在这里???
请输入此作品的Y位置.
假设我有一个名为的文本文件:data.txt(包含2000行)
如何读取给定的特定行:500-1500然后1500-2000并显示特定行的输出?
此代码将读取整个文件(2000行)
public static String getContents(File aFile) {
StringBuffer contents = new StringBuffer();
try {
BufferedReader input = new BufferedReader(new FileReader(aFile));
try {
String line = null;
while (( line = input.readLine()) != null){
contents.append(line);
contents.append(System.getProperty("line.separator"));
}
}
finally {
input.close();
}
}
catch (IOException ex){
ex.printStackTrace();
}
return contents.toString();
}
Run Code Online (Sandbox Code Playgroud)
如何修改上面的代码以读取特定的行?
我目前有一个程序在单线程模式下读取文件(非常大)并创建搜索索引,但在单线程环境中索引需要很长时间.
现在我试图让它在多线程模式下工作,但不确定实现它的最佳方法.
我的主程序创建一个缓冲的读取器并将实例传递给线程,线程使用缓冲的读取器实例来读取文件.
我不认为这可以按预期工作,而是每个线程一次又一次地读同一行.
有没有办法让线程只读取其他线程无法读取的行?我需要拆分文件吗?有没有办法在不拆分文件的情况下实现这个?
样本主程序:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
public class TestMTFile {
public static void main(String args[]) {
BufferedReader reader = null;
ArrayList<Thread> threads = new ArrayList<Thread>();
try {
reader = new BufferedReader(new FileReader(
"test.tsv"));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
for (int i = 0; i <= 10; i++) {
Runnable task = new ReadFileMT(reader);
Thread worker = new Thread(task);
// We can set the name of the thread
worker.setName(String.valueOf(i));
// Start …Run Code Online (Sandbox Code Playgroud) 我在Java中有以下代码:
HttpURLConnection con = (HttpURLConnection)new URL(url).openConnection();
con.connect();
InputStream stream = con.getInputStream();
BufferedReader file = new BufferedReader(new InputStreamReader(stream));
Run Code Online (Sandbox Code Playgroud)
此时,我在搜索内容时从头到尾读取文件:
while (true)
{
String line = file.readLine();
if (line == null)
break;
// Search for something...
}
Run Code Online (Sandbox Code Playgroud)
现在,我想在文件中搜索其他内容,而无需打开另一个URL连接。
出于与该问题无关的原因,我希望避免在“单个文件扫描”中搜索这两种内容。
我可以倒带文件reset吗?
如果是,我应该将其应用于InputStream对象,BufferedReader对象还是同时应用于两者?
如果不是,那么我应该简单地关闭文件并重新打开它吗?
如果是,我应该将其应用于InputStream对象,BufferedReader对象还是同时应用于两者?
如果不是,我又该如何再次清除文件,而无需再次读取URL连接?
我正在学习Android开发(我是一般的编程初学者)并学习HTTP网络,并在课程中看到了这段代码:
private String readFromStream(InputStream inputStream) throws IOException {
StringBuilder output = new StringBuilder();
if (inputStream != null) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
BufferedReader reader = new BufferedReader(inputStreamReader);
String line = reader.readLine();
while (line != null) {
output.append(line);
line = reader.readLine();
}
}
return output.toString();
}
Run Code Online (Sandbox Code Playgroud)
我不完全理解InputStream,InputStreamReader和BufferedReader的作用.所有这些都有一个read()方法,并且在BufferedReader的情况下也有readLine().为什么我不能只使用InputStream或只添加InputStreamReader?为什么我需要添加BufferedReader?我知道这与效率有关,但我不明白如何.
我一直在研究,BufferedReader的文档试图解释这个,但我仍然不知道谁在做什么:
通常,由Reader构成的每个读取请求都会导致相应的读取请求由基础字符或字节流构成.因此,建议将BufferedReader包装在任何read()操作可能代价高昂的Reader上,例如FileReaders和InputStreamReaders.例如,
BufferedReader in = new BufferedReader(new FileReader("foo.in"));将缓冲指定文件的输入.如果没有缓冲,read()或readLine()的每次调用都可能导致从文件中读取字节,转换为字符,然后返回,这可能是非常低效的.
所以,据我所知,InputStream只能读取一个字节,InputStreamReader只能读取一个字符,而BufferedReader只能读取整行,并且它还可以解决效率问题,这是我无法得到的.我想更好地了解谁在做什么,以便理解为什么我需要他们所有这三个以及没有他们之一的差别.
我在这里和网上的其他地方进行了很多研究,似乎没有找到任何关于我可以理解的解释,几乎所有教程都只重复文档信息.以下是一些相关的问题,可能会开始解释这一点,但不要深入解决我的困惑:Q1,Q2,Q3,Q4.我认为这可能与最后一个问题关于系统调用和返回的解释有关.但我想了解这一切的含义.
可能是BufferedReader的readLine()调用了InputStreamReader的read()方法,而该方法又调用了InputStream的read()方法?并且InputStream返回转换为int的字节,一次返回一个字节,InputStreamReader读取足够的这些字符以生成单个字符并将其转换为int并一次返回一个字符,并且BufferedReader读取足够的这些字符用整数表示整数?并将整行作为String返回,只返回一次而不是几次?我不知道,我只是想弄清楚事情是如何运作的.
非常感谢提前!
我有12000行的csv文件。每行都有几个用双引号引起来并用逗号分隔的字段。此字段之一是xml文档,因此该行可能很长。文件大小为174 Mb。
这是文件的示例:
"100000","field1","field30","<root><data>Hello I have a
line break</data></root>","field31"
"100001","field1","field30","<root><data>Hello I have multiple
line
break</data></root>","field31"
Run Code Online (Sandbox Code Playgroud)
此文件的问题在xml字段内,该字段可能具有一个或多个换行符,因此可能会中断解析。此处的目标是读取整个文件并应用正则表达式,它将用空字符串替换双引号内的所有换行符。
以下代码给了我OutOfMemoryError:
String path = "path/to/file.csv";
try {
byte[] content = Files.readAllBytes(Paths.get(path));
}
catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
Run Code Online (Sandbox Code Playgroud)
我还尝试使用BufferedReader和StringBuilder读取文件,在第5000行附近出现OutOfMemoryError:
String path = "path/to/file.csv";
try {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new FileReader(path));
String line;
int count = 0;
while ((line = br.readLine()) != null) {
sb.append(line);
System.out.println("Read " + count++);
}
}
catch (Exception e) {
e.printStackTrace(); …Run Code Online (Sandbox Code Playgroud) bufferedreader ×10
java ×9
file ×3
inputstream ×3
android ×2
file-read ×1
http ×1
servlets ×1
sockets ×1
xml ×1