IO流

字符流和字节流:
字节流有两个基类:
InputStream
OutputStream

字符流两个基类:
Reader
Writer

先学习一下字符流的特点。
既然Io流是用于操作数据的,那么数据的最常见体现形式是文件。那么先以操作文件为主来演示。

这是IO异常处理的方式:

public class Main {

    public static void main(String[] args) throws IOException
    {
	// write your code here
        //一个FileWriter对象。该对象一被初始化就必须要明确被才做的文件。
        //而且该文件会被创建到指定目录下。如果该目录下已有同名文件,则会被覆盖。
        FileWriter fw=null;
        try {
            fw=new FileWriter("d:\\out.txt");//在try初始化
            //调用write方法,将字符写入到流中,需要抛IO异常
            fw.write("abcde");
        }catch (IOException e)
        {
            System.out.println(e.toString());
        }
        finally
        {
            try {
                if (fw!=null)
                     fw.close();
            }catch (IOException e)
            {
                System.out.println(e.toString());
            }
        }
    }
}

自定义一个类中包含一个功能和readLine一致的方法。来模拟一下BufferedReader

class MyBufferedReader
{
    private FileReader r;
    MyBufferedReader(FileReader r)
    {
        this.r=r;
    }
    //可以一次读一行的方法
    public String myreadline()throws IOException
    {
        StringBuilder sb=new StringBuilder();
        int ch=0;
        while ((ch=r.read())!=-1)
        {
            if (ch=='\r')
                continue;
            if (ch=='\n')
                return sb.toString();
            sb.append((char)ch);
        }
        if (sb.length()!=0)
            return sb.toString();
        return null;
    }
    public void myclose()throws IOException
    {
        r.close();
    }
}

JAVA编程思想上的几个小练习:
练习8.打开一个文本文件,每次读取一行内容。将每行作为一个String读入,并将那个String对象置入一个LinkedList中。按相反的顺序打印出LinkedList中的所有行

    public static void bufferinput()throws IOException
    {
        /*
        为了提高效率,加入缓冲技术,将字符读取流对象作为参数传递给缓冲对象
        的构造函数。
         */
        FileReader fr=new FileReader("C:\\Users\\Wave\\Desktop\\新建文件夹\\kaguya.txt");
        //fr最后不需要关闭
        BufferedReader in=new BufferedReader(fr);
        String s;
        LinkedList lk=new LinkedList();
        StringBuilder sb=new StringBuilder();
        while ((s=in.readLine())!=null)
        //readLine方法返回的时候只返回回车符之前的数据内容,并不返回回车符
        {
            sb.append(s+"\n");
            lk.add(s+"\n");
        }
        in.close();
        formattedinput(lk);
        System.out.print(sb.toString());
        Iterator it=lk.iterator();
        while (it.hasNext())
        {
            s=it.next().toString();
            reverseout(s);
        }
    }
public static void formattedinput(LinkedList lk)throws IOException
{
    BufferedWriter out=new BufferedWriter(new FileWriter(filename));
    String s;
    Iterator it=lk.iterator();
    while (it.hasNext())
    {
        out.write(it.next().toString());
    }
    out.close();
}
public static void reverseout(String s)
{
    char[] s1=s.toCharArray();
    int len=s.length();
    for (int i=len-1;i>0;i--)
    {
        System.out.print(s1[i]);
    }
}

练习17.用TextFile和Map<Character,Integer>创建一个程序,它可以对一个文件中所有不同字符出现的次数进行计数。

    public static void TextFile(FileReader fr)throws IOException
    {
        Map<Character,Integer> m=new HashMap<Character, Integer>();
        BufferedReader br=null;
        int s;
        int count=0;
        char c;
        char[] chs;
        try {
            br=new BufferedReader(fr);
            while ((s=br.read())!=-1)
            {
                c=(char)s;
                if (!(c>='a'&&c<='z'||c>='A'&&c<='Z'))
                {
                    continue;
                }
                Integer value=m.get(c);//获取值
                if (value!=null)
                {
                    count=value;
                }
                count++;
                m.put(c,count);
                count=0;
            }
            System.out.print(m);
        }catch (IOException e)
        {
            System.out.print(e.toString());
        }finally {
            try{
                if (br!=null)
                    br.close();
            }catch (IOException e)
            {
                System.out.print(e.toString());
            }
        }
    }

