Java IO

JavaIO中的File类用于表示文件或目录路径。它有多种构造方法,如根据字符串或File对象创建。File提供了检查文件/目录存在、创建新文件/目录、删除文件/目录的方法。此外,还可通过list()和listFiles()遍历文件夹内容。对于文件的读写,有FileInputStream和FileOutputStream进行字节流操作,以及FileReader和FileWriter处理字符流。

Java IO

File

  • File对象就表示一个路径 可以是文件的路径 也可以是文件夹的路径

  • 这个路径可以是存在的 也可以是不存在的

构造方法

方法名称说明
public File(String pathname)根据指定的字符串为路径创建File对象
public File(String parent,String child)根据指定的父级路径与子路径创建对象
public File(File parent,String child)根据指定的File对象为父级路径,字符串为子级路径创建File对象
# C:\Program Files\Common Files\DESIGNER\MSADDNDR.OLB
# 父级路径: C:\Program Files\Common Files\DESIGNER
# 子级路径: MSADDNDR.OLB
# 以磁盘开头的路径是绝对路径 从磁盘根开始找  C:\...
# 其他的路径为相对路径 从当前项目找   xx\xx...

查询文件

方法名称说明
public boolean exists()判断当前路径是否存在
public boolean isFile()判断当前路径是否为文件
public boolean isDirectory()判断当前路径是否为为文件夹
public long length()返回文件的字节数
public String getAbsolutPath()返回文件的绝对路径
public String getPath()返回定义文件时使用的路径
public String getName()返回文件名称 带后缀
public class Main {
    public static void main(String[] args) {
        File f=new File("C:\\Program Files\\Common Files\\DESIGNER");

        System.out.println(f.exists()); // true
        System.out.println(f.isFile()); // false
        System.out.println(f.isDirectory()); // true
    }
}

增删文件

方法名称说明
public boolean createNewFile()创建一个空文件
public boolean mkdir()创建一个空文件夹
public boolean mkdirs()递归创建一个空文件夹
public boolean delete()删除文件、空文件夹

createNewFile

public class Main {
    public static void main(String[] args) throws IOException {
        // 只有当父级路径存在时并且当前路径没有重名文件时  才会创建成功
        // 创建成功返回 true
        // 创建失败返回 false
        File f=new File("C:\\Users\\Guohy\\Desktop\\IOtest\\a.txt");
        
        f.createNewFile();
    }
}

mkdir

public class Main {
    public static void main(String[] args) throws IOException {
        // 只有当父级路径存在时并且当前路径没有重名文件时  才会创建成功
        // 创建成功返回 true
        // 创建失败返回 false
        File f=new File("C:\\Users\\Guohy\\Desktop\\IOtest\\aaa");

        f.mkdir();
    }
}

mkdirs

public class Main {
    public static void main(String[] args) throws IOException {
        // 如果父级路径不存在 则从头开始找 从存在的路径开始 递归创建多级文件夹
        // 创建成功返回 true
        // 创建失败返回 false
        File f=new File("C:\\Users\\Guohy\\Desktop\\IOtest\\aaa\\bbb");

        f.mkdir();
    }
}

delete

public class Main {
    public static void main(String[] args) throws IOException {
        // 只有当前路径是 空文件夹 或者是 文件 时才能删除
        // 创建成功返回 true
        // 创建失败返回 false
        File f=new File("C:\\Users\\Guohy\\Desktop\\IOtest\\a.txt");

        f.delete();
    }
}

遍历文件夹

方法名称说明
public static File[] listRoots()列出可用系统根
public String[] list()获取当前路径下所有内容
public String[] list(FilenameFilter filter)利用文件名过滤器获取当前该路径下所有内容
public File[] listFiles()获取当前路径下所有内容
public File[] listFiles(FilenameFilter filter)利用文件名过滤器获取当前该路径下所有内容

Filelist

public class Main {
    public static void main(String[] args) throws IOException {
        File f = new File("C:\\Users\\Guohy\\Desktop\\IOtest");
        File[] fs = f.listFiles();
        for (File i : fs) {
            System.out.println(i);
        }
    }
}
// 输出结果
/*
C:\Users\Guohy\Desktop\IOtest\aaa.txt
C:\Users\Guohy\Desktop\IOtest\bbb.txt
C:\Users\Guohy\Desktop\IOtest\ccc.txt
C:\Users\Guohy\Desktop\IOtest\ddd.txt
*/

输出指定路径下的所有文件信息

public class Main {
    static void find(File f) {
        File[] fs = f.listFiles();
        System.out.println(f.getAbsolutePath());
        if (fs == null || fs.length == 0) return;
        for (File i : fs) find(i);
    }

    public static void main(String[] args) throws IOException {
        File f = new File("C:\\Users\\Guohy\\Desktop");
        find(f);
    }
}

IO流

  • 用于读取文件中的数据 (可以读写文件 或网络中的数据)
  • 创建字节流文件对象使用之后一定要使用close()方法关闭流 否则可能会发生内存泄露
  • 流的方向
    • 输入流 (从文件中获取数据)
    • 输出流 (输出数据到文件中)
  • 操作文件方式
    • 字节流 (一次只 输入|输出 一个字节)
    • 字符流 (根据编码方式 输入|输出 一个字节)
  • 字节流能够操作所有类型的文件 字符流只能操作文本文件

字节输出流 FileOutputStream

构造方法
方法名说明
FileOutputStream(File file,boolean append)以指定的File对象创建输入流
FileOutputStream(Stiing file,boolean append)以指定的字符串为路径创建输入流
  • 第二个参数为续写开关 如果为 true,则不清空文件 默认为false
常用方法
方法名说明
public void write(int b)将指定的字节写入文件
public void write(byte[] b)b.length个字节从指定的字节数组写入此文件
public void write(byte[] b, int off, int len)从下标off开始写入len个字节到此文件
public void close()关闭此文件输出流并释放与此流相关联的任何系统资源
public class Main {
    public static void main(String[] args) throws IOException {
        // 创建对象
        // 如果父级路径存在 子路径不存在 会创建文件
        // 如果父级路径也不存在 则程序终止
        FileOutputStream f = new FileOutputStream("a.txt");
        // 第二个参数不写 默认为false(清空文件信息) 
		
        f.write(97);
        f.write(98);
        f.write(99);
        f.write(100);
        f.write(101);
        f.write(102);
		

        // 关闭文件 防止内存溢出
        f.close();
    }
}
// 文件内容为: abcdef
// 97 ASCII码 -> a

字节输入流 FileInputStream

构造方法
方法名说明
FileInputStream(File file)以指定的File对象创建输入流
FileInputStream(String file)以指定的字符串为路径创建输入流

如果路径不存在 直接程序终止

常用方法
方法名说明
public int read()从该输入流读取一个字节的数据
public int read(byte[] b)从该输入流读取最多 b.length个字节的数据为字节数组
public int read(byte[] b, int off, int len)以下标off开始 从文件中最多读取len个字节到字节数组
public void close()关闭此文件输入流并释放与此流相关联的任何系统资源
// 输出自己
public class Main {
    public static void main(String[] args) throws IOException {
        // 创建对象
        FileInputStream f = new FileInputStream("src/Main.java");

        while (true) {
            int i = f.read();
            // 如果读取到文件末尾 方法会返回-1
            if (i == -1) break;
            System.out.print((char) i);
        }

        f.close();
    }
}
  • 字节流只能操作单个字节 汉字在内存中是多个字节 所以字节流不能读取汉字
  • 字符流会根据编码一次取一个或多个字符

字符输出流 FileWriter

