GVKun编程网logo

用Java中的BufferedReader重置缓冲区?(java bufferreader)

17

在这里,我们将给大家分享关于用Java中的BufferedReader重置缓冲区?的知识,让您更了解javabufferreader的本质,同时也会涉及到如何更有效地BufferedReader中的缓

在这里,我们将给大家分享关于用Java中的BufferedReader重置缓冲区?的知识,让您更了解java bufferreader的本质,同时也会涉及到如何更有效地BufferedReader中的缓冲区大小是多少?、BufferedReader默认缓冲区大小?、J06-Java IO流总结六 《 BufferedReader和BufferedWriter 》、Java :BufferedWriter 类和 BufferedReader 类的构造方法、主要方法的内容。

本文目录一览:

用Java中的BufferedReader重置缓冲区?(java bufferreader)

用Java中的BufferedReader重置缓冲区?(java bufferreader)

我正在使用类BufferedReader在缓冲区中逐行读取。当读取缓冲区的最后一行时,我想再次从缓冲区的开头开始读取。我已经阅读过有关mark()和的信息reset(),我不确定它的用法,但我认为它们不能帮助我。

有人知道到达最后一行后如何从缓冲区的开头开始读取吗?像我们可以使用seek(0)RandomAccessFile

答案1

小编典典

标记/重置是您想要的,但是您不能真正在BufferedReader上使用它,因为它只能重置一定数量的字节(缓冲区大小)。如果您的文件大于该文件,它将无法使用。不幸的是,没有“简单”的方法可以做到这一点,但是它并不是很难处理,您只需要原始FileInputStream的句柄即可。

FileInputStream fIn = ...;BufferedReader bRead = new BufferedReader(new InputStreamReader(fIn));// ... read through bRead ...// "reset" to beginning of file (discard old buffered reader)fIn.getChannel().position(0);bRead = new BufferedReader(new InputStreamReader(fIn));

(请注意,不建议使用默认字符集,仅使用简化示例即可)。

BufferedReader中的缓冲区大小是多少?

BufferedReader中的缓冲区大小是多少?

构造函数中的缓冲区大小是什么意思?

BufferedReader(Reader in, int size)

当我编写程序时:

