JAVA I/0 流学习(一)

版权声明:原创文章,转载请注明 https://blog.csdn.net/qq_37482202/article/details/82494922

java I/0流属于java基础知识,是每个java学习者必须要掌握的知识点,尤其是在学习网络编程时尤为重要。

在变量、数组和对象中存储的数据是暂时存在的,程序结束后它们就会丢失,为了能够永久地保存程序创建的数据,需要将其保存在磁盘文件中,这样就可以在其他程序中使用它们。JAVA的 I/O技术可以将数据保存到文本文件中、二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求。掌握I/O处理技术能够提高对数据的处理能力。

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。

Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。

 

流是一组有序的数据序列,根据流操作的类型,可分为输入流和输出流两种。I/O(Input/Output,输入/输出)流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。虽然I/O流通常与磁盘文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口等。

理解:

一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

JAVA语言定义了许多类专门负责各种方式的输入/输出,这些类都被放在java.io包中。其中,所有输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;而所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。

 

1.输入流

InputStream类是字节输入流的抽象类,该类中所有方法遇到错误时都会引发IOException异常。

read()方法:从输入流中读取数据的下一个字节。返回0~255范围内的int字节值。如果因为已经到达流末尾而没有可用的下一个字节,则返回值为-1

read(byte[] b):从输入流中读入一定长度的字节,并以整数的形式返回字节数。

mark(int readlimit)方法:再输入流的当前位置放置一个标记,readlimit参数告知此输入流在标记位置失效之前允许读取的字节数。

reset()方法:将输入指针返回到当前所做的标记处

skip(long n)方法:跳过输入流上的n个字节并返回实际跳过的字节数

markSupported()方法:如果当前流支持mark()/reset()操作就返回true

close()方法:关闭此输入流并释放与该流关联的所有系统资源

注意:并不是所有的InputStream类的子类都支持InputStream中定义的所有方法,如skip()、mark()、reset()等方法只对某些子类有用

import java.io.FileInputStream;

public class FileInputStream_test {
    //读取桌面上的txt文件并输出内容
    public static void main(String[] args) throws Exception {
        FileInputStream fileInputStream=new FileInputStream("C:\\Users\\liuyue\\Desktop\\test.txt");
        byte[] bytes=new byte[1024];
        int len=fileInputStream.read(bytes);
        String string=new String(bytes,0,len);
        System.out.println(string);
        fileInputStream.close();
    }

}

java中的字符是Unicode编码,是双字节的。InputStream是用来处理字节的,并不适合处理字符文本。JAVA为字符文本的输入专门提供了一套单独的类Reader,但Reader类并不是InputStream类的替换者,知识在处理字符串时简化了编程。Reader类是字符出入流的抽象类,所有字符输入流的实现都是它的子类。

Reader类中的方法与InputStream类中的方法类似。

2.输出流

OutputStream是字节输出流的抽象类,此抽象类是表示字节流的所有类的超类。

OutputStream类中的所有方法均返回void,在遇到错误时会引发IOException异常。

write(int b)方法:将指定的字节写入此输出流

write(byte[] b)方法:将b个字节从指定的byte数组写入此输出流

write(byte[] b,int off,int len)方法:将指定byte数组中从偏移量off开始的len个字节写入此输出流

flush()方法:彻底完成输出并清空缓存区

close()方法:关闭输出流

和Reader一样,JAVA为字符文本的输出专门提供了一套单独的类Writer,用法和OutputStream一样

3.File类

File类是java.io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息,如文件所在的目录、文件的长度、文件读写权限等。数据流可以将数据写如文件中,文件流也是数据里最常用的数据媒体。

File类有三种构造方法:

  1. File(String pathname)  pathname为路径名称

  2. File(String parent,String child)  parent:父路径字符串  child:子路径字符串

  3. File(File f,String child)  f:父路径对象  child:子路径字符串

注意:对于windows,包含盘符的路径名前缀由驱动器号和一个“;”组成。如果路径名是绝对路径名,还可能后跟“\\”

File类提供了很多方法用于获取一些文件本身信息:

boolean canExecute()  判断文件是否可以执行

boolean canRead() 判断文件是否可读

boolean canWrite() 判断文件是否可写

boolean exist() 判断文件是否存在

boolean isDirectory() 判断文件是目录

boolean isFile() 判断是否是文件

boolean canHidden() 判断文件是否可见

boolean isAbsolute() 判断文件是否是绝对路劲 ,文件不存在也能判断

String getName()  得到文件名

String getPath()  得到文件路径名

String getAbsolutePath()  获取文件的绝对路径

String getParent()  如果没有父目录返回null

long lastModified()  获取最后一次修改的时间

long length()  获取文件的长度(以字节为单位)

import java.io.File;
import java.util.Date;

public class File_test {
    public static void main(String[] args) {
        File file=new File("C:\\Users\\liuyue\\Desktop\\test.txt");
        if (file.exists()){
            String name=file.getName();
            System.out.println("文件名:"+name);
            boolean read=file.canRead();
            System.out.println("是否可读:"+read);
            boolean write=file.canWrite();
            System.out.println("是否可写:"+write);
            long size=file.length();
            System.out.println("文件长度:"+size);
            boolean hide=file.isHidden();
            System.out.println("是否为隐藏文件:"+hide);
            Date date=new Date(file.lastModified());
            System.out.println("最后修改时间:"+date);
            file.delete();
            System.out.println("文件已删除");
        }else {
            try {
                file.createNewFile();
                System.out.println("文件已创建");
            }catch (Exception e){
                System.out.println(e);
            }
        }
    }
}

运行结果:

 4.FileInputStream与FileOutputStream类

