java中关于bufferedreader类中read方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中关于bufferedreader类中read方法相关的知识,希望对你有一定的参考价值。
如下。此时in.read();读出的只是一个字符吗?也就是说,这个程序依旧是每次读入一个字符而后将字符输入到c.txt中去?那如何能一次读取多个字符然后一次性输出到c.txt,我知道可以用readline方法,除此之外是否能用其他方法实现?ps:BufferedReader in = new BufferedReader(new FileReader("d:/a.txt"),10)是否定义缓冲区为10字符大小?如果用read(char[] cbuf,int off, int len),必须char[] cbuf =new char[10];?
多谢!
import java.io.*;
public class Case
public static void main(String[] args)
char s;
try
BufferedReader in = new BufferedReader(new FileReader("d:/a.txt"),10);
BufferedWriter out = new BufferedWriter(new FileWriter("d:/c.txt"),10);
while((s=(char)in.read()) != (char)-1)
out.write(s);
System.out.print(s);
out.flush();
in.close();
out.close();
catch(IOException o)
System.out.print("IO 错误");
能不能帮忙说明一下read(char[] x,int i,int j)怎么用也好,我主要是这个不太明白。谢谢了。
追答read(char cbuf[],int off,int len)
cbuf是目的数组
off为保存字符的开始位置
len 一次最多读入字符个数
import java.io.FileWriter;
import java.io.IOException;
/*
* 字符流为了高效读写,也提供了对应的字符缓冲流。
* BufferedWriter:字符缓冲输出流
* BufferedReader:字符缓冲输入流
*
* BufferedWriter:字符缓冲输出流
* 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
* 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
*/
public class BufferedWriterDemo
public static void main(String[] args) throws IOException
// BufferedWriter(Writer out)
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
// new FileOutputStream("bw.txt")));
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
bw.write("hello");
bw.write("world");
bw.write("java");
bw.flush();
bw.close();
使用 try-with-resources 或在“finally”子句中关闭此“BufferedReader”
【中文标题】使用 try-with-resources 或在“finally”子句中关闭此“BufferedReader”【英文标题】:Use try-with-resources or close this "BufferedReader" in a "finally" clause 【发布时间】:2019-05-15 13:55:50 【问题描述】:一直在寻找解决此问题的方法。阅读所有以前的答案,但没有一个帮助我。 SonarQube 会不会有什么错误?
public class Br
public String loader(String FilePath)
BufferedReader br;
String str = null;
StringBuilder strb = new StringBuilder();
try
br = new BufferedReader(new FileReader(FilePath));
while ((str = br.readLine()) != null)
strb.append(str).append("\n");
catch (FileNotFoundException f)
System.out.println(FilePath+" does not exist");
return null;
catch (IOException e)
e.printStackTrace();
return strb.toString();
【问题讨论】:
运行代码 100 万次。你会看到你已经创建了一个资源泄漏。您正在打开资源,但从不关闭它们 您缺少br.close()
方法以防止资源泄漏。这可以在catch
块之后的finally
块或try (BufferedReader br = new BufferedReader(new FileReader(FilePath))) ....
中实现
试了你说的,还是报错。
始终默认使用 try-with-resources。
根本没有帮助。尝试了所有建议的方法仍然有很多其他错误。如果我尝试添加 finally ,我会得到 "br was not initialized" 。在我将 br 设置为 null 后,我最终会出现其他错误等等。
【参考方案1】:
您没有调用br.close()
,这意味着冒着资源泄漏的风险。为了可靠地关闭BufferedReader
,您有两种选择:
使用finally
块:
public String loader(String FilePath)
// initialize the reader with null
BufferedReader br = null;
String str = null;
StringBuilder strb = new StringBuilder();
try
// really initialize it inside the try block
br = new BufferedReader(new FileReader(FilePath));
while ((str = br.readLine()) != null)
strb.append(str).append("\n");
catch (FileNotFoundException f)
System.out.println(FilePath + " does not exist");
return null;
catch (IOException e)
e.printStackTrace();
finally
// this block will be executed in every case, success or caught exception
if (br != null)
// again, a resource is involved, so try-catch another time
try
br.close();
catch (IOException e)
e.printStackTrace();
return strb.toString();
使用try
-with-resources 声明:
public String loader(String FilePath)
String str = null;
StringBuilder strb = new StringBuilder();
// the following line means the try block takes care of closing the resource
try (BufferedReader br = new BufferedReader(new FileReader(FilePath)))
while ((str = br.readLine()) != null)
strb.append(str).append("\n");
catch (FileNotFoundException f)
System.out.println(FilePath + " does not exist");
return null;
catch (IOException e)
e.printStackTrace();
return strb.toString();
【讨论】:
好的,使用 finally 括号的方法效果很好!不知道为什么 try-with-resources 没有成功!非常感谢! @Lol 不客气!那是经典版本。你试过另一个吗? SonarQube 抱怨过吗?如果它有帮助,请考虑接受答案,它也会给你一点声誉。 第二个版本似乎不适合我!会给出和以前一样的错误。 @Lol 这很有趣......难道不是 SonarQube 本身声明了在“finally”子句中使用 try-with-resources 或关闭这个“BufferedReader”?您的问题的标题是错误消息,不是吗? 是的!当尝试使用资源时,我最终得到了同样的声明,这完全是奇怪的。【参考方案2】:似乎您只想读取文件中的所有行。你可以使用这个:
public String loader(String FilePath)
try(Scanner s = new Scanner(new File(FilePath).useDelimiter("\\A"))
return s.hasNext() ? s.next() : null;
catch(IOException e)
throw new UncheckedIOException(e);
【讨论】:
【参考方案3】:您编写的代码确实在泄漏资源,因为您没有关闭 BufferedReader。以下 sn-p 应该可以解决问题:
public String loader(String filePath)
String str = null;
StringBuilder strb = new StringBuilder();
// try-with-resources construct here which will automatically handle the close for you
try (FileReader fileReader = new FileReader(filePath);
BufferedReader br = new BufferedReader(fileReader);)
while ((str = br.readLine()) != null)
strb.append(str).append("\n");
catch (FileNotFoundException f)
System.out.println(filePath+" does not exist");
return null;
catch (IOException e)
e.printStackTrace();
return strb.toString();
如果您对此代码仍有问题,那么是的,这是 SonarQubes 的错误 :-)
【讨论】:
哦,好吧,那就是 SonarQubes 错误!之前尝试过。现在再试一次,仍然出现同样的错误。谢谢! 也许是一个长镜头,但也许 SonarQube 需要在 try-with-resources 构造中分别声明 FileReader 和 BufferedReader?在此基础上调整了我的样本。以上是关于java中关于bufferedreader类中read方法的主要内容,如果未能解决你的问题,请参考以下文章