Java基础知识IO流(自定义readLine()方法)

本文介绍了一个自定义的MyBufferedReader类,该类继承了Java的Reader类并实现了类似BufferedReader的功能,特别是readLine方法,用于按行读取文本文件。
/*
明白了BufferedReader类中特有方法readLine的原理后,
可以自定义一个类中包含一个功能和readLine一致的方法。
来模拟一下BufferedReader
*/
import java.io.*;
class MyBufferedReader extends Reader
{

    private Reader r;
    MyBufferedReader(Reader r)
    {
        this.r = r;
    }

    //可以一次读一行数据的方法。
    public String myReadLine()throws IOException
    {
        //定义一个临时容器。原BufferReader封装的是字符数组。
        //为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。
        StringBuilder sb = new StringBuilder();
        int ch = 0;
        while((ch=r.read())!=-1)
        {
            if(ch=='\r')
                continue;
            if(ch=='\n')
                return sb.toString();
            else
                sb.append((char)ch);
        }

        if(sb.length()!=0)
            return sb.toString();
        return null;        
    }

    /*
    覆盖Reader类中的抽象方法。

    */
    public int read(char[] cbuf, int off, int len) throws IOException
    {
        return r.read(cbuf,off,len) ;
    }

    public void close()throws IOException
    {
        r.close();
    }
    public void myClose()throws IOException
    {
        r.close();
    }
}


class  MyBufferedReaderDemo
{
    public static void main(String[] args) throws IOException
    {
        FileReader fr = new FileReader("buf.txt");

        MyBufferedReader myBuf = new MyBufferedReader(fr);

        String line = null;

        while((line=myBuf.myReadLine())!=null)
        {
            System.out.println(line);
        }

        myBuf.myClose();
    }
}
<think>嗯,用户让我只用IO、集合和Java基础知识来编写一个程序。首先,我需要确定用户的具体需求是什么,可能他们想实现一个简单的文件操作,比如读取文件内容,处理数据,然后输出结果。或者可能是统计单词频率,或者文件复制之类的功能。不过用户没有给出具体的需求,所以我得选择一个常见的例子,比如统计文本文件中每个单词的出现次数,这通常会用到集合和IO。接下来,我需要考虑如何实现这个功能。首先,使用FileReader和BufferedReader来读取文件,这样可以逐行读取内容。然后,用String的split方法分割每一行中的单词,可能需要用正则表达式处理标点符号,比如将非字母字符替换为空格,再分割成单词数组。接着,使用HashMap来存储每个单词及其出现次数,遍历单词数组,将单词转为小写以确保大小写不敏感,然后更新HashMap中的计数。 处理完所有行后,关闭输入。然后,需要将结果写入到另一个文件中,这里可以用FileWriter和BufferedWriter,按出现次数降序排序单词。排序的话,可以将HashMap的entrySet转换为List,再用Collections.sort()自定义比较器,按值降序排列。最后遍历排序后的列表,将每个条目写入文件。 另外,要注意异常处理,比如文件找不到的情况,IO异常等,这里用try-with-resources来自动关闭资源,避免资源泄漏。同时,处理单词时要去掉前后空格,并过滤掉空字符串,避免统计到无效的单词。可能遇到的问题包括文件路径错误,需要确保输入文件存在;字符编码问题,但这里假设使用默认编码;还有大小写处理,比如是否区分大小写,例子中统一转为小写,所以不区分。此外,标点符号的处理可能不够全面,比如连字符或缩写,但作为基础示例,简单的替换可能足够。现在,编写代码的大致步骤是:读取文件,处理每一行,分割单词,统计到Map,排序,然后写入结果。测试一下代码是否能在给定路径下正确运行,输入文件是否存在,输出文件是否生成正确的内容。 最后,根据用户的要求,还需要提出相关问题,这些问题应该围绕使用的技术点,比如IO的类型、集合框架的使用、异常处理,以及可能的扩展问题,比如处理大文件时的优化,或者其他集合类的选择原因等。</think>以下是使用Java基础IO和集合实现的"统计文本文件单词出现次数并输出结果到新文件"的示例代码: ```java import java.io.*; import java.util.*; public class WordCounter { public static void main(String[] args) { String inputFile = "input.txt"; String outputFile = "output.txt"; try (BufferedReader reader = new BufferedReader(new FileReader(inputFile)); BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) { Map<String, Integer> wordCount = new HashMap<>(); String line; while ((line = reader.readLine()) != null) { // 使用正则表达式分割单词(处理标点符号) String[] words = line.replaceAll("[^a-zA-Z ]", " ") .toLowerCase() .split("\\s+"); for (String word : words) { word = word.trim(); if (!word.isEmpty()) { wordCount.put(word, wordCount.getOrDefault(word, 0) + 1); } } } // 将结果排序 List<Map.Entry<String, Integer>> sortedList = new ArrayList<>(wordCount.entrySet()); sortedList.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue())); // 写入结果 for (Map.Entry<String, Integer> entry : sortedList) { writer.write(entry.getKey() + ": " + entry.getValue()); writer.newLine(); } System.out.println("Word count completed. Results saved to " + outputFile); } catch (IOException e) { System.err.println("Error processing files: " + e.getMessage()); } } } ``` 实现解释: 1. 使用`BufferedReader`和`FileReader`高效读取输入文件 2. 使用正则表达式`[^a-zA-Z ]`过滤非字母字符,保留空格 3. 通过`split("\\s+")`分割单词,处理多个空格的情况 4. 使用`HashMap`存储单词计数,利用`getOrDefault`方法简化计数逻辑 5. 将Map的entry转换为ArrayList进行排序,使用lambda表达式实现降序排序 6. 使用`BufferedWriter`和`FileWriter`将结果写入输出文件 7. 使用try-with-resources自动关闭资源 8. 处理了IO异常并提供错误提示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值