构造方法
方法名说明
FileWriter(File file, boolean append)以指定的File对象创建输入流
FileWriter(String fileName, boolean append)以指定的字符串为路径创建输入流
常用方法
方法名说明
public void write(String str)把数据写入缓冲区
public void flush()刷新缓冲区 将缓冲区的数据刷新到本地文件中
public void close()刷新缓冲区 并且关流
public class Main {
    public static void main(String[] args) throws IOException {
        // 创建对象 开启续写
        FileWriter f = new FileWriter("a.txt",true);

        // 把字符串写入对象
        // write在底层会创建一个字符数组当作缓冲区 write的参数会被放进数组
        // 缓冲区填满或者手动刷新缓冲区 才会把数据写入文件中
        f.write("sd");
        
        // 刷新缓冲区 关闭流
        f.close();
    }
}

字符输入流 FileReader

构造方法
方法名说明
FileReader(File file)以指定的File对象创建输入流
FileReader(String fileName)以指定的字符串为路径创建输入流
常用方法
方法名说明
public int read()读取一个字符
public int read(char[] cbuf)从该输入流读取最多 cbuf.length个字符到数组
public void close()关闭流
03-21
<think>好的,我现在需要处理用户关于Java IO的问题。用户希望了解Java IO的概念或者解决相关问题,特别是询问教程和故障排除的方法。首先,我得回顾一下Java IO的基础知识,确保自己理解正确,然后组织回答的结构。 首先,Java IO主要涉及输入输出流,用于处理数据的读写。核心包是java.io,里面有很多类,比如File、InputStream、OutputStream、Reader、Writer等。用户可能需要知道这些类的层次结构和使用方法。 接下来,常见的IO操作包括文件读写、网络通信、序列化等。比如,FileInputStream和FileOutputStream用于字节流,而FileReader和FileWriter用于字符流。缓冲流(BufferedInputStream等)可以提高效率,这部分应该提到。 然后,异常处理是Java IO中很重要的一部分,比如IOException,需要正确处理try-with-resources来自动关闭流,避免资源泄漏。这部分用户可能在故障排除时会遇到问题,比如未正确关闭流导致文件锁定或资源耗尽。 关于教程,Oracle的官方文档是权威资源,应该引用。比如引用[3]提到了JSP的信息,但用户需要的是IO的教程,可能需要检查是否有其他引用相关。不过用户给出的引用中,引用[1]是关于JDK 7的故障排除工具,可能和调试IO问题相关,比如使用jdb进行调试。引用[5]提到字节码信息,可能和IO关系不大,但故障排除时可能需要查看异常堆栈,这可能涉及字节码或类加载的问题。 对于故障排除,常见问题包括文件路径错误、权限问题、字符编码不一致导致的乱码,或者流未正确关闭。比如,文件找不到可能是因为相对路径的当前工作目录与预期不符,或者文件被其他进程占用。这时候需要检查路径是否正确,是否有读取权限,使用绝对路径测试,或者使用工具如Process Explorer查看文件句柄。 此外,NIO(New IO)在Java 1.4引入,提供了非阻塞IO和通道等高效处理方式,用户可能也需要了解NIO和传统IO的区别,比如使用Channel和Buffer的方式,或者使用Files类简化操作。 在组织回答时,需要分步骤讲解,比如先介绍核心概念,然后常见操作,接着是故障排除技巧,最后提供学习资源和相关工具。同时,生成的问题要围绕Java IO的进一步学习,比如NIO、性能优化、常见异常处理等。 需要确保回答中的LaTeX格式正确,比如类名和方法名可能需要用代码块,而数学表达式则用$...$。例如,文件路径的转义可能需要讨论,比如在字符串中使用反斜杠需要转义,写成`"C:\\\\path\\\\to\\\\file"`,但这里可能不需要数学表达式,所以可能不需要用到LaTeX的公式部分。 检查用户提供的引用,是否有与IO相关的资源。引用[4]是关于安卓USB驱动的,可能不相关。引用[2]关于反射,可能也不直接相关,但故障排除时可能会用到反射来检查类路径或资源加载,这可能间接相关,但可能不需要特别提到。 总结回答结构: 1. Java IO核心概念:流、字节流与字符流、缓冲流、NIO。 2. 常见操作:文件读写示例代码。 3. 故障排除:常见问题及解决方法,如路径、权限、编码、资源泄漏。 4. 学习资源:官方教程、工具(如jdb)。 5. 相关问题:如何选择IO和NIO,处理大文件,字符编码问题,关闭资源方法,常见异常处理。 需要确保回答中的引用正确,比如引用[1]关于JDK工具,可能在故障排除时使用jdb或者jstack等工具分析问题,可以提到。引用[3]的链接虽然是JSP,但Oracle的Java EE教程可能包含IO相关内容,需要检查链接是否有效,但用户提供的链接可能已失效,需要注意。不过用户给出的引用可能有误,比如引用[3]的网址是javaee.github.io,可能是正确的,但需要确认是否有IO相关部分。 最后,代码示例需要正确,比如使用try-with-resources来读取文件,展示正确的异常处理方式。同时,确保所有技术术语准确,例如InputStreamReader处理字符编码,BufferedReader提高读取效率。 可能的问题点:用户提供的引用中是否有直接关于Java IO的内容?引用[1]提到JDK工具,可以用于调试IO问题,比如使用jdb调试应用程序,或者在出现IO异常时分析线程状态。引用[5]关于字节码信息,可能与IO问题关系不大,但类加载时找不到资源文件可能会涉及,需要看具体情况。 因此,在故障排除部分,可以建议使用JDK工具如jstack检查是否有线程阻塞在IO操作,或者使用jdb进行调试,引用[1]。同时,处理资源泄漏时,可以使用try-with-resources来自动关闭流,这是Java 7的特性,可能需要提到。 综上所述,回答的结构应该是先介绍核心概念,然后示例代码,接着故障排除步骤,引用相关资源,最后生成相关问题。</think>### Java IO 概念与问题排查指南 #### 一、核心概念 Java IO(输入输出)用于处理数据读写,核心包为 `java.io`,主要分为两类: 1. **字节流**:处理二进制数据,基类为 `InputStream` 和 `OutputStream`,例如 `FileInputStream` 和 `BufferedOutputStream`。 2. **字符流**:处理文本数据,基类为 `Reader` 和 `Writer`,例如 `FileReader` 和 `BufferedWriter`。 3. **NIO(New IO)**:Java 1.4 引入,通过 `Channel` 和 `Buffer` 实现高效非阻塞操作,例如 `Files.readAllLines()`[^1]。 #### 二、常见操作示例 1. **文件读取(字符流)**: ```java try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } ``` 2. **文件写入(字节流)**: ```java try (OutputStream out = new BufferedOutputStream(new FileOutputStream("output.dat"))) { out.write("Hello".getBytes()); } catch (IOException e) { e.printStackTrace(); } ``` #### 三、故障排查技巧 1. **文件路径问题** - 使用绝对路径或检查工作目录:`System.getProperty("user.dir")`。 - 路径分隔符兼容性:使用 `File.separator` 替代硬编码的 `/` 或 `\`。 2. **权限与资源占用** - 确认文件可读/写:`file.canRead()` 和 `file.canWrite()`。 - 确保流正确关闭:使用 **try-with-resources**(Java 7+)避免资源泄漏。 3. **字符编码问题** - 指定编码格式:例如 `new InputStreamReader(new FileInputStream("file.txt"), StandardCharsets.UTF_8)`。 4. **调试工具** - 使用 `jdb`(Java Debugger)追踪 IO 异常堆栈[^1]。 - 通过 `jstack` 分析线程阻塞(如网络 IO 超时)。 #### 四、学习资源 1. **官方教程** - [Oracle Java IO 教程](https://docs.oracle.com/javase/tutorial/essential/io/)(涵盖基础与 NIO)。 2. **进阶内容** - Java NIO.2(Java 7+)的 `Path` 和 `Files` 类[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值