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 错误");


直接使用apache-lang包中的FileUtils工具类的readline()函数。追问

能不能帮忙说明一下read(char[] x,int i,int j)怎么用也好,我主要是这个不太明白。谢谢了。

追答

read(char cbuf[],int off,int len)
cbuf是目的数组
off为保存字符的开始位置
len 一次最多读入字符个数

参考技术A import java.io.BufferedWriter;
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方法的主要内容,如果未能解决你的问题,请参考以下文章

java中关于Pattern的一个方法

java中关于this关键字的一些用法

java中关于重载与重写的区别

java中关于Pattern的一个方法

JAVA中关于set()和get()方法的理解及使用

java中关于静态变量的问题