Java—IO—1

Java—I/O—1

1.File

2.输入输出流和转换流

3.内存流

4.编码方式

1.File

File是一个普通类,在java.io包下,表示的是可进行流操作的文件终端对象

File的构造方法有几个重载:

1.可以传入URI;2.可以传入String(路径名)

有几个常用方法:

方法解释
public boolean exists()文件是否存在
public boolean createNewFile() throws IOException创建一个新文件
public boolean delete()文件删除
public long lastModified()文件最后修改日期
public long length()文件长度
public boolean mkdirs()创建多级父目录
public boolean isFile()指定指定终端是否适宜个文件
public boolean isDirectory()指定终端是否是一个目录
public File getParentFile()或许文件父路径
public File[] listFiles()文件是输出路径下所有文件,但是如果文件是目录则不输出
//创建一个终端对象,如果存在则删除,如果不存在那么创建一个新对象
public class Test {
    public static void main(String[] args) throws IOException {
        File file=new File("D:\\Test.txt");
        if(file.exists()&&file.isFile()){
            file.delete();
        }else{
            file.createNewFile();
        }
    }
}

输出桌面上所有文件:为了避免文件太大而阻塞性开一个线程去执行

public class Test {
    public static void main(String[] args) throws IOException {
      File file=new File("C:\\Users\\admin\\Desktop");
        System.out.println(Thread.currentThread().getName()+"开始");
        new Thread(new Runnable(){
            @Override
            public void run() {
                AllListFiles(file);
            }
        }).start();
        System.out.println(Thread.currentThread().getName()+"结束");

    }
    public static void AllListFiles(File file){
        //如果是一个文件则输出
        if(file.isFile()){
            System.out.println(file);
        }else{
            //如果不是文件并且存在且是一个目录
            if(file.exists()&&file.isDirectory()){
                //调用listFiles()输出全部文件
                File[] file1=file.listFiles();
                //递归
                for (File i:file1){
                    AllListFiles(i);
                }
            }
        }
    }
}

如果创建一个文件,并且文件目录并不存在,那么可以使用mkdirs()创建多级父目录

public class Test{
    public static void main(String[] args) throws IOException {
        File file=new File("D:\\hello\\world\\Test.txt");
        if (file.exists()&&file.isFile()){
            System.out.println(file);
        }else{
            file.getParentFile().mkdirs();
            file.createNewFile();
        }
    }
}

2.输入输出流和转换流

输入输出流分为两类(顶层接口):

1.字节输入输出流:InputStream,OutputStream

2.字符输入输出流:Reader,Writer

其中,有两个常用的方法

write():

方法解释
public void write(int b) throws IOException将文件输出到目标终端,每次输出一个字节
public void write(byte b[]) throws IOException将文件输出到目标终端,每次输出一个数组
public void write(byte b[], int off, int len) throws IOException输出指定的字节输入到目标终端终

read()

方法解释
public int read() throws IOException将目标终端的内容输入到程序中,一次单个字节
public int read(byte b[])一次输入b数组
public int read(byte b[], int off, int len) throws IOException一次数出指定长度

read()方法是有返回值的:

返回值代表数据的读取个数,

1.如果要读取的数据长度>接收数组长度,说明文件还没有读完,返回数组长度 反之,则返回,读取数组的长度,如果返回值为-1,代表已经读完public int read(byte b[]):

2.一次读取len个字节,如果取满了,返回len,如果没有则返回读取的数据个数,如果读取到最后,没有数据返回-1 public int read(byte b[], int off, int len) throws IOException;

3.一次读取单个字节,读完返回-1,public int read() throws IOException

文件流要注意:在使用流后一定要进行关闭流操作,会一直占用内存所以一定要关闭流

public class Test{
    public static void main(String[] args) throws IOException {
       File file=new File("D:\\Text.txt");
        OutputStream outputStream=new FileOutputStream(file);
        outputStream.write("Haha".getBytes());
        outputStream.close();
    }

Java还提供了一个自动关闭流的方法 和 try—catch一起使用

public class Test{
    public static void main(String[] args) throws IOException {

       File file=new File("D:\\Test.txt");
        //创建流的方式
        try ( OutputStream outputStream=new FileOutputStream(file)){
            outputStream.write("Haha".getBytes());
        }catch (Exception e){
            
        }
    }

文件的输入:

public class Test{
    public static void main(String[] args) throws IOException {
       
       File file=new File("D:\\Test.txt");
       InputStream inputStream=new FileInputStream(file);
       byte[] data=new byte[1024];
       int len=0;
       while((len=inputStream.read(data))!=-1){
           System.out.println(new String(data,0,len));
       }
       inputStream.close();
    }
}

但是OutputStream outputStream=new FileOutputStream(file),会覆盖文件中已有内容,如果想追加

OutputStream outputStream=new FileOutputStream(file,true) 将可追加 设置为true即可

········上述将的是字节流,主要是用于传输一些,视频,音乐,图片比较方便 ,但是如果要用于中文就不是特别友好了·······

Write和Reader:

和上述用法基本一致,构造方法为:

Writer writer=new FileWriter(file);
Reader reader=new FileReader(file);

但是,他是对字符的操作,

write() 方法可以穿出字符串,字符数组,单个字符

reader()方法只能用字符数组

转换流,就是将字节流转换成字符流的操作,是Write和Reader的子类

构造方法

Writer writer1=new OutputStreamWriter(字节流);
Reader reader1=new InputStreamReader(new FileInputStream(file));

3.内存流

1.内存输入流(将指定内容输入内存中):ByteArrayOutputStream ,CharArrayWriter

2.内存输出流(将内容从内存中输出):ByteArrayInputStream,CharArrayReader

public class Test{
    public static void main(String[] args) throws IOException {
        InputStream inputStream=new ByteArrayInputStream("String".getBytes());
        OutputStream outputStream=new ByteArrayOutputStream();
        int len=0;
        while(true){
             len=inputStream.read();
             if(len==-1){
                 break;
             }
             SoutputStream.write(Character.toUpperCase(len));
        }
        System.out.println(outputStream);
        inputStream.close();
        outputStream.close();
    }
}

4.编码方式

1.UNICODE:适合所有语言,GB2312只包含简体中文。

2.JBK:中文,支持简体中文和繁体中文。

3.ISO8859-1:国际编码(预览器默认编码)

4.UTF-8:unicode和ISO8859-1的组合

基本上95%产出乱码的原因是因为编解码不一致,还有一种是数据丢失导致的编码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值