import java.io.*;class bufferedReaderEx{    public static void main(String args[]){        InputStreamReader isr = null;        BufferedReader br = null;            try{                isr = new InputStreamReader(System.in);//              System.out.println("Write data: ");//              int i = isr.read();//              System.out.println("Data read is: " + i);                //Thus the InputStreamReader is useful for reading the character from the stream                System.out.println("Enter the data to be read by the bufferedReader: ");                //here isr is containing the lnefeed already so this is needed to be flushed.                br = new BufferedReader(isr, 2);                String str = br.readLine();                System.out.println("The data is : :" +  str);            }catch(IOException e){                System.out.println("Can''t read: " + e.getMessage());            }    }}

输出:

Enter the data to be read by the bufferedReader: Hello world and hello world againThe data is: Hello world and hello world again

然后,缓冲区大小是什么意思,正如我希望的那样,它只能读取两个字符。但事实并非如此。

答案1

小编典典

BufferedReader顾名思义,缓冲输入。这意味着它会在将输入源传递给您之前从输入源读取到缓冲区。此处的缓冲区大小是指其缓冲的字节数。

从大多数来源读取输入非常慢。仅2个字节的缓冲区将损害性能,因为您的程序很可能大部分时间都在等待输入。缓冲区大小为2时,读取100字节将导致从内存缓冲区中读取2个字节(非常快),填充缓冲区(非常慢),从缓冲区中读取2个字节(非常快),填充缓冲区(非常慢),等等-
整体非常慢。缓冲区大小为100时,读取100字节将导致从内存缓冲区中读取100字节(非常快)-总体而言非常快。假设在读取时缓冲区包含100个字节,这在您这样的情况下是一个合理的假设。

除非您知道自己在做什么,否则应使用很大的默认缓冲区大小。使用较小的缓冲区的原因之一是当您在内存有限的设备上运行时,因为缓冲区占用了内存。

BufferedReader默认缓冲区大小?

BufferedReader默认缓冲区大小?

根据文档,BufferedReader(Reader)使用默认缓冲区大小,而第二个构造函数BufferedReader(Reader,int)允许设置缓冲区大小。

public BufferedReader(Reader in)

创建使用默认大小的输入缓冲区的缓冲字符输入流。

但是,文档没有提到默认的缓冲区大小是多少。

BufferedReader的默认缓冲区大小是多少?

答案1

小编典典

默认缓冲区大小为8192个字符

http://developer.android.com/reference/java/io/BufferedReader.html

 BufferedReader(Reader in)Constructs a new BufferedReader, providing in with a buffer of 8192

characters.

除了本文档之外,我还提取了rt.jar存档,并使用JD-
GUI从java.io.
*反编译了BufferedReader.class ,这是我在类定义中找到的:

private static int defaultCharBufferSize = 8192;

J06-Java IO流总结六 《 BufferedReader和BufferedWriter 》

J06-Java IO流总结六 《 BufferedReader和BufferedWriter 》

1. 概念简介

  与字节缓冲流BufferedInputStream和BufferedOutputStream对应的,我们还有字符缓冲流BufferedReader和BufferedWriter,顾名思义,它们是带有字符缓冲区的字符输入输出流,原理跟字节缓冲流一样,这两个流也是使用装饰模式对底层字符流进行了包装,并通过字符缓冲区来提高I/O效率,这里不再详细说明。唯一需要注意的是,相对于它们的父类,则两个流分别都新增了一些自己的方法,如下所示:

  • BufferedReader新增方法:
String readLine() throws IOException

 该方法一次性从输入流中读取一行数据,返回包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null。

 

  • BufferedWriter新增方法:
void newLine() throws IOException

 该方法向输出流中写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义,并且不一定是单个新行 (''\n'') 符。

 

 

2. 字符缓冲流应用示例

下面是两个流的使用示例,代码实现将数据从源文件3.txt复制到目标文件4.txt的功能:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedCharsTest {
    public static void main(String[] args) {
        BufferedReader br = null;
        BufferedWriter bw = null;
        
        try {
            br = new BufferedReader(new FileReader("./src/res/3.txt"));
            bw = new BufferedWriter(new FileWriter("./src/res/4.txt"));
            
            String str = null;
            while(null != (str = br.readLine())) {  //每次读取一行
                bw.write(str);
                bw.newLine();   //手动添加换行符
                bw.flush();
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(null != bw) {
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 代码运行效果:

注:用上面的代码, 源文件和目标文件都必须是GBK编码的才行,如果两者编码不一致,或者即使两者都是UTF-8编码的,也会出现乱码,如下所示:

 

原因就是前面在介绍FileReader时所说的那样,是由于FileReader只能以平台默认的字符集GBK来解码数据,FileWriter只能以平台默认字符集来编码数据,因此只要任何一方不是GBK编码的,就会导致乱码,这是需要注意的一点。

 

Java :BufferedWriter 类和 BufferedReader 类的构造方法、主要方法

Java :BufferedWriter 类和 BufferedReader 类的构造方法、主要方法

BufferedWriter 和 BufferedReader 为带有默认缓冲的字符输出输入流,因为有缓冲区所以效率比没有缓冲区的高。

一、BufferedWriter 类

构造方法:bufferedWriter bf = new bufferedWriter (Writer out);

主要方法:void write (char ch);// 写入单个字符。

                  void write (char [] cbuf,int off,int len)// 写入字符数据的某一部分。

                  void write (String s,int off,int len)// 写入字符串的某一部分。

                  void newLine ()// 写入一个行分隔符。

                  void flush ();// 刷新该流中的缓冲。将缓冲数据写到目的文件中去。

                  void close ();// 关闭此流,再关闭前会先刷新他。

[java]  view plain  copy
  1. package Buffered;  
  2.   
  3. import java.io.BufferedWriter;  
  4. import java.io.FileWriter;  
  5. import java.io.IOException;  
  6.   
  7. public class BufferedWriterDemo {  
  8.     public static void main(String[] args) throws IOException {  
  9.         FileWriter fw = new FileWriter("Buffered.txt");  
  10. //      fw.write("ok168");  
  11. //      fw.close();  
  12.         /** 
  13.          * 为了提高写入的效率,使用了字符流的缓冲区。 
  14.          * 创建了一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联。 
  15.          */  
  16.         BufferedWriter bufw = new BufferedWriter(fw);  
  17.           
  18.         // 使用缓冲区中的方法将数据写入到缓冲区中。  
  19.         bufw.write("hello world !");  
  20.         bufw.newLine();  
  21.         bufw.newLine();  
  22.         bufw.write("!hello world !");  
  23.         bufw.write("!hello world !");  
  24.         // 使用缓冲区中的方法,将数据刷新到目的地文件中去。  
  25.         bufw.flush();  
  26.         // 关闭缓冲区,同时关闭了 fw 流对象  
  27.         bufw.close();     
  28.     }  
  29. }  


二、BufferedReader 类。

构造方法:BufferedReader br = new BufferReader (Reader in);

主要方法:

int read ();// 读取单个字符。

int read (char [] cbuf,int off,int len);// 将字符读入到数组的某一部分。返回读取的字符数。达到                                                            尾部 ,返回 - 1。

String readLine ();                        // 读取一个文本行。

void close ();                                // 关闭该流。并释放与该流相关的所有资源。

 

自定义的一个 myBufferedReader 类。

[java]  view plain  copy
  1. package Buffered;  
  2.   
  3. import java.io.FileReader;  
  4. import java.io.IOException;  
  5.   
  6. public class MyBufferedReader {  
  7.       
  8.     private FileReader fr;  
  9.     private char []buf = new char[1024];  
  10.     private int count = 0;  
  11.     private int pos = 0;  
  12.     public MyBufferedReader(FileReader f){  
  13.         this.fr = f;          
  14.     }  
  15.     public int myRead() throws IOException{  
  16.         if(count == 0){  
  17.             count = fr.read(buf);  
  18.             pos = 0;  
  19.         }  
  20.         if(count<0)  
  21.             return -1;  
  22.         int ch = buf[pos++];  
  23.         count--;  
  24.         return ch;   
  25.     }  
  26.       
  27.     public String myReadLine() throws IOException{  
  28.         StringBuilder sb = new StringBuilder();  
  29.         int ch = 0;  
  30.         while ((ch = myRead()) != -1) {  
  31.             if (ch == ''\r'')  
  32.                 continue;  
  33.             if (ch == ''\n'')  
  34.                 return sb.toString();  
  35.             sb.append((char) ch);  
  36.             if(count == 0)  
  37.                 return sb.toString();             
  38.         }  
  39.         return null;  
  40.     }  
  41.     public void myClose() throws IOException {  
  42.         fr.close();  
  43.     }  
  44. }  

 

使用 bufferedReader 和 bufferWriter 方法写的一个复制文本的小程序

[java]  view plain  copy
  1. package IOtest;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.BufferedWriter;  
  5. import java.io.FileReader;  
  6. import java.io.FileWriter;  
  7. import java.io.IOException;  
  8.   
  9. public class TextCopyByBuf {  
  10.   
  11.     /** 
  12.      * 首先创建读取字符数据流对象关联所要复制的文件。 
  13.      * 创建缓冲区对象关联流对象。 
  14.      * 从缓冲区中将字符创建并写入到目的文件中。 
  15.      * @throws IOException  
  16.      */  
  17.     public static void main(String[] args) throws IOException {  
  18.         FileReader fr = new FileReader("C:\\demo.txt");  
  19.         FileWriter fw = new FileWriter("D:\\love.txt");  
  20.         BufferedReader bufr = new BufferedReader(fr);  
  21.         BufferedWriter bufw = new BufferedWriter(fw);  
  22.         // 一行一行的寫。  
  23.         String line = null;  
  24.         while((line = bufr.readLine()) != null){  
  25.             bufw.write(line);  
  26.             bufw.newLine();  
  27.             bufw.flush();  
  28.         }  
  29.     /*  一個字節一個字節的寫。 
  30.         int ch = 0; 
  31.         while((ch = bufr.read())!=-1){ 
  32.             bufw.write(ch); 
  33.         }*/  
  34.         bufr.close();  
  35.         bufw.close();  
  36.     }  
  37. }  

我们今天的关于用Java中的BufferedReader重置缓冲区?java bufferreader的分享已经告一段落,感谢您的关注,如果您想了解更多关于BufferedReader中的缓冲区大小是多少?、BufferedReader默认缓冲区大小?、J06-Java IO流总结六 《 BufferedReader和BufferedWriter 》、Java :BufferedWriter 类和 BufferedReader 类的构造方法、主要方法的相关信息,请在本站查询。

本文标签: