java入门篇12 --- IO操作

在jiava中InputStream跟OutputStream分别代表输入流跟输出流,接下来来看一下IO的相关操作

首先来看一下如何操作文件

import java.io.File;
import java.io.FilenameFilter;
import java.nio.file.Path;
import java.nio.file.Paths;

public class HelloWorld {
    public static void main(String[] args) throws Exception {
        File f = new File("./src/text.txt");
        System.out.println(f.isFile());  // true
        System.out.println(f.getPath());  // 获取构造方法的传入路径 ./src/text.txt
        System.out.println(f.getAbsolutePath());  // 获取绝对路径 /Users/***/Desktop/demo/javaDemo/./src/text.txt
        System.out.println(f.getCanonicalPath());  // 获取规范路径 /Users/***/Desktop/demo/javaDemo/src/text.txt
        File f1 = new File("./src");
        System.out.println(f1.isFile());  // false 判断是否是文件
        System.out.println(f1.exists());  // true  判断是否存在
        System.out.println(f1.isDirectory());  // true  判断是否是文件夹
        System.out.println(f1.getName());  // src  获取名字
        // 可以自定义文件过滤方式
        File[] f2 = f1.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".xml") || name.endsWith(".txt");
            }
        });
        if (f2 != null) {
            for (File ff : f2) {
                System.out.println(ff);
            }
        }  // ./src/logback.xml  ./src/text.txt
        // Path
        Path p = Paths.get(".", "src");  // 路径拼接
        System.out.println(p.toAbsolutePath());  // /Users/****/Desktop/demo/javaDemo/./src
        File f3 = p.toFile();  // 转化为文件
        System.out.println(f3.isDirectory());  // true
    }
}

好了,文件跟路径的一些基本操作输完了,现在来看一下流输入和流输出

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class HelloWorld {
    public static void main(String[] args) throws Exception {
        // 初始化一个流
        InputStream f = new FileInputStream("./src/text.txt");
        for (; ; ) {
            int n = f.read();
            // 如果返回值为-1,证明文件读取完毕
            if (n == -1) {
                break;
            }
            System.out.println(n);
        }  // 105 32 108 111 118 101 32 99 104 105 110 97
        // 最终我们要把文件关闭,避免造成不必要的内存浪费
        f.close();
        // try finally可以在报错情况下帮我们最终关闭,但是java帮助我们提供了更简洁的写法
        try (InputStream f1 = new FileInputStream("./src/text.txt")) {
            int n;
            // 一个字节一个自己读
            while ((n = f1.read()) != -1) {
                System.out.println((char) n); // i love china
                System.out.println(n); // 105 32 108 111 118 101 32 99 104 105 110 97
            }
        }
        // 还有一种复制的方法,当然还有很多方法,但是都大同小异
        try (InputStream f1 = new FileInputStream("./src/text.txt")) {
            int n;
            byte[] b = new byte[10];
            while ((n = f1.read(b)) != -1) {
                System.out.println(b);  // [[email protected]  10
                System.out.println(n);  // 10  2
            }
        }

        // OutputStream
        OutputStream o = new FileOutputStream("./src/text.txt");
        o.write(72); // 写入 H,原内容会被删除
        o.write(72);
        o.close();
        InputStream f3 = new FileInputStream("./src/text.txt");
        System.out.println(f3.read());  // 72
        System.out.println(f3.read());  // 72
        System.out.println(f3.read());  // -1 写入了两个字节,读出两个字节
        f.close();
        // 当然也可以一次写入多个字节
        try (OutputStream o1 = new FileOutputStream("./src/text.txt")) {
            o1.write("hello".getBytes(StandardCharsets.UTF_8));
        }
        try (InputStream f1 = new FileInputStream("./src/text.txt")) {
            byte[] b = f1.readAllBytes();
            for (byte b1 : b) {
                System.out.println((char) b1);  // hello
            }
        }
        // 读写 zip 文件
        try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream("t.zip"))) {
            File f4 = new File("./src/text.txt");
            zip.putNextEntry(new ZipEntry(f4.getName()));
            zip.write(new FileInputStream("./src/text.txt").readAllBytes());
            zip.closeEntry();
        }
        System.out.println("---");
        try (ZipInputStream zip = new ZipInputStream(new FileInputStream("t.zip"))) {
            ZipEntry ze = null;
            while ((ze = zip.getNextEntry()) != null) {
                String name = ze.getName();
                if (!ze.isDirectory()) {
                    int n;
                    while ((n = zip.read()) != -1) {
                        System.out.println((char) n);  // hello
                    }
                }
            }
        }
    }
}

读写配置文件

import java.io.*;
import java.util.Properties;

public class HelloWorld {
    public static void main(String[] args) throws Exception {
        // 读取配置文件的一种方法
        Properties p = new Properties();
        Properties p2 = new Properties();
        p.load(new FileInputStream("./src/default.properties"));
        System.out.println(p);  // {a=1, b=2}
        System.out.println(p.getProperty("a"));  // 1
        System.out.println(p.getProperty("not exist", "offer default value")); // offer default value
        // 从 classPath中读取配置信息
        p2.load(HelloWorld.class.getResourceAsStream("/default.properties"));
        System.out.println(p2);  // {a=1, b=2}
        // 写入配置
        Properties p3 = new Properties();
        p3.setProperty("user", "ning");
        p3.store(new FileOutputStream("./src/tt.propertites"), "anno for this");
        p3.load(new FileInputStream("./src/tt.propertites"));
        System.out.println(p3);  // {user=ning}
    }
}

根据字符来写入写出文件

import java.io.*;
import java.nio.charset.StandardCharsets;

public class HelloWorld {
    public static void main(String[] args) throws Exception {
        //  根据字符流读写文件
        try (Writer w = new FileWriter("./src/text.txt", StandardCharsets.UTF_8)) {
            w.write(‘h‘);  // 写入字符
            w.write("hello".toCharArray()); // 写入字符数组
            w.write("hello");  // 写入字符串
            w.write("我爱我家"); // 写入字符串
        }
        //,跟InputStream差不多,也有很多种读取方法,下面只lie了一种
        try (Reader r = new FileReader("./src/text.txt", StandardCharsets.UTF_8)) {
            int n;
            while ((n = r.read()) != -1) {
                System.out.println((char) n);
            }  // hhellohello我爱我家
        }

    }
}

原文地址:https://www.cnblogs.com/yangshixiong/p/12172992.html

时间: 2024-11-09 05:09:58

java入门篇12 --- IO操作的相关文章

Java基础梳理之-IO操作

回想最开始学习Java IO相关的操作时, 被各种Reader/Stream绕晕. 现在再回头梳理这一块的知识点,感觉清晰了很多. Java作为编程语言,大部分东西都是从系统层面带来的, 所以学习的知识点虽然在Java, 但是背后的答案却在操作系统层面. 首先理解核心概念:IO, 究竟什么是IO? 所谓IO就是内存与外设相关的数据传输.常用的外设有硬盘,网卡,打印机, 鼠标...我们接触最频繁的IO操作是硬盘上文件的读写,所以学习IO基本上都是以文件操作为例子.IO作为操作系统的核心,知识点相当

黑马程序员--Java基础--文件数据IO操作

文件数据IO操作 1. Reader和Writer 1.1. 字符流原理 Reader是所有字符输入流的父类而Writer是所有字符输出流的父类.字符流是以字符(char)为单位读写数据的.一次处理一个unicode.字符流都是高级流,其底层都是依靠字节流进行读写数据的,所以底层仍然是基于字节读写数据的. 1.2. 常用方法 Reader的常用方法: int read() 读取一个字符,返回的int"值低16"位有效. int read(char[] chs) 从该流中读取一个字符数组

java入门篇3 --- 基本数据类型的运算

一.整数 1.运算 java的整数运算遵从基本的四则运算,不再赘述 下面说一下整数的除法得到的结果永远是精确的,也就是除不尽就给你取整,我记得python2的int类型会保留小数,python3之后也只保留整数 另外取余也是使用%,除法如果除数是0,运行时会报错. 注意,整数有范围,如果超出最大的会溢出,感觉像是又重新走了一个循环.请根据需要使用整型的类型,如果数值大于int范围,可以使用long 另外java也支持n++, n+=1语法糖 public class HelloWorld { p

java入门了解12

1.SequenceInputStream序列流:能将其他输入流的串联 用处:读完第一个再去读第二个输入流 用法:构造方法:SequenceInputStream(InputStream s1,InputStream s2):串联2个InputStream还可以,多个就很麻烦: SequenceInputStream(Enumeration<? extends InputStream> e):Enumation对象需要通过Vector中获取,Vector是一个集合不过因为考虑线程安全效率比较低

java入门篇4 --- 引用类型

1.String字符串 我们常用的字符串属于引用类型,它可以包含0至n个字符,String使用双引号,字符串的拼接也可以使用+ public class HelloWorld { public static void main(String[] args) { String s = "我爱中国"; String s1 = "i " + "love " + "china"; String s2 = null; // String

java入门篇11 --- 集合

无论什么语言,集合应当是我们最常用的一种类型啦,大体上分为有序列表.map.sey.队列 首先先来看一下有序列表, List内部跟数组一样也是按照先后顺序排放的,但对于增删,非常方便,list的实现大多是使用ArrayList实现的,先来看一下List的源码,这里面有一个<E>,这个就是泛型,java是面向对象语言,他在运行期间,才会将我们的类进行初始化,因此,就利用这一特性,我们输入指定的引用类型,注意必须是引用类型,基本类型不是类,JVM在编译是,会把它当作object,然后再运行期间就会

Elasticsearch 2.2.0 JAVA开发篇:搜索操作

普通查询 Elasticsearch java API同时提供了强大的搜索功能,不过这也是很正常的因为所有的http接口到后面都要转换成java代码才可以执行.索引名和type名称都可以是多个,用逗号分开. SearchRequestBuilder  sbuilder = client.prepareSearch("secilog") //index name .setTypes( "type") //type name .setSearchType(SearchT

java入门篇10 --- 注解

从JVM的角度看,注解本身对代码逻辑没有任何影响,如何使用注解完全由工具决定. Java的注解可以分为三类: 第一类是由编译器使用的注解,例如: @Override:让编译器检查该方法是否正确地实现了覆写: @SuppressWarnings:告诉编译器忽略此处代码产生的警告. 这类注解不会被编译进入.class文件,它们在编译后就被编译器扔掉了. 第二类是由工具处理.class文件使用的注解,比如有些工具会在加载class的时候,对class做动态修改,实现一些特殊的功能.这类注解会被编译进入

Java中常用的IO操作基本上可以分为四大部分

http://www.songtaste.com/user/11237131/infohttp://www.songtaste.com/user/11237161/infohttp://www.songtaste.com/user/11237129/infohttp://www.songtaste.com/user/11237216/infohttp://www.songtaste.com/user/11237231/infohttp://www.songtaste.com/user/11237