FileInputStream类与FileOutputStream类都用来操作磁盘文件。如果用户的文件读取需求比较简单,则可以使用FileInputStream类,该类继承自InputStream类。FileOutputStream类与FileInputStream类对应,提供了基本的文件写入能力。FileOutputStream类是OutputStream类的子类。

FileInputStream类的常用的构造方法一共两种:

FileInputStream(String name)

FileInputStream(File file)

第一个构造方法使用给定的文件名name创建一个FileInputStream类相同的参数构造方法,创建一个FileOutputStream对象时,可以指定不存在的文件名,但此文件不能是一个已被其它程序打开的文件。


import java.io.FileInputStream;

public class FileInputStream_test {
    public static void main(String[] args) throws Exception {
        FileInputStream fileInputStream=new FileInputStream("C:\\Users\\liuyue\\Desktop\\test.txt");
        byte[] bytes=new byte[1024];
        int len=fileInputStream.read(bytes);
        String string=new String(bytes,0,len);
        System.out.println(string);
        fileInputStream.close();
    }

}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStream_test {
    public static void main(String[] args) {
        try {
            File file = new File("C:\\Users\\liuyue\\Desktop\\test.txt");
            if (!file.exists()){
                file.createNewFile();
            }
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write("我有一只小毛驴,我从来也不骑".getBytes());
            fileOutputStream.close();
        }catch (IOException e){
            System.out.println(e);
        }
    }
}

5.FileReader和FileWriter类

FileInputStream和FileOutputStream类都只提供了对字节或字节数组的读取方法。由于汉字在文件中占用两个字节,如果使用字节流,读取不好可能会出现乱码现象,此时采用字符流Reader或Writer类即可避免这种现象。

int read()   读取单个字符。返回作为整数读取的字符,如果已达到流末尾,则返回 -1。

int read(char []cbuf)  将字符读入数组。返回读取的字符数。如果已经到达尾部,则返回-1。

void close()   关闭此流对象。释放与之关联的所有资源。

我在这里写了一个swing小程序来演示两个类的使用,用户需要先点选择文件选取一个txt文件后才能点击读取文本、修改文本、写入文本。

import javax.swing.*;
import javax.swing.filechooser.FileSystemView;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class FileReader_and_FileWriter {
    /**
     * 定义控件
     */
    private JPanel jContentPanel;
    private JTextArea jTextArea;
    private JPanel jControlPanel;
    private JButton writeButton;
    private JButton readButton;
    private JButton openButton;
    private JFrame jFrame;
    private int result = 0;
    private File file = null;
    private String path = null;

    /**
     * 初始化控件--》将控件添加到面板中--》将面板添加到窗体中
     */
    private void initControl(){
        openButton=new JButton();
        openButton.setText("选择文件");
        writeButton=new JButton();
        writeButton.setText("写入文件");
        readButton=new JButton();
        readButton.setText("读取文件");
        jFrame=new JFrame();
        jFrame.setSize(1000,700);
        jContentPanel=new JPanel();
        jContentPanel.setLayout(new BorderLayout());
        jTextArea=new JTextArea();
        jTextArea.setSize(900,550);
        jContentPanel.add(jTextArea,BorderLayout.CENTER);
        jControlPanel=new JPanel();
        jControlPanel.setSize(900,100);
        jControlPanel.add(openButton);
        jControlPanel.add(writeButton);
        jControlPanel.add(readButton);
        jContentPanel.add(jControlPanel,BorderLayout.SOUTH);
        jFrame.setContentPane(jContentPanel);
        jFrame.setTitle("JFream");
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //居中显示
        jFrame.setLocationRelativeTo(null);
        //窗体可见
        jFrame.setVisible(true);
    }

    /**
     * 初始化监听
     */
    private void initListener(){
        writeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //如果未选择文件提示选择文件
                if (file==null){
                    showMessage("请先选择文件!");
                    return;
                }
                try {
                    FileWriter out=new FileWriter(file);
                    String s=jTextArea.getText();
                    out.write(s);
                    out.close();
                    showMessage("写入成功!");
                }catch (Exception exception){
                    System.out.println(exception);
                }
            }
        });
        readButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //如果未选择文件提示选择文件
                if (file==null){
                    showMessage("请先选择文件!");
                    return;
                }
                try {
                    FileReader in=new FileReader(file);
                    char[] chars=new char[1024];
                    int len=in.read(chars);
                    jTextArea.setText(new String(chars,0,len));
                    in.close();
                }catch (Exception exception){
                    System.out.println(exception);
                }
            }
        });
        openButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //开始选择文件
                JFileChooser fileChooser = new JFileChooser();
                FileSystemView fsv = FileSystemView.getFileSystemView();
                System.out.println(fsv.getHomeDirectory());
                //得到桌面路径并设置当前位置为桌面
                fileChooser.setCurrentDirectory(fsv.getHomeDirectory());
                fileChooser.setDialogTitle("请选择要编辑的文件");
                fileChooser.setApproveButtonText("确定");
                fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                result = fileChooser.showOpenDialog(jFrame);
                if (JFileChooser.APPROVE_OPTION == result) {
                    //得到选择的文件路径
                    path=fileChooser.getSelectedFile().getPath();
                    file=new File(path);
                    System.out.println("path: "+path);
                }
            }
        });
    }

    /**
     * 弹出提示框
     * @param string
     */
    private void showMessage(String string){
        JOptionPane.showMessageDialog(null, string,"提示", JOptionPane.PLAIN_MESSAGE);
    }
    public static void main(String[] args) {
        FileReader_and_FileWriter fileReader_and_fileWriter=new FileReader_and_FileWriter();
        fileReader_and_fileWriter.initControl();
        fileReader_and_fileWriter.initListener();
    }
}

未完待续。。。

猜你喜欢

转载自blog.csdn.net/qq_37482202/article/details/82494922