练习21.接受标准输入并将所有字符转换成大写,
再将结果写入到标准输出流中。将文件的内容重定向到该程序中

public static void changeupper() throws IOException
{
    BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter out=new BufferedWriter(new FileWriter(filename));
    String s,str;
    //标准输入
    while ((s=stdin.readLine())!=null&&s.length()!=0)
    {
        str=s.toUpperCase();
        out.write(str+"\n");
    }
    out.close();
}
09-04
IO指的是输入(input)和输出(Output),是一种抽象概念,是对数据传输的总称,即数据在设备间的传输称为,其本质是数据传输。IO用来处理设备间数据传输问题,常见应用有文件复制、文件上传、文件下载等[^1]。 IO可以从多个维度进行分类: - 按方向分类:可分为输入和输出。 - 按传输单位分类:有字节和字符。 - 按功能分类:可分为节点和处理等。 在Java中,常见的IO包括以下几类: ### 字符 - `FileReader`/`FileWriter`:用于读写文件的字符。 - `BufferedReader`/`BufferedWriter`:提供缓冲功能,提高读写效率。 - `PipedReader`/`PipedWriter`:用于线程间通信的管道。 - `InputStreamReader`/`OutputStreamWriter`:用于字节和字符之间的转换。 - `PrintWriter`:方便进行格式化输出的字符输出。 ### 字节 - `InputStream`/`OutputStream`:字节的抽象基类。 - `FileInputStream`/`FileOutputStream`:用于读写文件的字节。 - `FilterInputStream`/`FilterOutputStream`:过滤的抽象基类。 - `BufferedInputStream`/`BufferedOutputStream`:提供缓冲功能的字节。 - `DataInputStream`/`DataOutputStream`:用于读写基本数据类型的字节。 - `ObjectInputStream`/`ObjectOutputStream`:用于对象的序列化和反序列化。 - `PrintStream`:方便进行格式化输出的字节输出。 以下是一些Java中使用IO的代码示例: #### 字节读取文件 ```java import java.io.FileInputStream; import java.io.IOException; public class ByteStreamReadExample { public static void main(String[] args) { try { // 创建一个读取文件的对象 FileInputStream fIpS = new FileInputStream("D:\\IdeaProjects\\untitled1\\untit__IO\\src\\Day_2\\fIpS_1.txt"); // 调用该对象的读取方法 // 字节读数据的标准代码 int read; while ((read = fIpS.read()) != -1) { System.out.print((char) read); } // 关闭此文件输入并释放与相关联的任何系统资源 fIpS.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` #### 字节写入文件 ```java import java.io.FileOutputStream; import java.io.IOException; public class OutputDemo2 { public static void main(String[] args) { try { // 1. 创建字节输出的对象 // 注意点:如果文件不存在,会帮我们自动创建出来. // 如果文件存在,会把文件清空. FileOutputStream fos = new FileOutputStream("C:\\itheima\\a.txt"); // 2. 写数据 传递一个整数时,那么实际上写到文件中的,是这个整数在码表中对应的那个字符. fos.write(98); // 3. 释放资源 fos.close(); // 告诉操作系统,我现在已经不再用这个文件了. } catch (IOException e) { e.printStackTrace(); } } } ``` #### 字符写入文件 ```java import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class CharacterStreamWriteExample { public static void main(String[] args) { try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:/news11.txt")))) { bw.write("hi,韩顺平教育"); } catch (IOException e) { e.printStackTrace(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值