以下代码在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中有什么变化吗?
我正在尝试在 python 脚本中打开大型 .csv 文件(16k 行+,~15 列),但遇到了一些问题。
我使用内置的 open() 函数打开文件,然后使用输入文件声明一个 csv.DictReader 。循环的结构如下:
for (i, row) in enumerate(reader):
# do stuff (send serial packet, read response)
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用的文件长度超过 20 行,该文件将打开,但在几次迭代后我会收到 ValueError: I/O 操作已关闭的文件。
我的想法是,我可能会耗尽内存(尽管 16k 行文件只有 8MB,而且我有 3GB 内存),在这种情况下,我希望我需要使用某种缓冲区来仅加载一次将文件存入内存。
我走在正确的轨道上吗?或者是否还有其他原因导致文件意外关闭?
编辑:大约有一半的时间我使用 11 行的 csv 运行此命令,它会给出 ValueError。错误并不总是发生在同一行
我正在使用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)
提前致谢
我正在使用 BufferedReader 逐行读取字节流(UTF-8 文本)。出于特定原因,我需要知道该行在字节流中的确切位置开始。
问题:我无法使用插入 BufferedReader 的 InputStream 的位置 - 同样 - 读取器缓冲并一次读取超过一行。
我的问题:如何确定读取的每行的精确字节偏移量?
一种明显(但不正确)的解决方案是使用 (line + "\n").getBytes("UTF-8").length。这种方法有两个问题:1)仅计算字节数,将字符串转换回字节是相当大的开销,2)换行符并不总是标记为“\n” - 它也可能是“\ r\n”等
对此还有其他解决方案吗?
编辑:到目前为止我见过的每个类似 LineReader 的类似乎都是缓冲的。有谁知道类似无缓冲的 LineReader 类吗?
有没有办法让你BufferedReader.readLine()不挂?
我正在创建一个服务器:
如何在不运行的情况下检查客户端是否已提供任何输入readLine()?如果我运行readLine(),线程将挂起,直到输入传递?
摘要:有了contains的字节图像,我怎样才能获得一个干净且正确的读取器来返回文本文件的行?a.zipa.txt
我确实将 zip 文件的图像从 Web 服务下载到byte[] content. 我想写一个类似的方法
private BufferedReader contentToBufferedReader(byte[] content)
Run Code Online (Sandbox Code Playgroud)
这将返回一个可以像这样使用的读者
reader = contentToBufferedReader(content);
while ((line = reader.readLine()) != null) {
processThe(line);
}
reader.close()
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经(更新)
private BufferedReader contentToBufferedReader(byte[] content) {
ByteArrayInputStream bais = new ByteArrayInputStream(content);
ZipInputStream zipStream = new ZipInputStream(bais);
BufferedReader reader = null;
try {
ZipEntry entry = zipStream.getNextEntry();
// I need only the first (and the only) entry from the zip file.
if (entry != null) { …Run Code Online (Sandbox Code Playgroud) 这是我的方法
public void readFile3()throws IOException
{
try
{
FileReader fr = new FileReader(Path3);
BufferedReader br = new BufferedReader(fr);
String s = br.readLine();
int a =1;
while( a != 2)
{
s = br.readLine();
a ++;
}
Storage.add(s);
br.close();
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
由于某些原因,我无法读取仅包含以下文件:“名称为Intel(R)Core(TM)i5-2500 CPU @ 3.30GHz”
当我调试代码时,String s返回为“ \ ufffd \ ufffdN am e”,我不知道这些多余字符来自何处。.这使我无法正确读取文件。
我有一个输入流,其中包含一行字符串,然后是二进制数据。
如果我使用 读取该行new BufferedReader(new InputStreamReader(inputStream)),则二进制数据也会被读取并且无法重新读取。
如何在不读取二进制数据的情况下读取一行?
我在AWS S3中有一个非常大的文件(几GB),我只需要文件中的少量行满足一定的条件.我不想将整个文件加载到内存中,然后搜索并打印这几行 - 这个内存负载太高了.正确的方法是只加载内存中需要的那些行.
根据AWS文档从文件中读取:
fullObject = s3Client.getObject(new GetObjectRequest(bucketName, key));
displayTextInputStream(fullObject.getObjectContent());
private static void displayTextInputStream(InputStream input) throws IOException {
// Read the text input stream one line at a time and display each line.
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
这里我们使用BufferedReader.我不清楚这里发生了什么.
我们每次读取新行时是否对S3进行网络调用,并且只将当前行保留在缓冲区中?或者是整个文件加载到内存中,然后由BufferedReader逐行读取?或者介于两者之间?
java inputstream bufferedinputstream amazon-s3 bufferedreader
我有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 ×8
inputstream ×3
android ×2
amazon-s3 ×1
csv ×1
enumerate ×1
file ×1
filereader ×1
http ×1
python ×1
servlets ×1
utf-8 ×1
xml ×1
zip ×1