Java入门 3. IO笔记

File操作

File f = new File("C:\\Windows\\notepad.exe");
   // 上一级目录:..\ 当前目录的上一级目录
   //当前目录:.\ 表示当前目录
   //当前盘符根目录:\ 表示当前盘符根目录 ,
   // windows中java字符串,到了这里全部用\\替换\
   // 如果是在windows命令行中,上面命令前加cd即可
  // 其实写java的时候,也可以用\代替//,这是相通的,最后在Java中均windows输出中均转为C:\...\

例如,调用isFile(),判断该File对象是否是一个已存在的文件,调用isDirectory(),判断该File对象是否是一个已存在的目录:
System.out.println(f1.isFile());
System.out.println(f1.isDirectory());

当File对象表示一个目录时,可以使用list()和listFiles()列出目录下的文件和子目录名。listFiles()提供了一系列重载方法,可以过滤不想要的文件和目录:
 File f = new File("C:\\Windows");
 File[] fs1 = f.listFiles(); // 列出所有文件和子目录
        if (files != null) {
            for (File f : files) {
                System.out.println(f);
            }
        }

Inputstream

InputStream就是Java标准库提供的最基本的输入流

1.常规用法,注意这里先赋值n=read后判断是关键,read会一个自己一个字节读
2.Inputstream相当于管道,用完一次后就不能再读了,需要注意!
public void readFile() throws IOException {
    try (InputStream input = new FileInputStream("src/readme.txt")) {
        int n;
        while ((n = input.read()) != -1) {
            System.out.println(n);
        }
    } // 编译器在此自动为我们写入finally并调用close()
}

3. 缓冲
int read(byte[] b):读取若干字节并填充到byte[]数组,返回读取的字节数
int read(byte[] b, int off, int len):指定byte[]数组的偏移量和最大填充数(一次读的字节数)

4. nputStream实现类,如何仿造文件去测试,ByteArrayInputStream可以在内存中模拟一个InputStream
        byte[] data = { 72, 101, 108, 108, 111, 33 };
        try (InputStream input = new ByteArrayInputStream(data)) {
            int n;
            while ((n = input.read()) != -1) {
                System.out.println((char)n); // 注意,输出字符串要把Unicode转换为Char类型

Outputstream

  1. InputStream一样,上述代码没有考虑到在发生异常的情况下如何正确地关闭资源。写入过程也会经常发生IO错误,例如,磁盘已满,无权限写入等等。我们需要用try(resource)来保证OutputStream在无论是否发生IO错误的时候都能够正确地关闭:
 try (OutputStream output = new FileOutputStream("out/readme.txt")) {
        output.write("Hello".getBytes("UTF-8")); // Hello
    } // 编译器在此自动为我们写入finally并调用close()

2.OutputStream实现类
注意点 
1)对象是ByteArrayOutputStream,非如input中的Fileoutputstream
2)通过toByteArray();方法返回数组
3)输出打印,直接通过String(byte[],charset)方法创建新对象
        byte[] buffer = new byte[100];
        try(ByteArrayOutputStream output = new ByteArrayOutputStream()) {
            output.write("Hello".getBytes(StandardCharsets.UTF_8));
            output.write(" Alex".getBytes("UTF-8"));
            buffer = output.toByteArray();
        }
        System.out.println(buffer[0]);
        System.out.println(new String(buffer,"UTF-8"));

Reader

InputStream Reader
字节流,以byte为单位 字符流,以char为单位
读取字节(-1,0~255):int read() 读取字符(-1,0~65535):int read()
读到字节数组:int read(byte[] b) 读到字符数组:int read(char[] c)

1. 常见用法
try (Reader reader = new FileReader("src/readme.txt", StandardCharsets.UTF_8) {
    // TODO
}、、如果我们读取一个纯ASCII编码的文本文件,上述代码工作是没有问题的。但如果文件中包含中文,就会出现乱码,因为FileReader默认的编码与系统相关,例如,Windows系统的默认编码可能是GBK,打开一个UTF-8编码的文本文件就会出现乱码。要避免乱码问题,我们需要在创建FileReader时指定编码

2. 模拟测试Reader:
1)CharArrayReader可以在内存中模拟一个Reader,它的作用实际上是把一个char[]数组变成一个Reader,这和ByteArrayInputStream非常类似:
try (Reader reader = new CharArrayReader("Hello".toCharArray())) {}
2)StringReader可以直接把String作为数据源,它和CharArrayReader几乎一样:
try (Reader reader = new StringReader("Hello")) {}

3. Inputstream转换Reader:InputStreamReader就是这样一个转换器,它可以把任何InputStream转换为Reader。示例代码如下:
// 持有InputStream:
InputStream input = new FileInputStream("src/readme.txt");
// 变换为Reader:
Reader reader = new InputStreamReader(input, "UTF-8");
或者一步到位:
try (Reader reader = new InputStreamReader(new FileInputStream("src/readme.txt"), "UTF-8")) {
    // TODO:
}

使用Files读写

如果是文本文件,可以把一个文件的全部内容读取为String:
1) 读文本
// 默认使用UTF-8编码读取:
String content1 = Files.readString(Paths.get("/path/to/file.txt"));
// 可指定编码:
String content2 = Files.readString(Paths.get("/path/to/file.txt"), StandardCharsets.ISO_8859_1);
// 按行读取并返回每行内容:
List lines = Files.readAllLines(Paths.get("/path/to/file.txt"));
写入文件也非常方便:

2) 写入二进制文件:
byte[] data = ...
Files.write(Paths.get("/path/to/file.txt"), data);
// 写入文本并指定编码:
Files.writeString(Paths.get("/path/to/file.txt"), "文本内容...", StandardCharsets.ISO_8859_1);
// 按行写入文本:
List lines = ...
Files.write(Paths.get("/path/to/file.txt"), lines);

你可能感兴趣的:(Java入门 3. IO笔记)